Прежде чем читать «Искусство компьютерного программирования» (TAOCP) , я не углублялся в эти вопросы. Я бы использовал псевдокод для описания алгоритмов, понимания их и оценки времени выполнения только по порядку роста. TAOCP тщательно меняет свое мнение.
TAOCP использует английский, смешанный с шагами и переходом для описания алгоритма, и использует блок-схемы для более быстрого представления алгоритма. Это кажется низким уровнем, но я нахожу, что есть некоторые преимущества, особенно с блок-схемой, которые я часто игнорировал. Мы можем пометить каждую стрелку утверждением о текущем положении дел в то время, когда вычисление проходит эту стрелку, и сделать индуктивное доказательство для алгоритма. Автор говорит:
Автор утверждает, что мы действительно понимаем, почему алгоритм действует только тогда, когда мы достигаем точки, когда наши умы неявно заполнили все утверждения, как это было сделано на рис.4.
Я не испытывал такие вещи. Еще одним преимуществом является то, что мы можем подсчитать, сколько раз выполняется каждый шаг. Это легко проверить с первым законом Кирхгофа. Я не проанализировал время выполнения точно, поэтому некоторые могли быть опущены при оценке времени выполнения.
Анализ порядков роста иногда бесполезен. Например, мы не можем отличить быструю сортировку от heapsort, потому что они все , где - ожидаемое число случайной величины , поэтому мы должны проанализировать константу, скажем, и , поэтому мы можем сравнить и лучше. А также, иногда мы должны сравнивать другие величины, такие как отклонения. Только грубого анализа порядков роста времени работы недостаточно. Как TAOCPE X X E ( T 1 ( n ) ) = A 1 n lg n + B 1 n + O ( log n ) E ( T 2 ( n ) ) = A 2 lg n + B 2 n + O (T 1, T 2 переводит алгоритмы на язык ассемблера и вычисляет время выполнения. Это слишком сложно для меня, поэтому я хочу знать некоторые приемы для более точного анализа времени выполнения, что также полезно для языков более высокого уровня, таких как C, C ++ или псевдокоды.
И я хочу знать, какой стиль описания в основном используется в исследовательских работах и как решать эти проблемы.
Ответы:
Существует огромное разнообразие возможных подходов. Что лучше всего подходит, зависит от
Если алгоритм широко известен и используется в качестве подпрограммы, вы часто остаетесь на более высоком уровне. Если алгоритм является основным объектом исследования, вы, вероятно, хотите быть более подробным. То же самое можно сказать и о анализах: если вам нужна грубая верхняя граница времени выполнения, вы поступаете иначе, чем когда вам нужно точное количество операторов.
Я приведу три примера для известного алгоритма Mergesort, которые, как мы надеемся, иллюстрируют это.
Высокий уровень
Алгоритм Mergesort берет список, разбивает его на две (примерно) одинаковые по длине части, рекурсирует по этим частичным спискам и объединяет (отсортированные) результаты так, что конечный результат сортируется. В одноэлементных или пустых списках возвращает входные данные.
Этот алгоритм, очевидно, является правильным алгоритмом сортировки. Разделение списка и его слияние может быть осуществлено за время , что дает нам повторение для наихудшего случая времени выполнения T ( n ) = 2 T ( n).Θ ( н ) . По основной теореме это дает оценкуT(n)∈Θ(nlogn).T( n ) = 2 Тл( н2) +Θ(н) T( n ) ∈ Θ ( n logн )
Средний уровень
Алгоритм Mergesort задается следующим псевдокодом:
mergesort
left
right
while
result
result
left
right
while
reverse
while
reverse
mergesort
Ультра-низкий уровень
Рассмотрим эту (обобщенную) реализацию Mergesort в Изабель / HOL :
Это уже включает в себя доказательства четкости и прекращения. Найти (почти) полное доказательство правильности здесь .
Для «времени выполнения», то есть количества сравнений, можно установить повторение, подобное тому, которое было в предыдущем разделе. Вместо использования основной теоремы и забывания констант, вы также можете проанализировать ее, чтобы получить приближение, которое асимптотически равно истинной величине. Вы можете найти полный анализ в [1]; вот приблизительный план (он не обязательно соответствует коду Изабель / HOL):
Как указано выше, повторяемость числа сравнений
что вместе с формулой Перрона приводит нас к
Оценка зависит от того, какой случай анализируется. Кроме этого, мы можем - после некоторой хитрости - применить теорему об остатках, чтобы получить⊟(s)
где - периодическая функция со значениями в .A [−1,−0.9]
источник
«Дисциплина программирования» Дейкстры посвящена анализу и проверке алгоритмов и проектированию для доказуемости. В предисловии к этой книге Дейкстра объясняет, как очень простого сконструированного мини-языка, который должным образом разработан для анализа, достаточно для формального объяснения многих алгоритмов:
Позже он объясняет, насколько маленьким ему удалось получить свой мини-язык.
источник