我知道如何通过计算每行执行的次数来计算程序的复杂性,只要有变量声明或涉及一些简单的循环(即线性情况)。
但在某些情况下,我发现某些代码行以对数,指数,立方顺序等运行,我只是想知道如何解决这个问题?
答案 0 :(得分:1)
[following] [3]图中对合并排序算法的运行时分析进行了分析: 我们将原始数组拆分为两个大小为n / 2的数组。然后我们合并这些数组,这是一个合并n个元素的操作,因此需要Θ(n)时间。 通过这个论证,每行的复杂度是Θ(n)。我们知道这个图中的行数,也称为递归树的深度,将是log(n)。其原因与我们在分析二进制搜索的复杂性时使用的推理完全相同。我们有log(n)行,每个都是Θ(n),因此mergeSort的复杂度是Θ(n * log(n))
可以通过计算程序的嵌套循环来分析简单程序。 n个项目上的单个循环产生f(n)= n。循环内的循环产生f(n)= n2。循环内循环内的循环产生f(n)= n3。
给定一系列顺序的for循环,它们中最慢的确定程序的渐近行为。两个嵌套循环后跟一个循环渐近地与嵌套循环相同,因为嵌套循环支配简单循环。
i := 1;
while ( i < n )
i = i * 2;
运行时间是对数,O(logn),因为乘以2。
很少有用的链接是: https://cs.stackexchange.com/questions/192/how-to-come-up-with-the-runtime-of-algorithms
我希望他们帮助你!