在书上突然看到的```很郁闷``不知道它是个什么东西``
常见的Big-oh
对于比较2个不同的时间复杂度,千万不可以用直观的方法来判断。例如有2种算法,时间复杂度各为O(n)与O(n2)。如果这2种方法的实际执行次数T'(n)=2n,T"(n)=n2,则n>2时,2n<n2,对时间复杂度而言,O(n)优于O(n2)(所谓"优于",就是所花的时间较少)。注意!当n≦2时2n≧n2,则O(n2)优于O(n)。由上面的说明,我们可以清楚知道时间复杂度事实上只表示实际次数的一个量度的层级,并不是真实的执行次数。此外,有关目前常见的Big-oh有下列几种情形:
1.O(1)或O(c):称为常数时间(constant time)
这表示算法则的执行时间是一个常数倍,而忽略数据集合大小的变化。一个例子是在计算机中它存取RAM所花的时间,在内存中去读取及写入所用的时间是相同的,而不考虑整个内存的数量。如果有这样的算法则存在,则我们可以在任何大小的数据集合中自由的使用,而不需要担心时间或运算的次数会一直成长或变得很高。
2. O(n):称为线性时间(linear time)
它执行的时间会随数据集合的大小而线性成长。我们可以找到一个例子是在一个没有排列过的资料集中要找一个最大元素,且我们以简单的方式去解释其内容,直到我们将所有的数据都找过并且找到最大值为止。
3.O(log2n):称为次线性时间(sub-linear time)
这一种函式的成长速度比线性的程序还慢,而此常数(它是不成长的)的情形还快。
4.O(n2):称为平方时间(quadratic time)
算法则执行时间会成二次方的成长,这种会变得不切实际,特别是当数据集合的大小变得很大时。
5.O(n3):称为立方时间(cubic time)
6.O(2n):称为指数时间(exponential time)
7.O(n1og2n)
介于线性及二次方成长的中间之行为模式。