LINUX.ORG.RU

Написать сортировку файла за 3 часа (брутал-собес)

 , ,


2

4

Задача:
Написать сортировку файла.

Требования:
Дан текстовый файл размером 4 Гб. Файл содержит строки в кодировке UTF-8 средней длины 20 символов. Файл содержит три колонки, разделенные пробелами: «e-mail пользователя», «дата в формате ISO8601», «число, идентификатор некоторого объекта». Например,

superuser@yandex.ru 2010-12-02T13:30:12 11245
vasya@gmail.com 2011-03-25T00:00:02 88765
superuser@yandex.ru 2010-12-02T13:40:15 11244


У вас в распоряжении есть 512 Мб памяти.

Нужно написать программу, которая сортирует файл:
./sort input.txt output.txt

Прежде чем приступить к реализации, расскажите, пожалуйста, детали алгоритма, который вы будете реализовывать.

Ответ на: комментарий от anonymous

Сортировать надо индекс, а потом создать новый сортированный файл.

Если средняя строка ~ 50 байт, то места для индекса хватит (~320Мб); нужно сделать inplace_merge_sort индексов. Но при этом получим O(n log n) операций чтения с диска, причём с очень приличным множителем.

Если действовать похитрее можно сделать (вроде бы) O (n) операций чтения с небольшим множителем.

Судя по тэгу «Яндех» это актуально.

Ну, а если средняя длина строки больше 75 байт (например, волшебные кириллические домены), то сортировка индексов вообще не прокатит - не хватит на них места.

anonymous
()
Ответ на: комментарий от anonymous

Ну, а если средняя длина строки больше 75 байт (например, волшебные кириллические домены), то сортировка индексов вообще не прокатит - не хватит на них места.

я думал над этим. Я думаю достаточно отсортировать только по первым n байт. Скажем n=10 более чем достаточно. А дальше на финальном этапе сделать второй прогон по файлу и досортировать если что-то не по порядку.

true_admin ★★★★★
()
Ответ на: комментарий от arturpub

> O (n) операций чтения с небольшим множителем

Это как интересно?

Гнать не буду, я написал «вроде бы». Мне кажется, если применить принципы inplace_merge c O(n), то можно добиться такого результата, но не уверен. Это может оказаться не проверкой на 10 минут. Подумаю на досуге. Разумеется, в оперативке log, а то и его квадрат никуда не денутся.

anonymous
()
Ответ на: комментарий от anonymous

Да, мне тоже только что подумалось, что inplace просто перемещает проблему с диска в память. А вообще задачка экономически нецелесообразна после трех часов изучения, за немалой ценой часа программиста дешевле купить и смонтировать флешку USB 2.0 на 8 гигов. И дальше обычным merge.

arturpub ★★
()
Ответ на: комментарий от true_admin

Не понял. Всего индексов будет столько, сколько записей же. Размер одного индекса зависит от схемы позиционирования в данных (тут смещения внутри 4г). 80млн записей — 80млн индексов по 4 байта — 320Мб как ни крути.

arturpub ★★
()
Ответ на: комментарий от arturpub

задачка экономически нецелесообразна

Задача [для Яндекса] экономически очень целесообразна: «Найти программиста, который может оценивать и решать (желательно сторонними средствами), подобные проблемы.» )))

Думаю, после обсуждения вариантов решения этой задачи на собеседовании Яндекса, соискатель не будет писать 3 часа код. Либо собеседование продолжится другим вопросом, либо «мы очень ценим опыт общения с вами и обязательно свяжемся!».

anonymous
()
Ответ на: комментарий от anonymous

Думаю, после обсуждения вариантов решения этой задачи на собеседовании Яндекса, соискатель не будет писать 3 часа код

Нет, именно написать работающий код. За 3 часа. Они ноут дают для этой задачи. С шindows(!), кстати :D

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Нет, именно написать работающий код. За 3 часа. Они ноут дают для этой задачи. С шindows(!), кстати :D

Наверное, это не ранняя стадия собеседования. На ранней слишком нерационально, там отсев приличный.

А у тебя знакомый ходил туда?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.