Сортировка слиянием разбивает массив на последовательно меньшие куски, пока не дойдет до группы из 2-х элементных подмассивов. Затем он начинает применять алгоритм слияния к последовательно большим подмассивам.
Представьте, что у вас есть массив из 16 элементов. Сортировка слиянием выполняет слияние следующим образом:
8 merges of two 1-item subarrays
4 merges of two 2-item subarrays
2 merges of two 4-item subarrays
1 merge of two 8-item subarrays
Существует четыре (log 2 (16)) прохода, и на каждом проходе проверяется каждый предмет. Каждый проход O (n). Таким образом, время выполнения этой сортировки слияния равно O (n * log 2 (n)).
Теперь представьте, что у вас есть массив с 81 элементом, и вы хотите объединить его, используя сортировку с 3-сторонним слиянием. Теперь у вас есть следующая последовательность слияний:
27 merges of three 1-item subarrays (gives 27 3-item subarrays)
9 merges of three 3-item subarrays (gives 9 9-item subarrays)
3 merges of three 9-item subarrays (gives 3 27-item subarrays)
1 merge of three 27-item subarrays
Существует четыре (log 3 (81)) прохода. Каждое объединение - это O (m * log 2 (k)), где m - общее количество элементов, которые должны быть объединены, а k - количество списков. Таким образом, первый проход имеет 27 слияний, которые выполняют 3 * log 2 (3) сравнения. Следующий проход имеет 9 слияний, которые выполняют 9 * log 2 (3) сравнения и т. Д. В итоге получается, что общее слияние составляет O (n * log 3 (n) * log 2 * 1 026 * (3)) * * тысяча двадцать-семь
Вы можете видеть, что трехсторонняя сортировка слиянием позволяет делать меньше проходов (для трехсторонней сортировки из 16 элементов потребуется всего три прохода), но каждый проход немного дороже. Что вы должны определить, если:
n * log k (n) * log 2 (k) 2 (n)
Где k
- количество подмассивов, на которые вы хотите разбить массив. Я позволю тебе сделать эту математику.
Вы должны быть осторожны, потому что асимптотический анализ не учитывает реальных эффектов. Например, двухстороннее слияние невероятно просто. Когда вы переходите к k-way слиянию, где k> 2, вы в конечном итоге вынуждены использовать кучу или другую структуру данных очереди приоритетов, которая имеет довольно много накладных расходов. Таким образом, даже если приведенная выше математика говорит вам, что сортировка с 3-сторонним слиянием должна быть быстрее, вам нужно сравнить ее со стандартным 2-сторонним слиянием.
Обновление
Ты прав. Если вы упростите уравнение, вы в итоге получите те же уравнения. Таким образом, вычислительная сложность одинакова независимо от значения k.
Это имеет смысл, потому что если k = x, то вы получите сортировку кучи.
Итак, вам нужно определить, есть ли точка, где накладные расходы на слияние, которые увеличиваются с увеличением k, компенсируются уменьшением числа проходов. Возможно, вам придется определить это эмпирически.