参考:一套图搞懂“时间复杂度”
时间复杂度的定义说简单点就是估算一下基本操作的执行次数
然而我就成了知道这个道理却仍然计算不出算法复杂度的。。。媛
看完之后自己进行了一定的总结
归纳最常见的几种:
1.O(1)
根据所参考的博文,其实就是:一个鸡腿吃2天,吃完它需要几天?
答: 2天
tips: 一般情况就是没有循环。直接运行下去这个可计算的次数,就是O(1)了
// Ada
void simple() {
printf("Hello~");
return 0;
}
2.O(n)
仍然根据参考博文。其实就是,一跟油条能吃10口,2天吃1口,几天能吃完?
答:2 * 10 = 20 天
tips: 这里就是涉及到了最简单的单层循环。没满足条件继续执行内容。条件仅是以单纯的递增或递减方式
// Ada
for(int i = 0; i < 10; i++) {
printf("我是咬的第一口~\n");
printf("我是咬的第二口~\n");
}
3.O(lognN)
tips: 这里不举例子。主要是每次这里都有点糊涂,看完举的例子后也没豁然开朗。但很明显这里看循环的增长方式。第二个是递增或递减。这里是相乘或相除。也就是递增方式前一个是按照线性方式增长,这里是按照对数方式。放代码直接运算
// Ada
for(int i = 1; i < 10; i*=2) {
printf("我是咬的第一口~\n");
printf("我是咬的第二口~\n");
}
** 设总运行次数是k.则2k = 10; 即 k = log210;
4.O(n2)
tips: 这里就是二重循环了。二重循环就会得到次数相乘的形式。因为外层每累加一次,内层就循环自身全部次数
// Ada
for(int i = 0; i < 10; i ++) {
for(int j = 0; j < 3; j++) {
printf("我是咬的第一口~\n");
printf("我是咬的第二口~\n");
}
}
** 设总次数k次,外层10次,每外层一次内层就3次,因此总次数是10 * 3 = 30次
4.O(nlog2n)
tips: 其实就是二重循环,一层的改变方式是乘,得到log。另一层的改变方式是加,得到n
// Ada
for(int i = 0; i < 10; i *= 2) {
for(int j = 0; j < 3; j++) {
printf("我是咬的第一口~\n");
printf("我是咬的第二口~\n");
}
}
** 设总次数k次,外层log210次,每外层一次内层就3次,因此总次数是log210 * 3 次
总结
不循环,O(1)
单层加减O(n)来
仍单层,换乘除,时刻记得O(logN)
两层循环没话说 次数相乘会出现