我在这里是全新的,我正在与之抗争的是理解Big-oh符号概念。最近我在我的学校开始了“数据结构和算法”课程,而Big-oh这个词对我来说非常不合情理。我在网上搜索了很多关于这个主题的内容,但没有一个解释让我满意。 然而,我认为用一个例子理解符号可能比用简单的英语解释它好得多。
以下两个for循环我作为练习目的。 你能解释那些时间的复杂性(用大符号表示)并解释它是如何形成的吗?
(a)中
for (int i = 1; i <= n; i+=2) {
for (int j = 1; j <= n; j++)
int temp = i * j;
}
(b)中
for(int i = 1; i <= n; i*=2){
for (int j = 1; j <= n; j++){
int temp = i * j;
}
答案 0 :(得分:6)
查找行int temp = i*j
执行的总次数,作为输入参数n
的函数。从该函数中丢弃除了最快上升项之外的所有内容,并从中删除任何线性系数。您只对该术语的种感兴趣(常数,对数,线性,二次, n - 幂,指数等)
在(a)中,这将是n 2 。在(b)中它将是n * log(n)。这是你的大O复杂性。
作为技术旁注,在即时编译之后,HotSpot JVM上执行的代码的实际时间复杂度将零,因为编译器可以毫不费力地实现代码没有效果。它将完全删除它。
答案 1 :(得分:0)
循环体不是很有意义,但让我们忽略......
A)
你做(n / 2)* n次操作。如果你知道哦符号是什么,很明显。为O(n ^ 2)。
b)中
您执行大约log2(n)* n次操作(您必须将n加倍才能增加i
处理的数量)。 O(nlogn)。
你知道吗,怎么得到这个&lt;