Как заметили другие люди, вы можете использовать счетную сортировку O (n) .Однако есть некоторые дополнительные проблемы, которые вы должны рассмотреть.Предположим, что вы храните 32-битные целые числа, поэтому 100GB ~ 27e9 дюймов.
Если все целые числа одинаковы, то это произойдет ~ 27e9 раз, что больше, чем 32-битное int.Следовательно, ваши счетчики должны быть 64-разрядными целыми числами.
С 2 ГБ ОЗУ вы можете одновременно хранить в памяти только ~ 125e6 счетчиков.Если мы не можем делать какие-либо предположения о распределении целых чисел, мы должны либо:
- индивидуально увеличивать счетчики на HD, либо
- игнорировать все встречающиеся целые числа,находятся не в массиве счетчиков, который мы сейчас храним в ОЗУ.
Я думаю, что последний вариант лучше.Поскольку нам нужны 64e-битные счетчики ~ 4e9 и мы можем хранить только 2 ГБ, нам нужно будет пройти через весь массив ~ 16 раз.Первый вариант явно не годится, если мы рассмотрим последовательность целых чисел, например 0,1 << 31,0.Эти счетчики не будут храниться в ОЗУ одновременно, и поэтому требуется как минимум 2 записи HD. </p>
Из-за этого, я думаю, для конкретного размера вашей проблемы (100 ГБ), N-way merge сортировка будет лучше, так как для этого потребуется только чтение всего массива log_2 (100) ~ 8 раз.
Однако, если интервьюер немедленно изменил вопрос на "массив 10TB, все равно2 ГБ ОЗУ ", тогда счетчик легко выиграет.