Подскажите алгоритм поиска ближайших значений массива по отношению к заданному. Тоесть есть массив Код (Text): for ($x=0;$x<=99;$x++) { $arr[]=rand(1,100); } и значение допустим 50 и надо найти элемент массива к значению которого эта переменная максимально близка.
Что тут тупить то? PHP: <?php $arr = array(); for ($x = 10; $x--;) { $arr[] = rand(1,100); } function searchNearest ($value, $inArray) { $lastKey = null; $lastDif = null; foreach ($inArray as $k => $v) { if ($v == $value) { return $k; } $dif = abs ($value - $v); if (is_null($lastKey) || $dif < $lastDif) { $lastKey = $k; $lastDif = $dif; } } return $lastKey; } echo searchNearest(40, $arr), "\n"; asort($arr); print_r($arr); ?> Код (Text): 2 Array ( [5] => 17 [1] => 21 [4] => 30 [2] => 43 [8] => 49 [7] => 65 [0] => 76 [6] => 92 [9] => 97 [3] => 100 ) Код (Text): 8 Array ( [9] => 1 [6] => 5 [3] => 11 [1] => 24 [8] => 53 [0] => 70 [7] => 72 [5] => 81 [4] => 84 [2] => 90 ) возвращает ключ массива, по которому ближайшее значение
PHP: <?php $arr = array(); for ($x=0;$x<=29;$x++) { $arr[]=rand(1,100); } print_r($arr); $e = 50; $i = 0; $val = $arr[0]; $z = abs($val-$e); foreach ($arr as $k => $v) { $new = abs($v-$e); if ($new<$z) { $i = $k; $val = $v; $z = $new; } } echo "<br><br>poisk {$e} = index element {$i}, value {$val}";
если массив отсортирован, то из массива длиной в 1'000'000 элементов достаточно получить 20 значений - это естественно. Но мы берем совершенно случайный массив ведь. sylex, спс
TheShock Дык я о чем и говорю может быстрей отсортировать и найти? Ну смотря какого размера массив и какие там данные...
Нету смысла. Мой алгоритм быстрее сортировки: PHP: <?php $arr = array(); for ($x = 150000; $x--;) { $arr[] = mt_rand(1,1000000); } function searchNearest ($value, $inArray) { $lastKey = null; $lastDif = null; foreach ($inArray as $k => $v) { if ($v == $value) { return $k; } $dif = abs ($value - $v); if (is_null($lastKey) || $dif < $lastDif) { $lastKey = $k; $lastDif = $dif; } } return $lastKey; } echo 'length : ' , count($arr) , "\n"; // Searching key $s = microtime(1); echo 'key : ', searchNearest(40, $arr), "\n"; echo 'key search : ', (microtime(1) - $s), "\n"; // Sorting array $s = microtime(1); asort($arr); echo 'array sort : ', (microtime(1) - $s), "\n"; ?> Код (Text): $ php -f searchNearest.php length : 150000 key : 37331 key search : 0.189264059067 array sort : 0.320148944855 $ php -f searchNearest.php length : 150000 key : 38737 key search : 0.189424991608 array sort : 0.31040596962 $ php -f searchNearest.php length : 150000 key : 148977 key search : 0.233227014542 array sort : 0.339351892471 $ php -f searchNearest.php length : 150000 key : 42178 key search : 0.215394973755 array sort : 0.318609952927 $ php -f searchNearest.php length : 150000 key : 136615 key search : 0.19428396225 array sort : 0.314887046814
TheShock относительно меня ты становишься менее линивым. Я тоже раньше не мог удержаться, а сейчас лень.