Ближайший поиск по массиву

Corvin

Новичок
Ближайший поиск по массиву

Есть 2 массива:

main_array = [128 => 100, 200 => 200, 320 => 150, 180 => 200, 350 => 100];

задается 2 числа x=250; y=400 , которые не соответсвуют ни одному из таблицы значению, нужно найти ближайшие 2 значения заданным.
 

neko

tеam neko
это комплексный критерий или надо найти ближайшие 2 к первому и ближ. 2 ко второму?

-~{}~ 10.08.04 17:41:

и вообще непонятно что с чем предлагается сравнивать
 

Фанат

oncle terrible
Команда форума
оевидно, задача сводится к поиску ближайшего.
а два числа - от неумения абстрагировать задачу.
 

azamat

Guest
а где 2 массива? и вообще разговор о точках?
 

Corvin

Новичок
нужно чтобы оба числа были ближайшими по значению. Может быть массив нужно разбить на 2 или создать его по другому?

в данной записи получается так:
main_array = [x1 => y1, x2 => y2, x3 => y3, x4 => y4, x5 => y5];

соответсвенно нужно найти 2 связанных числа наиболее близких по значению для заданных "x" и "y", отвечающие значению "<" либо "=" для обоих чисел.
 

neko

tеam neko
реши это в частном случая, а то непонятно о чем речь
 

iliah

Новичок
если мне не изменяет память - расстояние м/у 2-мя т. считай по формуле (x2-x1)2 + (y2 - y1)2, проходи по массиву и считай

ps: ну это если все-таки точки
 

azamat

Guest
ну и пробегайся по массиву, выбирай пары ключ-значение, вычисляй
min (x1-x2)+(y1-y2)

он не сказал что это точки, но если так, то конечно формула декартового расстояния, только корень из всей формулы

корень((x1-x2)2+(y1-y2)2)
 

iliah

Новичок
ага, корень запямятовал, :), но в подобном случае случае его можно не считать

(т.е. если a > b => sqrt(a) > sqrt(b))
 

azamat

Guest
согласен, но раз все таки точки :) , только автор что то замолчал
 

Corvin

Новичок
это не точки это размеры поля: ширина, высота. И ширина должна быть "<" либо "=" и высота "<" либо "=" .


Пример:
main_array = [128 => 100, 200 => 200, 320 => 150, 180 => 200, 350 => 100];

$x=135;
$y=100;
ближайшее значение 180 => 200


$x=320;
$y=101;
ближайшее значение 320 => 150

и т.д.
 

iliah

Новичок
какая нафиг разница? будешь значит таскать по итерациям не одну, а две переменных (или если хочется массив) и все так же сравнивать

хм, зачем две? по-прежнему одну - сумму разниц
 

Corvin

Новичок
Автор оригинала: iliah
какая нафиг разница? будешь значит таскать по итерациям не одну, а две переменных (или если хочется массив) и все так же сравнивать
Как? В этом и был вопрос.

хм, зачем две? по-прежнему одну - сумму разниц
потому как в масиве могут быть значения и такие:

main_array = [800 => 20, 100 => 700, 320 => 10, 40 => 300, 350 => 100];

поэтому сумма то и не катит ни как.
 

iliah

Новичок
> main_array = [800 => 20, 100 => 700, 320 => 10, 40 => 300, 350 => 100];

ну не очень удачный тест

возьмем лучше этот - main_array = [128 => 100, 200 => 200, 320 => 150, 180 => 200, 350 => 100];

и $x=135;
$y=100;
1) проходим мимо
2) сумма разниц - 165, запомнили ее
3) 235
4) 145 - меняем с 165
5) 215

чем не устраивает такой вариант?

-~{}~ 10.08.04 19:35:

? может в задаче требуется вписать прямоугольник наибольшей площади, тогда площадь считай, еще проще
 

Corvin

Новичок
Автор оригинала: iliah
> main_array = [800 => 20, 100 => 700, 320 => 10, 40 => 300, 350 => 100];

ну не очень удачный тест
Чем же он не очень удачный ?
возьмем лучше этот - main_array = [128 => 100, 200 => 200, 320 => 150, 180 => 200, 350 => 100];

и $x=135;
$y=100;
1) проходим мимо
2) сумма разниц - 165, запомнили ее
3) 235
4) 145 - меняем с 165
5) 215

чем не устраивает такой вариант?
что запоминаем, делаем.. какая сумма разниц ? не понятно абсолютно

-~{}~ 10.08.04 19:35:

? может в задаче требуется вписать прямоугольник наибольшей площади, тогда площадь считай, еще проще
Именно что прямоугольник!, а не квадрат, поэтому даже если площадь меньше - не факт, что впишется.
 
Сверху