在开始学习前,我们需要明确:时间复杂度不存在特定的时间单位。因此我们常常抛弃一些前导的常数与一些低阶项,从而来计算大O的运行时间。由于大O是一个上界,我们绝不能低估程序的运行时间。(摘自《计算机科学丛书——数据结构与算法(java语言描述)》)
循环中的时间复杂度计算
先来看一个简单的例子
int count = 1
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
System.out.println(count);
count+=1;
}
//问System.out.println(count);语句的时间复杂度;
//可以这样理解:对于每一个外循环,内循环执行n次,而一共有n个外循环,因此时间复杂度为O(n^2)
是不是很容易理解?
我们再来看一个容易混淆的点,对上面的例子我们稍加改动:
int count = 1
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
System.out.println(count);
count+=1;
}
//可以看到j的条件发生了变化,但此算法时间复杂度仍为O(n^2)
//而事实上,j所执行的次数确实变少了,j=1+2+3+4+5+...+n=n(n+1)/2,在大O表示法中,我们其实往往会忽略常数项的存在。
来看一个需要一些数学计算的例子:
一个小小的前置知识:

int count = 1
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
for (int k=1;k<=j;k++){
System.out.println(count);
count++; }
}
}
//问System.out.println(count);语句的时间复杂度;

折半中的时间复杂度计算
常见的二分查找,或者更通俗来说,以倍数前进的时间复杂度表达式中会出现

其实不难理解,假设你原有8个数需要遍历,此时时间复杂度为O(n),而变为“乘二“或”二分”之类的,你便只需要遍历3次
顺序结构中的算法复杂度计算:
将各个语句的运行时间求和即可(这意味着,其中的最大值就是所得的运行时间)
int count = 1
for (int i=1;i<=n;i++){
System.out.println(count);
count++;}//此段时间复杂度为O(n)
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
System.out.println(count);
count+=1;}}//此段时间复杂度为O(n^2)
//取大值即可
if-else语句中的算法复杂度计算:
原则:一个if-else语句的运行时间从不超过判断的运行时间再加上(if 后语句,else后语句)中运行时间长者的总的运行时间。
if(n>=0){
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
System.out.println("输入数据大于等于0");}}}
else{
for (int i=1;i<=n;i++){
System.out.println("输入数据小于0");
}
由上所述的原则可知该算法复杂度为O(n^2)。