1.算法就是解决问题的方法
2.例:1+2+3+4+5……+1000
(1).累加法:一个一个的加
(2).利用等差数列求和公式直接算出答案
3.如何判别算法的优劣?
(1).通过时间复杂度来进行判别
4.算法的时间复杂度是如何计算出来的?(重点)
(1).时间复杂度是研究数据总量x和算法执行次数y之间的关系
y = an + b(a是系数,b是常数),如果n非常大——>y = n(算法执行次数和数据总量直接相关)
——>O(n)
y = an^2 + bn + c(ab是系数,c是常数),如果n非常大——>y = n^2(算法执行次数和数据总量的平 方直接相关)————>O(n^2)
y = a(a是常数),——>算法的执行次数和数据总量没有任何关系———>O(1)
y = logn——>算法的执行次数和数据总量存在log别的关系——>O(logn)
例子:
void fun(int n){
int i = 1;
while (i<n){
i = i*2;
}
}
时间复杂度是研究:数据总量n和执行次数y之间的关系
第一轮:i = 1
第二轮:i = 2
第三轮:i = 4
第四轮:i = 8
第五轮:i = 16
…………
第y轮: i = 2^(y-1) = n
2^y = n ————>y = log2n
答:o(logn)
void fun(int n){
int i = 0;
while (i*i*i<n){
i++;
}
}
时间复杂度是研究:数据总量n和执行次数y之间的关系
第一轮:i = 0
第二轮:i = 1
第三轮:i = 2
第四轮:i = 3
第五轮:i = 4
…………
第y轮: i = (y-1)
(y-1)*(y-1)*(y-1) = n
y^3 = n
y = n^1/3
答:O(³√n)
x = 2;
while(x<n/2){
x = x * 2;
}
第一轮:x = 2
第二轮:x = 4
第三轮:x = 8
第四轮:x = 16
第五轮:x = 32
…………
第y轮: x = 2^y
2^y = n——>y = log₂n
答:O(logn)
x = 0;
while (n>(x+1)*(x+1)){
x = x + 1;
}
第一轮:x = 0
第二轮:x = 1
第三轮:x = 2
第四轮:x = 3
第五轮:x = 4
…………
第y轮: x = y - 1
y*y = n——>y^2= n ——>y = √n——O(√n)
答:O(√n)