谈谈JAVA时间复杂度 – 去当CTO
时间复杂度的概念
时间复杂度
某个算法的时间耗费,关于问题规模n的函数。是总运算次数表达式中受n的变化影响最大的那一项,忽略系数。
渐近时间复杂度
当问题规模取向无穷大时,该算法时间复杂度的数量级。是评价一个算法性能的只要标准
区分
通常将渐近时间复杂度T(n)=O(f(n))称为时间复杂度,f(n)一般是算法中频度最大的语句频度。
这里的”O”是数学符号,它的严格定义是”若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C?f(n)。”用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。
时间复杂度的求值
算法中语句的频度不仅与问题规模有关,还与实例中各元素的取值有关。总考虑最坏时间复杂度。
例子
for(i=1;i<=n;i++) //循环了n*n 次,当然是O(n^2)
for(j=1;j<=n;j++)
s++;
for(i=1;i<=n;i++)//循环了(n+n-1+n-2+…+1)≈(n^2)/2 ,因为时间复杂度是不考虑系数的,所以也是O(n^2)
for(j=i;j<=n;j++)
s++;
for(i=1;i<=n;i++)//循环了(1+2+3+…+n)≈(n^2)/2 ,当然也是O(n^2)
for(j=1;j<=i;j++)
s++;
i=1;k=0;
while(i<=n-1){
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x=x+1;
另外,在时间复杂度中,log(2,n)(以2为底)与lg(n)(以10为底)是等价的 ,因为对数换底公式:
log(a,b)=log(c,b)/log(c,a)
所以,log(2,n)=log(2,10)*lg(n),忽略掉系数,二者当然是等价的
//循环了(1^2+2^2+3^2+…+n^2)=n(n+1)(2n+1)/6(这个公式要记住哦)≈(n^3)/3 ,不考虑系数,自然是O(n^3)
k+=10*i;
i++; }
for(i=1;i<=n;i++)
//循环了
n-1≈n次,所以是O(n)
设三个函数f,g,h分别为 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn
请判断下列关系是否成立:
(1) f(n)=O(g(n))
(2) g(n)=O(f(n))
(3) h(n)=O(n^1.5)
(4) h(n)=O(nlgn)
解答:
(1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。
(2)成立。与上同理。
(3)成立。与上同理。
(4)不成立。由于当n→∞时n^1.5比nlgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。
设n为正整数,利用大”O”记号,将下列程序段的执行时间表示为n的函数。
(1) i=1; k=0
while(i { k=k+10*i;i++;
}
解答:T(n)=n-1, T(n)=O(n), 这个函数是按线性阶递增的。
(2) x=n; n>1
while (x>=(y+1)*(y+1))
y++;
解答:T(n)=n1/2 ,T(n)=O(n1/2), 最坏的情况是y=0,那么循环的次数是n1/2次,这是一个按平方根阶递增的函数。
(3) x=91; y=100;
while(y>0)
if(x>100)
{x=x-10;y–;}
else x++;
解答: T(n)=O(1), 这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。
经验
有如下复杂度关系:
c(O(1)) < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!
常数阶O(1), 对数阶O(log2n), 线性阶O(n), 线性对数阶O(nlog2n), 平方阶O(n^2), 立方阶O(n^3),…, k次方阶O(n^k), 指数阶O(2^n),阶乘(O(n!)) 。
其中c是一个常量,如果一个算法的复杂度为c 、 log2N 、n 、 n*log2N ,那么这个算法时间效率比较高 ,如果是 2^n , 3^n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1) 。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称为P类问题,而把后者称为NP问题。
访问数组中的元素是常数时间操作,或说O(1)操作。一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取 O(logn)时间。用strcmp比较两个具有n个字符的串需要O(n)时间。常规的矩阵乘算法是O(n^3),因为算出每个元素都需要将n对元素相乘并加到一起,所有元素的个数是n^2。
求解步骤
找出算法中的基本语句,即执行次数最多的那个,通常是最内层循环的循环体。若算法中包含并列的循环,则将并列循环的时间复杂度相加。
计算基本语句的执行次数的数量级,即基本语句的最高次幂,忽略系数。
用O表示算法的时间性能,将基本语句执行次数的数量级放入大O记号中。
Z Pack https://bbuycialisss.com/ – Cialis Tigerfil 100 Mg Buy Cialis Louer Levitra
cialis sample Wicmymmele https://ascialis.com/# – Cialis gaideleplete Viagra In Tschechien affextop Cialis adoreakder 25 Clomid 100mg
Priligy Venta En Ecuador Wicmymmele https://asocialiser.com/ – Cialis gaideleplete Is Amoxicillin A Penicillin The Same affextop cialis buy adoreakder The Purple Pharmacy Web Site
cialis 5 mg uso diario Wicmymmele cialis on line gaideleplete Buy Mifepristone And Misoprostol Uk
http://vsdoxycyclinev.com/ – buy doxycycline hyclate 100mg acne
cheapest cialis online
This is really interesting, You’re a very skilled blogger.
I have joined your rss feed and look forward to seeking more
of your fantastic post. Also, I have shared your site in my social networks!