Nano Hash - криптовалюты, майнинг, программирование

Внешняя сортировка с кучей?

У меня есть файл с большим объемом данных, и я хочу отсортировать его, удерживая в памяти только часть данных в любой момент времени.

Я заметил, что сортировка слиянием популярна для внешней сортировки, но мне интересно, можно ли это сделать с кучей (минимум или максимум). В основном моя цель - получить верхние (с использованием произвольных чисел) 10 элементов в списке из 100 элементов, никогда не удерживая в памяти более 10 элементов.

В основном я понимаю кучи и понимаю, что куча данных поместит их в соответствующий порядок, из которого я мог бы просто взять последнюю часть в качестве своего решения, но я не могу понять, как это сделать без ввода-вывода за каждый чертов предмет.

Идеи?

Спасибо! :D


  • Почему бы просто не использовать мягкий буфер? Поиск первых 10 из 1 миллиона записей с ограничением памяти в 1000 элементов может быть выполнен примерно за 1000 операций ввода-вывода, при этом никогда не должно быть более 1000 элементов в памяти. Если вы ограничиваете себя 10 элементами в памяти, проблема невозможна — вам нужно ограничение не менее 11. 16.05.2013

Ответы:


1

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

Однако вы можете использовать разновидность сортировки слиянием, в которой каждый элемент кучи представляет собой отсортированный список. Размер списков определяется тем, сколько вы хотите сохранить в памяти. Вы создаете эти списки из входного файла с помощью загрузки фрагментов данных, их сортировки и последующей записи во временный файл. Затем вы обрабатываете каждый файл как один список, читаете первый элемент и создаете из него кучу. При удалении верхнего элемента вы удаляете его из списка и при необходимости восстанавливаете состояние кучи.

Однако есть один аспект, который делает эти факты о сортировке неуместными: вы говорите, что хотите определить первые 10 элементов. Для этого вы действительно можете использовать кучу в памяти. Просто возьмите элемент из файла, поместите его в кучу и, если размер кучи превышает 10, удалите самый младший элемент. Чтобы сделать его более эффективным, поместите его в кучу только в том случае, если размер меньше 10 или выше самого нижнего элемента, который вы затем заменяете и повторно кучаете. Хранение первой десятки в куче позволяет вам просканировать файл только один раз, все остальное будет сделано в памяти. Использование двоичного дерева вместо кучи также будет работать и, вероятно, будет таким же быстрым, для небольшого числа, такого как 10, вы даже можете использовать массив и пузырьковую сортировку элементов на месте.

Примечание. Я предполагаю, что 10 и 100 были просто примерами. Если ваши цифры действительно настолько малы, любые обсуждения эффективности, вероятно, спорны, если только вы не выполняете эту операцию несколько раз в секунду.

16.05.2013

2

Да, вы можете использовать кучу для поиска элементов top-k в большом файле, удерживая в памяти только кучу + буфер ввода-вывода.

Следующее будет получать элементы min-k, используя максимальную кучу длины k. Вы можете читать файл последовательно, выполняя ввод-вывод для каждого элемента, но обычно намного быстрее загружать данные блоками во вспомогательный буфер длиной b. Метод выполняется в O(n*log(k)) операциях с использованием O(k + b) пространства.

while (file not empty)

    read block from file

    for (i = all items in block)
        if (heap.count() < k)
            heap.push(item[i])
        else
        if (item[i] < heap.root())
            heap.pop_root()
            heap.push(item[i])
        endif
    endfor

endwhile
16.05.2013

3

Кучи требуют много непоследовательного доступа. Сортировка слиянием отлично подходит для внешней сортировки, потому что она выполняет много последовательного доступа.

Последовательный доступ намного быстрее на вращающихся дисках, потому что головке не нужно двигаться. Последовательный доступ, вероятно, также будет чертовски быстрее на твердотельных дисках, чем доступ по пирамидальной сортировке, потому что они выполняют доступ в блоках, которые, вероятно, значительно больше, чем одна вещь в вашем файле.

16.05.2013

4

Используя сортировку слиянием и передавая два значения reference вам нужно только удерживать два значения сравнения в буфере и перемещаться по массиву, пока он не будет отсортирован на месте.

16.05.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..