Привет, я видел это как вопрос интервью и подумал, что это интересный вопрос, на который я не уверен в ответе.
Что было бы лучшим способом?
Привет, я видел это как вопрос интервью и подумал, что это интересный вопрос, на который я не уверен в ответе.
Что было бы лучшим способом?
Предполагая *никс:
system("sort <input_file >output_file")
«сортировка» может использовать временные файлы для работы с входными файлами, размер которых превышает размер памяти. Он имеет переключатели для настройки объема основной памяти и количества временных файлов, которые он будет использовать при необходимости.
Если не *nix, или интервьюер хмурится из-за косого ответа, то я закодирую внешнюю сортировку слиянием< /а>. См. Ответ @psyho для получения хорошего резюме алгоритма внешней сортировки.
Поместите их в базу данных и пусть база данных заботится об этом.
Один из способов сделать это — использовать алгоритм внешней сортировки:
Что ж, это интересный вопрос для собеседования... почти все такого рода вопросы предназначены для проверки ваших навыков и, к счастью, не относятся напрямую к примерам из реальной жизни. Это похоже на один, так что давайте разберемся с головоломкой
Когда ваш интервьюер спрашивает о лучшем, я полагаю, что он / она говорит только о производительности.
30 ГБ строк — это много данных. Все алгоритмы сравнения-перестановки Omega(n logn)
, так что это займет много времени. Хотя есть алгоритмы O(n)
, такие как сортировка подсчетом, они не на месте, поэтому вы будете умножать 30 ГБ, а у вас будет только 4 ГБ ОЗУ (учитывайте объем подкачки...), поэтому я бы выбрал быструю сортировку.
Начните думать о сортировке подсчетом. Вы можете сначала разбить строки на группы (используя метод сортировки по основанию), по одной на каждую букву. Вы можете отсканировать файл и для каждой начальной буквы переместить строку (так что скопируйте и удалите, чтобы не тратить место) во временный файл. Вы можете повторить процесс для первых 2, 3 или 4 символов каждой строки. Затем, чтобы уменьшить сложность сортировки большого количества файлов, вы можете отдельно отсортировать строку внутри каждого из них (используя сейчас быструю сортировку) и, наконец, объединить все файлы по порядку. Таким образом, у вас все еще будет O(n logn)
, но значительно ниже n
.
Системы баз данных уже хорошо справляются с этой конкретной проблемой.
Хороший ответ — использовать алгоритм сортировки слиянием, адаптируя его к буферизации данных на диск и с диска по мере необходимости для шагов слияния. Это можно сделать с минимальными требованиями к памяти.