Привет всем! Ребята подскажите правильно ли я мыслю или можно куда быстрее решить задачу? Есть массив от 1 до 1000000. В этом массиве все числа уникальные, кроме одного числа, которое повторяется два раза. Найти это число. Решить эту задачу с минимальным использованием процессорного времени. Мой вариант: Код (Text): <?php for ($i = 1; $i <= 100000; $i++) { $array[$i] = $i; } $array[$i+1] = 8; define("START_TIMER", microtime(true)); $numberlist_new = array_count_values ($array); foreach($numberlist_new as $k => $v) { if ($v > 1) { echo "Мы нашли повторяющееся число: <b>$k</b></br>\n"; } } printf("Время работы скрипта: %.5f с", microtime(true)-START_TIMER); ?> Время работы скрипта: 0.03120 сек. Добавлено спустя 3 минуты 13 секунд: Кстати памяти не хватает на массив 10 (6). Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
Так поищи алгоритмы для поиска дублей в массивах, почитай какие есть функции для работы с массивами в php, увеличь память если не хватает.
Ну то, что я придумал - я написал выше. А увеличивать запас ОЗУ не хотелось бы, т.к в будущем можно обезопасить себя от возникновения подобной проблемы.
Но ты поискал сам в поиске какие ещё бывают алгоритмы и подходы? Чтобы снизить потребление ОЗУ, можно частями проверять массив, почитай про фильтр блума, возможно поможет
Я уже второй день читаю, кто-то предлагает для работы с большими массивами метод битовых карт, кто-то метод сравнения. Много похожих задач в нете. С некоторыми решениями я крайне не согласен, некторые алгоритмы, которые мне удалось найти - работаю медленнее моего. Хотя при 10 * в 6 степени мой тоже уступать стал одному из вариантов.
Код (PHP): <?php $input = array('1', '2', '3', '4', '5', '6', '7', '7',); $array_counts = array_count_values($input); $flip = array_flip($array_counts); foreach ($flip as $key => $value) { if ($key > 1) { echo "duplicate: ".$value; } } ?>
Я в своем примере тоже использую array_count_values. Но при n=1000000 , вот эта функция быстрее рабтает : Код (Text): function search_deplicate($array) { $hash = array(); foreach ($array as $val) { if (isset($hash[$val])) { return $val; } $hash[$val] = true; } return null; } Добавлено спустя 5 минут 31 секунду: Ваш вариант, крут 0.30160 с Добавлено спустя 10 минут 18 секунд: Спасибо за помощь!!!
Нет. Это просто задачка такая, которую нужно решить с минимальным использованием процессорного времени.