Я думаю, что все ответы на ваш вопрос может исходить от Master Theorem Это своего рода сказать вам, что бы ваши сложности практически для любого разделяй и властвуй решение у вас есть, и да, он должен делать все, с рекурсивными деревьями, играя с параметрами, вы обнаружите, что некоторые решения для разделения и завоевания не будут иметь сложность O (nlogn), на самом деле есть divide and conquer algorithms that have O(n) complexity.
Как раз в отношении вопроса 2, на самом деле не всегда можно найти некоторые проблемы, которые, как считается, невозможно решить быстрее, чем O (n^2), это зависит от характера проблемы.
Пример алгоритма, который работает в O (nlogn), и который, по моему мнению, имеет очень простой, понятный и образовательный анализ времени выполнения: MergeSort. Это можно понять со следующего рисунка:
Итак, каждый рекурсивный шаг вход разбивается на две части, тогда часть завоевания принимает O (n), поэтому каждый уровень дерева стоит O (n), сложный может быть, возможно, что количество рекурсивных уровней (высота дерева) - logn. Это более или менее просто. Поэтому на каждом шаге мы делим вход в 2 части n/2 элементов каждый и повторяем рекурсивно, пока мы не будем вводить постоянный размер. Поэтому на первом уровне мы делим n/2 на следующий n/4, затем n/8, пока не достигнем значения постоянного размера, который будет листом дерева, и последним рекурсивным шагом.
Итак, на i-м рекурсивном шаге мы делим n/2^i, поэтому дадим значение для i на последнем шаге. Нам нужно, чтобы n/2^i = O (1), это достигается при 2^i = cn для некоторой константы c, поэтому мы берем логарифм базы 2 с обеих сторон и получаем, что i = clogn. Таким образом, последним рекурсивным шагом будет clogn-th step, и, следовательно, дерево имеет clogn height.
Таким образом, общая стоимость MergeSort будет cn для каждого из уровней clogn recursive (tree), что дает сложность O (nlogn).
В целом вы можете быть уверены, что ваш алгоритм будет иметь сложность O (nlogn), если рекурсивный шаг имеет сложность O (n) и yo делятся на b проблем размера n/b или даже более общих , если части являются линейными частями n, которые суммируются до n. В другой ситуации очень вероятно, что у вас будет другое время выполнения.
Возвращаясь к вопросу 2, в случае QuickSort можно получить от O (n^2) до \ Theta (nlogn) именно потому, что средний случайный случай достигает хорошего раздела, хотя анализ времени выполнения еще сложнее, чем что.
You может захотеть взглянуть на него http://bigocheatsheet.com/ –