时间复杂度问题

本文详细介绍了算法中的时间频度和时间复杂度概念,它们用于衡量算法效率。时间频度T(n)表示语句执行次数,而时间复杂度通过分析T(n)随问题规模n的变化趋势来评估算法性能。常见的时间复杂度有O(1), O(logn), O(n), O(nlogn), O(n^2), O(n^3)等,并通过实例解析了如何判断程序的时间复杂度。此外,还列举了八大排序算法的时间复杂度,帮助读者深入理解不同排序算法的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间频度

一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

时间复杂度

前面提到的时间频度T(n)中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律,为此我们引入时间复杂度的概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称时间复杂度。

时间复杂度-->时间频度

算法执行时间∝算法执行次数

时间复杂度大小关系大致:o(1)<o(logn)<o(n)<o(nlogn)<o(n^2)<o(n^3)<...

怎么判断程序的时间复杂度

  • 快速的判断时间复杂度
    • 确定问题规模n
    • 循环减半过程
    • k层关于n的循环--->n^k
  • 复杂情况:根据算法执行过程判断

O(1)

int n = 1;
System.out.println(n);
int m = 1;
System.out.println(m);
System.out.println(m+1)
System.out.println(m+2)

O(log(n))

for (int i = 0; i < n; i = i * 2) {
    count++;//这里是以2为底n的对数
}

O(n)

for (int j = 0; j < n; j++) {
    count++;
}

O(n*2)

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
         count++;
    }
}

O(nlog(n))

int count = 0;
for(int i = 1;i<n;i++){
    for(int j=1;j<=2*i;j++){
         count++;
    }
}

 如果直接看不能看出规律可以带入几个值看执行次数,画图看和四种图像那个相似,就是那种时间复杂度

时间复杂度例题讲解

void fun(int n){
    int i=0;s=0;
    while(s<n){
        ++i;
        s = s +i;  
    }
}

基本算法:s=s+i;

第一次执行:s=1

第二次执行:s=3

第三次执行:s=6

第四次执行:s=10

第五次执行:s=15

...

第t次执行:s=t(t+1)/2

s<n

t^2<n,即t<n^1/2

时间复杂度为o(n^1/2)

int func(int n){
    if(n<=1)
    	return 1;
     else
          return n*func(n-1)
}

基本算法:执行次数=n;

第一次执行:执行1次;

第二次执行:执行2次;

第三次执行:执行3次;

第四次执行:执行4次;

第五次执行:执行5次;

t=n

时间复杂度为o(n)

void func(int n){
    i = 1;
    while(i<n){
        i  = i*3;    
    }
}

基本算法:i  = i*3;

第一次执行:i=3;

第二次执行:i=9;

第三次执行:i=27;

第t次执行:i=3^t

3^t<n  t<log3(n)   

时间复杂度o(log3n)

for(int i=1;i<=n;i++){
    for(int  j =1;j<=i;j++){
        for(int  k =1;k<=j;k++){
            count ++;    
        }
    }
}

n=1;执行1次

n=2;执行8次

n=3;执行27次

n=t;执行t^3

时间复杂度为o(n^3)

for(int i=1;i<=n;i*=2){
	count ++;
}

n=1;count执行1次;

n=2;count执行4次;

n=3;count执行8次;

n=t;count执行2^t次;

2^t<n  t<log2n

时间复杂度o(logn)

int func(int n){
	int i =0 ,sum = 0;
	while(sum < n){
	  sum += ++i;
	}
	return i;
}

n=1;sum=1

n=2;sum=1+2

n=3;sum=1+2+3

n=4;sum=1+2+3+4

n=t;sum=1+2+3+...+t(为一的等差数列)

sum<n

t+t(t-1)/2<n

t<n^1/2

时间复杂度为o(n^1/2)

void fun(int n){
    int i = 0;
    while(i*i*i <= n){
        i++;    
    }
}

n=1;0*0*0

n=2;1*1*1

n=3;2*2*2

n=t;(t-1)*(t-1)*(t-1)

(t-1)^3<=n

t<n^1/3

时间复杂度为o(n^1/3)

x = 0;
while(n>=(x+1)*(x+1)){
    x = x + 1;
}

n=1;1*1

n=2;2*2

n=3;3*3

n=t;t*t

t^2<=n

t<n^1/2

时间复杂度为o(n^1/2)

for(i=0;i<n;i++){
    for(j =0;j<m;j++){
         a[i][j] = 0;
    }
}

第一层for循环执行n次,第二层for循环执行m次

时间复杂度为o(n*m)

int m = 0,i,j;
for(i = 1;i<n;i++){
    for(j=1;j<=2*i;j++){
         m++;
    }
}

第一层for循环执行n次,第二层for循环执行logn次

时间复杂度为o(nlogn)

int count=0;
for(int i=1;i<=n;i*=2){
    for(int j=1;j<=i;j++){
        count++;    
    }
}

i=1  执行1次

i=2  执行3次

i=4  执行7次

i=8  执行15次

i=16  执行31次

i=32  执行63次

 时间复杂度为o(n)

八大排序的时间复杂度:

冒泡排序:O(n^2)

简单选择排序:O(n^2)

插入排序:O(n^2)

希尔排序:O(nlogn)

堆排序:O(nlogn)

基数排序:O(kn)

归并排序:O(nlogn)

递归排序:O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值