Re[7]: Ещё задачи на заваливание
От: Тёмчик Австралия жж
Дата: 08.11.18 22:32
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Да, забыл добавить, что в обоих случаях можно использовать указатели на std::bitset (std::bitset<0xFFFFFFFF/8>* и std::bitset<1000000>* соответственно) если экзаменатор предполагает, что в записанных цифрах в файлах могут быть пропуски. (Других решений я не знаю.)

Тё>>Какие нафиг указатели?
BFE>На стеке не поместятся.
Какой нафиг стек? Использовать странички (выгружаемые на диск массивы байтов) не судьба?

Тё>>Ппц вы правда работаете программистом?

BFE>Правда
В командах, где принято говорить о предыдущем опыте?

Тё>>Написать цикл 0..1000000 не судьба?

BFE>В последовательности записанных чисел в файлах могут быть пропуски?
А как вы думаете? Всё же написано в условии.
Отредактировано 08.11.2018 22:50 Артём . Предыдущая версия .
Re[11]: Ещё задачи на заваливание
От: B0FEE664  
Дата: 08.11.18 22:56
Оценка:
Здравствуйте, Тёмчик, Вы писали:

BFE>>Это не bucket sort. Это external merge sort.

Тё>Ок, был неправ- это external merge sort. Что мешало отписавшихся тут куче критикующих такой "слишком сложный" вопрос, решить эту задачку указанным методом? Вместо того, чтобы демонстрировать потуги с tree merge? И ведь я даже не задал баянную knapsack problem- все предельно простое.

Так ведь tree merge будет работать быстрее, если его построить на основе B-tree. Однако полное описание алгоритма займёт, наверное, час времени. Идея кратко: надо над pivots'ами из
External distribution sort построить Би дерево, листами которого будут файлы хранящие смещение в основном файле, такого размера, что вместе со значениями поля влезали в 8 GB памяти. Эти листы-файлы следует записывать в несортированном виде, просто добавляя в конец смещение подходящие для данного листа. Вообще говоря такой индекс должен строится за один проход, но алгоритм очень нетривиальный. После этого каждый лист можно загрузить в память, отсортировать, после этого пройтись по основному файлу и скопировать записи по смещениям взятым из отсортированного листа в новый файл.

Так или иначе, ни тот, ни этот алгоритм не решает проблемы очень длинных ключей. Представьте, что у вас в файле всего 5 записей и значения ключевого поля каждой записи — это строки по длине превышающие 8 Gb.
И каждый день — без права на ошибку...
Re[8]: Ещё задачи на заваливание
От: B0FEE664  
Дата: 08.11.18 23:16
Оценка:
Здравствуйте, Тёмчик, Вы писали:

BFE>>>>Да, забыл добавить, что в обоих случаях можно использовать указатели на std::bitset (std::bitset<0xFFFFFFFF/8>* и std::bitset<1000000>* соответственно) если экзаменатор предполагает, что в записанных цифрах в файлах могут быть пропуски. (Других решений я не знаю.)

Тё>>>Какие нафиг указатели?
BFE>>На стеке не поместятся.
Тё>Какой нафиг стек?
Вызовов.

BFE>Использовать странички (выгружаемые на диск массивы байтов) не судьба?

А зачем?

Тё>>>Ппц вы правда работаете программистом?

BFE>>Правда
Тё>В командах, где принято говорить о предыдущем опыте?
Нет. По тестам я в 20% лучших из соискателей.

Тё>>>Написать цикл 0..1000000 не судьба?

BFE>>В последовательности записанных чисел в файлах могут быть пропуски?
Тё>А как вы думаете? Всё же написано в условии.

Дан файл с integer values от 0 до 1000000, без дупликатов, но значения в произвольном порядке.

Если файл содержит два числа: 2 и 3, например, то это файл integer values от 0 до 1000000, без дупликатов.
И каждый день — без права на ошибку...
Re[12]: Ещё задачи на заваливание
От: Тёмчик Австралия жж
Дата: 09.11.18 02:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Тёмчик, Вы писали:


BFE>>>Это не bucket sort. Это external merge sort.

Тё>>Ок, был неправ- это external merge sort. Что мешало отписавшихся тут куче критикующих такой "слишком сложный" вопрос, решить эту задачку указанным методом? Вместо того, чтобы демонстрировать потуги с tree merge? И ведь я даже не задал баянную knapsack problem- все предельно простое.

BFE>Так ведь tree merge будет работать быстрее, если его построить на основе B-tree. Однако полное описание алгоритма займёт, наверное, час времени. Идея кратко: надо над pivots'ами из

BFE>External distribution sort построить Би дерево, листами которого будут файлы хранящие смещение в основном файле, такого размера, что вместе со значениями поля влезали в 8 GB памяти. Эти листы-файлы следует записывать в несортированном виде, просто добавляя в конец смещение подходящие для данного листа. Вообще говоря такой индекс должен строится за один проход, но алгоритм очень нетривиальный. После этого каждый лист можно загрузить в память, отсортировать, после этого пройтись по основному файлу и скопировать записи по смещениям взятым из отсортированного листа в новый файл.
Вы способны нагуглить информацию, но не способны её понять тем более, придумать корректное решение на ходу. Я вам расписал простое корректное решение (можете и с distribution sort предложить), но вы ничего не понимаете, упорно, из раза в раз.
Поэтому, когда бы я ни дорвался интервьюировать- я постараюсь им задавать такие вот задачки. Чтобы не пришлось потом в рабочее время как со столбом разговаривать.

