Intereting Posts
Рекурсивно гидратируйте все связанные объекты в Propel Как включить mod_rewrite в LAMP на ubuntu? Изменение названия страницы корзины в Magento Получить первый абзац статьи в Википедии MySQL: объединение запросов через несколько баз данных, расположенных на разных серверах В PHP почему мои переменные сеанса сохраняются в качестве ссылок? как делить строку, хранящуюся в базе данных myadmin, и искать слово из этой строки в любой последовательности? Как установить PHP mbstring на CentOS 6.2 PHP php_network_getaddresses: getaddrinfo не удалось: такой хост не известен Еореп (); «Удаленный доступ к файлу хоста не принят» в локальном файле? Новый токен CSRF за запрос или NOT? Получить URL-адрес из URL-адреса страницы Проверьте, существует ли столбец в таблице Mysql через php Как читать файл в PHP, а затем записывать только некоторые строки в другой файл Как изменить текст, проанализированный с помощью PHP Simple HTML DOM Parser?

альтернативы php in_array для больших массивов для избежания записей дубликатов

Мне нужно создать большой список случайных чисел от 600 к 2000 тыс., Но список не может иметь дубликатов.

Моя текущая «реализация» выглядит так:

<?php header('Content-type: text/plain'); $startTime = microtime(true); $used = array(); for ($i=0; $i < 600000; ) { $random = mt_rand(); //if (!in_array($random, $used)) { $used[] = $random; $i++; //} } $endTime = microtime(true); $runningTime = $endTime - $startTime; echo 'Running Time: ' . $runningTime; //print_r($used); ?> 

Если я хочу, чтобы тест in_array прокомментировал, время обработки составляет около 1 секунды, поэтому вызовы mt_rand и заполнение used массива относительно «дешевы», но когда я раскомментирую тест in_array, возникают плохие вещи! (Я просто жду – это было более 10 минут – для завершения сценария …)

Поэтому я ищу альтернативы либо на стороне обнаружения дубликатов, либо в части генерации (как я могу генерировать случайные числа без риска получения дубликатов)

Я открыт для любого предложения.

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

 $used = array(); for ($i = 0; $i < 600000; ) { $random = mt_rand(); if (!isset($used[$random])) { $used[$random] = $random; $i++; } } $used = array_values($used); 

in_array требует поиска всего массива в худшем случае, что означает линейные затраты ( O ( n )). Но используя ключ массива как-ну – ключ, затраты постоянны ( O (1)), так как затраты на доступ к массиву всегда постоянны.

Например, вы можете сделать что-то подобное

 $random = mt_rand(); $array = range($random, $random + 600000); $array = shuffle($array); 

Это создало бы массив, который сначала в порядке, но затем он перемещает массив, поэтому значения будут случайными. Никаких столкновений! : D

Если вы все равно зацикливаете, и если вам не нужно больше 600000, почему бы вам вообще их проверить, почему бы просто не добавить $ i к $ random. сделанный. не достаточно случайный?

 for ($i = 0; $i < 600000; $i++) { $yourArray[] = mt_rand() . $i; } 

Кроме того, существует массив array_unique, который удаляет повторяющиеся значения из массива.