Типичным алгоритмом сортировки 2 32 чисел будет:
- Создать массив из 2 32 чисел и заполнить их от 0 до 2 32 -1
- Пусть n = количество элементов в массиве = 2 32
- Случайным образом выбрать число от 0 до n-1, удалить число из массива и поместить его в стек
- Теперь n уменьшается на 1, а размер стека увеличивается на 1
- перейти к 3. до тех пор, пока массив не станет пустым, окончательный стек является решением
2 32 = 4 294 967 296 единиц
2 32 * 4 = 17 179 869 184 байта, если мы используем 4-байтовые целые числа без знака
Поскольку у меня не так много памяти на одной машине, использование memmap () может быть хорошим кандидатом (возможно, самый простой подход).
Из любопытства мне стало интересно, могу ли я использовать MapReduce для решения этой проблемы? Как бы выглядели функции Map и Reduce?
Эта идея пришла мне в голову, потому что, хотя у меня не так много памяти на одной машине, у меня определенно много памяти во всех блоках, которые есть в локальной сети. Распределенная природа данных в MapReduce может помочь.
Хотя альтернативные, эквивалентные алгоритмы, которые соответствуют MapReduce, приветствуются, может быть трудно найти такой, который не ухудшает случайность вышеупомянутого алгоритма.