BFE>Так или иначе, ни тот, ни этот алгоритм не решает проблемы очень длинных ключей. Представьте, что у вас в файле всего 5 записей и значения ключевого поля каждой записи — это строки по длине превышающие 8 Gb.


Этот вопрос задал writnik и я на него ответил.
Re[2]: Ещё задачи на заваливание
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.11.18 04:53
Оценка: :)
Здравствуйте, RussianFellow, Вы писали:

Тё>>1) школьная на рекурсию (не моя- не буду раскрывать)

Тё>>2) перевернуть порядок слов (обсудили)
Тё>>3) Дан файл с integer values от 1 до 2^32-1, они не повторяются за исключением 1 дупликата. Нужно распечатать значение дупликата. Как это сделать? (код не нужен)
Тё>>4) Дан файл с integer values от 0 до 1000000, без дупликатов, но значения в произвольном порядке. Как их вывести в другой файл в порядке возрастания?
Тё>>5) Дан файл из записей JSON размером 140GB, но у вас в системе всего 8GB памяти. Нужно вывести записи в другой файл, отсортированные по произвольному полю JSON. Как это сделать? (код не нужен).
Тё>>6) Напишите код для разворота односвязного списка на доске.
Тё>>7) Как узнать, есть ли loop в односвязном списке? Напишите код на доске.

Тё>>PS Спасибо, что указали на ошибку в условии (3).


RF>Я большинство из этих задач не решу!


Не переживай. Я, к примеру, даже прочитать их не смог.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[13]: Ещё задачи на заваливание
От: B0FEE664  
Дата: 09.11.18 09:38
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>Вы способны нагуглить информацию, но не способны её понять тем более,

Вообще-то, использование B-Tree для решения подобных задач является общепринятым и широко известным.

Тё>придумать корректное решение на ходу.

Медленное решение я всегда могу предложить. Для любой решаемой задачи.

Тё>Я вам расписал простое корректное решение (можете и с distribution sort предложить), но вы ничего не понимаете, упорно, из раза в раз.

Если я ничего не понимаю, то как же я вам указал на правильное название?

Тё>Поэтому, когда бы я ни дорвался интервьюировать- я постараюсь им задавать такие вот задачки. Чтобы не пришлось потом в рабочее время как со столбом разговаривать.

Обычно на собеседованиях на алгоритмы хотят услышать о наилучшем решении, а вы хотите слышать только то, которое знаете.

И вообще, вы что, думаете, что решение с внешними корзинами является единственным и оптимальным? А вот и нет. Вот решение, которое намного проще, оптимальнее по памяти и пишется за один день максимум (если есть парсер Json и все ключи гарантированно влезают в память): читаем данные в память до лимита и записываем их в любую сортированную структуру. При достижении лимита (который меньше 8Gb), читаем ещё одну запись и добавляем её в структуру, после чего выкидываем из структуры максимальный (если сортируем по возрастанию) элемент. Процедуру повторяем до конца файла. Записываем полученные данные в файл. Сохраняем максимальный из имеющихся ключей, а остальную память освобождаем. Повторяем процедуру отсекая те данные, которые мы уже сохранили, используя для этого ключ с предыдущего шага. Менее, чем за 20 циклов мы получим отсортированную копию файла. Прошу заметить, что мы не создаём временные файлы, не тратим времени на их чтение и запись. Если время записи файла существенно превышает время чтения, то этот алгоритм обгонит external merge sort. Более того. его ещё можно оптимизировать если хранить кэш уже отсортированных смещений в разряженном массиве.
И каждый день — без права на ошибку...
Re[3]: Ещё задачи на заваливание
От: VladiCh  
Дата: 18.11.18 21:16
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>«предположительно» не подходит. Там простое в лоб решение, как можно не знать? https://en.m.wikipedia.org/wiki/Bucket_sort

Тё>Размер корзины такой, чтобы поместился в память.

мдя... вообще, нужно отпарсить json потоковым парсером, выявить смешения начала — конца объекта, хранимого по сортируемому полю для всех записей.
построить в памяти структуру типа список записей:
{
сортируемое поле
смещение начала
смещение конца
}
отсортировать этот список чем хочешь. если этот список тоже не влазит в память (хотя это я думаю маловероятно), отсортировать внешней сортировкой.
все, задача решена. причем тут бакет сорт?
Re[4]: Ещё задачи на заваливание
От: Тёмчик Австралия жж
Дата: 18.11.18 22:14
Оценка:
Здравствуйте, VladiCh, Вы писали:

VC>мдя... вообще, нужно отпарсить json потоковым парсером, выявить смешения начала — конца объекта, хранимого по сортируемому полю для всех записей.

VC>построить в памяти структуру типа список записей:
VC>{
VC> сортируемое поле
VC> смещение начала
VC> смещение конца
VC>}
Вы просто Капитан Очевидность :facepaln:
VC>отсортировать этот список чем хочешь. если этот список тоже не влазит в память (хотя это я думаю маловероятно), отсортировать внешней сортировкой.
Не влазит в память.
VC>все, задача решена. причем тут бакет сорт?
Любая внешняя сортировка по вкусу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.