Я задал вопрос, прежде чем создавать перетасованный диапазон - вместо того, чтобы генерировать список чисел, а затем перетасовывать их, мне нужна функция, которая могла итеративно возвращать список перетасованных чисел без памяти O (n) Стоимость:
Generating shuffled range using a PRNG rather than shuffling
Если вы создаете какой-то индекс для файла на диске, то вы можете создать перемешиваются версию без оплаты стоимости памяти, которая может быть важна для очень больших файлов. Для индекса я предлагаю что-то простое, как плоский поток позиций (в виде 32 или 64-битных целых чисел) для каждой строки. Таким образом, чтобы извлечь N-ю строку из текстового файла, вы можете просто искать в индексном потоке N * 4 (или N * 8 для 64-разрядных индексов), чтобы обнаружить смещение начала строки, а затем искать эту позицию в текстовом файловом потоке и зачитать строку.
Используя этот подход, вы можете перемешать чрезвычайно большие файлы, не оплачивая затраты на память. Разумеется, перетасовка будет означать извлечение строк в случайном порядке из исходного файла, что не будет столь же эффективным, как сортировка в памяти, если файл не очень маленький (подходит в кеше почти при первом доступе) или очень большой (в этом случае сбой памяти будет хуже, чем случайные запросы), или, возможно, если вы не используете механический жесткий диск (например, SSD).
Для вашей ситуации 10K действительно не так много.Что-то в области 10 миллионов строк, возможно, попадая в несколько гигабайт текста (в зависимости от длины строки, конечно), будет намного сложнее, и именно там этот подход (или что-то подобное) понадобится в 32-битном.
Wow благодарит за код svein! Я использую обмен, но я только что изменил свою проблему - строки переданы моей процедуре shuffeling из Memo - и, очевидно, с каждым обновлением Memo должна обновить 10 000 визуальных элементов! Теперь я использую посредника AstrinList, сортирую его, а затем назначаю его обратно в памятку: aStringLIst: = TStringList.Create; aStringList.Assign (mNumbers.Lines); Shuffle (aStringList); mNumbers.Lines.Assign (aStringList); aStringList.Free; Это мгновение! Большое спасибо –
Ничего себе, комментарии действительно испортили мой код, извините, что вы можете это исправить. –
Нет проблем, я могу это прочитать :-) –