Я работаю над проблемой, в которой у меня есть 80GB
данных, которые мне нужно отсортировать. У меня есть только 1GB
оперативной памяти для сортировки данных. Очевидно, здесь мы применим метод внешней сортировки. Но мой вопрос в том, какая сортировка k-слияния будет более эффективной?
- 8-стороннее слияние, за которым следует 10-стороннее слияние
- 5-стороннее слияние, за которым следует 16-стороннее слияние
Сложность сортировки K-слиянием равна O(nk^2)
, где n — количество элементов. Предположим, я использую этот метод для вычисления сложности:
8-стороннее слияние, за которым следует 10-стороннее слияние
8 way merge - O(n*8^2) => O(64n)
10 way merge - O(8n*10^2) => O(800n)
Total time complexity => O(64n) + O(800n)
5-стороннее слияние, за которым следует 16-стороннее слияние
5 way merge - O(n*5^2) => O(25n)
16 way merge - O(5n*16^2) => O(1280n)
Total time complexity => O(25n) + O(1280n)
Глядя на временную сложность 5 way merge followed by 16 way merge
, кажется, требуется больше времени. Как вы думаете, мой процесс правильный? Я не очень уверен в этом.
ОБНОВЛЕНИЕ: @rcgldr Поскольку вы говорите, что больший размер блока займет меньше времени для чтения/записи, так что вы думаете об этой формуле:
Time to read/write 1 block = Average Seek time +
Average rotational latency + blocksize/Maximum Transfer Rate
Согласно этой формуле, если размер блока небольшой, общее время чтения/записи также будет меньше. Как вы думаете, здесь что-то не так? или нам нужно умножить общее количество блоков вместе с этим, чтобы получить точную картину общего требуемого времени.