我在这里有一个简短的程序:
Given any n:
i = 0;
while (i < n) {
k = 2;
while (k < n) {
sum += a[j] * b[k]
k = k * k;
}
i++;
}
它的渐近运行时间为O(n log log n)。为什么会这样呢?我知道整个程序至少要运行n次。但是我不确定如何找到日志log n。内部循环取决于k * k,因此显然要小于n。如果每次是k / 2,那将只是n log n。但是您如何确定答案是log log n?
为了进行数学证明,内循环可以写为:
T(n) = T(sqrt(n)) + 1
w.l.o.g assume 2 ^ 2 ^ (t-1)<= n <= 2 ^ (2 ^ t)=>
we know 2^2^t = 2^2^(t-1) * 2^2^(t-1)
T(2^2^t) = T(2^2^(t-1)) + 1=T(2^2^(t-2)) + 2 =....= T(2^2^0) + t =>
T(2^2^(t-1)) <= T(n) <= T(2^2^t) = T(2^2^0) + log log 2^2^t = O(1) + loglogn
==> O(1) + (loglogn) - 1 <= T(n) <= O(1) + loglog(n) => T(n) = Teta(loglogn).
然后总时间为O(n loglogn)。
为什么内循环是T(n)= T(sqrt(n))+1? 首先查看内部循环何时中断,当k>
n时,意味着k至少在sqrt(n)之前,或者在k等于最大sqrt(n)之前处于两个级别,因此运行时间为T(sqrt(n))。 +
2≥T(n)≥T(sqrt(n))+ 1。
问题内容: 我打算对StringBuilders中的最后一个字符进行很多删除。使用的解决方案对我来说很好。但是,由于这些删除将处于循环中,因此我需要知道其复杂性。 据我了解,该操作只是减少了StringBuilder对象的一些私有属性,并且不对字符本身执行任何复制/克隆/复制操作,因此它的时间为O(1),应该可以快速运行。 我对吗? 问题答案: 从文档中: 设置字符序列的长度。序列更改为新的字符序
我知道,对于迭代,递增。
主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内
以下代码的时间复杂度是多少? 在嵌套循环中,如果外循环1需要O(1)时间,内循环2需要O(logn)时间,内循环3需要O(n)。那么总的tc是O(1)O(logn)O(n)=O(nlogn)。这是真的吗? 请解释一下。
就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市? 我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?
我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的
问题内容: 如标题所述,我想知道an方法的时间复杂度是多少。 问题答案: 的,,,,,和操作在固定时间运行。该操作以摊销的 固定时间 运行,即,添加n个元素需要O(n)时间。所有其他操作均以线性时间运行(大致而言)。与LinkedList实现相比,常数因子较低。 http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.htm