Учитывая, что A представляет собой массив из k массивов. Каждый внутренний массив отсортирован и содержит m элементов.
Учитывая этот алгоритм для слияния отсортированных по K массивов, хранящихся в A:
// A is array of sorted arrays
K-arrays-merge(A)
1. if A.length == 1
2. return first element of A
3. half = length[A] / 2
4. firstHalfArray = new array[half][m];
5. secondHalfArray = new array[half][m];
6. for (i = 0; i < half; i++)
7. do firstHalfArray[i] = A[i];
8. for (i = half; i < length[A]; i++)
9. do secondHalfArray[i] = A[i];
10. secondHalfArray = Copy second half arrays from A
11. a = K-arrays-merge(firstHalfArray)
12. b = K-arrays-merge(secondHalfArray)
13. return merge(a,b) // This is a merge between two sorted arrays with time complexity of O(n)
Почему временная гибкость этого алгоритма равна O(m*klogk)?
Моя первая мысль заключается в том, что рекурсивный метод запускается logk раз, в каждом раунде копирование массивов выполняется O (m * k), а сортировка слиянием — O (m i log (m i)), где 1 <= i <= logk
Глядя на этапы «разделяй и властвуй»:
- Разделить - вычисление средней точки - O (1), копирование массивов - O (mk)
- Conquer - 2T(k/2) - Рекурсивные вызовы.
- Слияние - сортировка слиянием со сложностью O(m i log (m i)), где
1 <= i <= logk
.
Я не знаю, как вычислить временную сложность из этого. Также какова будет пространственная сложность этого алгоритма?