Сортировка не более 10 миллионов 7-значных чисел.ограничения: 1M RAM, высокая скорость.несколько секунд это хорошо - PullRequest
3 голосов
/ 21 февраля 2011

Сортировка не более 10 миллионов 7-значных чисел. ограничения: 1M RAM, высокая скорость. несколько секунд это хорошо.

[Редактировать: из комментария спрашивающего: входные значения различны]

Использование растровой структуры данных - хорошее решение этой проблемы.

Это означает, что мне нужна строка длиной не более 10 миллионов фунтов. Так достаточно ли оперативки для этого? запутался здесь. Спасибо

Ответы [ 2 ]

10 голосов
/ 21 февраля 2011

Итак, в 1 МБ ~ 8 000 000 битов, но если у вас есть произвольные 7-значные числа (до 9 999 999), использование вектора битов для сортировки не будет работать. Точно так же это не будет работать, если некоторые числа могут повторяться, потому что вы можете хранить только {0,1} в битовом векторе.

Но, предположив (что, я думаю, ваша проблема задает), что у вас есть последовательность целых чисел от 0 до 8 000 000 без дубликатов, вы можете просто выделить обнуленный массив из 8 000 000 битов, а затем для каждого числа отметить соответствующую бит в массиве. Затем вывод отсортированного списка - это просто последовательное чтение этого массива и вывод индекса для каждого значения 1.

Если вы задаете более сложную версию вопроса (0–10 миллионов, повторы разрешены), то вам нужно будет отсортировать куски, подходящие для оперативной памяти, сохранить их на диске, а затем объединить эти куски в линейное время и потоковая передача (так что вам никогда не придется хранить все это в памяти). Вот реализация очень похожей вещи в Python: http://neopythonic.blogspot.com/2008/10/sorting-million-32-bit-integers-in-2mb.html

3 голосов
/ 21 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...