我得到了以下伪代码:
j = 1
while j < n:
k = 2
while k < n:
k = k*k
j++
在我看来,这段伪代码会有以下复杂性:
O(n*log(n))
由于外循环正在执行n次。虽然内循环基本上每次将增量步长分成两半。我的想法太遥远了吗?
编辑:另外1个(这些不是作业,我保证,只是要理解的例子)
for i = 1 to n:
for j = 1 to n:
k = j*j
while k < n:
k++
在这种情况下,最外层循环将执行n次。中间循环也将执行n次,现在我们处于n 2 次。最里面的循环,正如我所说,它将执行log(n)次,将我们放在O(n 2 * log(n))次。我的理解是否正确?
答案 0 :(得分:6)
这是 <android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeMaxTextSize="31.5px"
android:autoSizeMinTextSize="24.674995px"/>
。
就时间而言,外循环只重复内循环O (n log log n)
次,因此它的乘数为n
。
内循环比较棘手,它会重复平方n
。
看看它如何:
k
因此,例如,如果2^1 -> 2^2 -> 2^4 -> 2^8 -> 2^16 -> 2^32 -> ...
,循环将进行n = 2^32
次迭代。
在此,5
为log_2 (n)
,32
为log_2 (32)
。
通常,如果5
,内部循环将在n = 2^(2^r)
次迭代后到达n
。
通过取对数,我们得到r
。
通过再次取对数,我们得到log n = 2^r
。
你可能知道,只要它是常数,对数的基数在处理渐近行为时并不重要。
所以,我们有一个循环的log log n = r
次迭代,它本身会进行n
次迭代,从而使整体复杂度log log n
。
答案 1 :(得分:0)
是的,你是对的,第一个循环是直接的O(n)。第二部分有点棘手。我将使用原因而不是严谨来显示其O(logn)。
因此我们假设它为k = k * 2
一秒钟。这是一个熟悉的序列,我们知道O(logn)
但是我们看到k >= 2
对于任何给定的循环,所以我们知道序列k = k*k
将被O(logn)
限制在上面,即它位于大多数 O(logn)。很容易看出它不是O(1)
因此我们知道O(1)是下界。一起来获取O(nlogn)
答案 2 :(得分:-1)
O(n log(n))
k ^ log(n)正好是k等于或大于n的值。
log(n)= x表示2 ^ x = n
你运行循环n次。
因此复杂度为O(n * log(n))