Могу я представить это по-другому:
Традиционная сложность сортировки слиянием - o (n.ln (n)), но в моем случае с другим размером подсписка, в худшем случае, если один файл большой, а все остальные маленькие (это пример, который вы даете), сложность может быть o (nn): что является плохой сложностью производительности.
Вопрос в том, «как оптимально спланировать подсортировку»?
Предварительно вычислить график всех выполнений на самом деле слишком большой, в худшем случае он может быть таким же большим, как и данные, которые вы сортируете.
Мое предложение состоит в том, чтобы вычислить его «на лету» и позволить ему быть не оптимальным, но, по крайней мере, избежать худшего случая.
- Моим первым наивным впечатлением было просто отсортировать файлы по размерам и начать с меньших: таким образом, вы будете исключать небольшие файлы во время итераций.
У меня К = 2:
в вашем примере 1 1 10 10 -> 2 20 -> 22: Это все еще (20 + 2) + 22 CC, так что 42 CC *
CC: Сравнение или копирование: это количество операций, которое я считаю для сложности 1.
Если у меня есть K = 1 и я повторно введу результат в мой отсортированный файл Array, я получу:
(1 1 10 10) -> 2 10 10 -> 12 10 -> (22): 2 CC + 12 + 22 = 46
Для разных значений K сложность может незначительно отличаться
Вычисление сложности этого алгоритма в среднем случае с вероятностью будет очень интересным, но если вы допустите выполнение N² для плохих случаев.
PS:
Тот факт, что k<n
- это еще одна проблема: она будет просто решена путем добавления работника на пару файлов в очередь (n / 2 работников в начале) и создания очереди, считываемой k Threads.