Я попытаюсь сделать интуитивно понятный анализ того, почему Mergesort равен n log n, и если вы можете дать мне пример алгоритма n log log n, я тоже смогу проработать его.
Mergesort - это пример сортировки, который работает путем многократного разбиения списка элементов до тех пор, пока существуют только элементы, а затем объединения этих списков вместе. Основной операцией в каждом из этих слияний является сравнение, и для каждого слияния требуется не более n сравнений, где n - длина двух списков, объединенных. Из этого вы можете извлечь повторение и легко решить его, но мы избежим этого метода.
Вместо этого рассмотрим, как Mergesort будет вести себя, мы возьмем список и разделим его, затем возьмем эти половины и разделим его снова, пока у нас не будет n разделов длины 1. Надеюсь, это легко увидеть эта рекурсия пойдет только в log (n), пока мы не разделим список на наши n разделов.
Теперь, когда у нас есть все эти n разделов, которые необходимо объединить, то после их объединения необходимо объединить следующий уровень, пока у нас снова не появится список длины n. Обратитесь к графике Википедии для простого примера этого процесса http://en.wikipedia.org/wiki/File:Merge_sort_algorithm_diagram.svg.
Теперь посмотрим, сколько времени займет этот процесс, у нас будет log (n) уровней, и на каждом уровне нам придется объединять все списки. Как выяснилось, каждому уровню потребуется слияние за n раз, потому что мы будем объединять n элементов каждый раз. Тогда вы можете легко увидеть, что для сортировки массива с помощью mergesort потребуется n log (n) времени, если вы считаете операцию сравнения самой важной операцией.
Если что-то неясно или я где-то пропустил, пожалуйста, дайте мне знать, и я могу попытаться быть более многословным.
Редактировать второе объяснение:
Дайте мне подумать, смогу ли я объяснить это лучше.
Проблема разбита на несколько небольших списков, а затем меньшие списки сортируются и объединяются до тех пор, пока вы не вернетесь к исходному списку, который теперь сортируется.
Когда вы разберетесь с проблемами, у вас будет несколько разных уровней размера. Сначала у вас будет два списка размеров: n / 2, n / 2, затем на следующем уровне у вас будет четыре списка размеров: n / 4. , n / 4, n / 4, n / 4 на следующем уровне у вас будет n / 8, n / 8, n / 8, n / 8, n / 8, n / 8, n / 8, n / 8 это продолжается до тех пор, пока n / 2 ^ k не станет равным 1 (каждое подразделение - это длина, деленная на степень 2, не все длины будут делиться на четыре, поэтому это будет не так уж и красиво). Это повторное деление на два и может продолжаться самое большее log_2 (n) раз, потому что 2 ^ (log_2 (n)) = n, поэтому любое дальнейшее деление на 2 даст список нулевого размера.
Теперь важно отметить, что на каждом уровне у нас есть n элементов, поэтому для каждого уровня слияние займет n времени, потому что слияние является линейной операцией. Если есть уровни log (n) рекурсии, то мы выполним эту линейную операцию log (n) раз, поэтому наше время выполнения будет n log (n).
Извините, если это тоже не поможет.