Сортировка слиянием во внешней памяти

Может ли кто-нибудь указать мне хорошую ссылку на слияние внешней памяти? Я прочитал вики-страницу, но у меня возникли проблемы с ее точным пониманием. Анимация может помочь, но я не могу ее найти.

По сути, я знаю, что у вас есть определенное количество блоков на диске, и вы можете разместить определенное количество блоков в памяти. Допустим, у вас есть 32 блока на диске и 4 блока в памяти. На первом проходе вы читаете в память по 4 блока за раз, сортируете их в памяти и записываете обратно на диск. Итак, на данный момент у вас есть 8 отсортированных прогонов по 4 блока. Как работает слияние? Поскольку у меня есть 4 блока в памяти (предположим, что у меня есть еще один для вывода), я думаю, что должен иметь возможность объединить 4 из этих 8 прогонов за раз, а затем объединить следующие 4 прогона. И затем в последнем проходе я хочу объединить все это. Но разве вам не нужно каждый раз читать каждый блок с диска? Так как же это не становится решением n ^ 2?


person JPC    schedule 12.10.2010    source источник
comment
Нет, это не домашняя работа, я изучаю старые заметки и больше не могу нажимать на них.   -  person JPC    schedule 12.10.2010


Ответы (1)


Думаю, теперь я понял. При слиянии вам все равно придется читать все блоки на диске (назовем это B), но вам не нужно читать их B раз. Вы читаете их только B log B раз.

person JPC    schedule 12.10.2010
comment
Когда вы объединяете 4 входных блока и помещаете результат в последний блок, разве последний блок не должен быть в 4 раза больше входных блоков, чтобы содержать результат? - person Frank Q.; 28.04.2012