鱼C论坛

 找回密码
 立即注册
查看: 2240|回复: 8

关于这个算法的时间复杂度

[复制链接]
发表于 2018-9-17 17:53:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. int solve(int left, int right)
  2. {
  3.         if(left == right)
  4.                 return num[left];

  5.         mid = (left + right) / 2;
  6.         lans = solve(left, mid);
  7.         rans = solve(mid + 1, right);

  8.         sum = 0, lmax = num[mid], rmax = num[mid + 1];
  9.         for(i = mid; i >= left; i--) {
  10.                 sum += num[i];
  11.                 if(sum > lmax) lmax = sum;
  12.         }
  13.         sum = 0;
  14.         for(i = mid + 1; i <= right; i++) {
  15.                 sum += num[i];
  16.                 if(sum > rmax) rmax = sum;
  17.         }

  18.         ans = lmax + rmax;
  19.         if(lans > ans) ans = lans;
  20.         if(rans > ans) ans = rans;
  21.         return ans;
  22. }

  23. int main(void)
  24. {
  25.         scanf("%d", &n);
  26.         for(i = 1; i <= n; i++)
  27.                 scanf("%d", &num[i]);

  28.         printf("%d\n", solve(1, n));
  29.         return 0;
  30. }
复制代码


我算出了是这是O(n^2)的时间复杂度,但是感觉不对,应该怎么算呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-17 20:48:18 From FishC Mobile | 显示全部楼层
不会是 n^2。
一开始折半,logn
后面两个循环,但分别遍历的只有数组的一半,n
所以只有 n + logn,大欧只有 n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-17 21:31:46 | 显示全部楼层
claws0n 发表于 2018-9-17 20:48
不会是 n^2。
一开始折半,logn
后面两个循环,但分别遍历的只有数组的一半,n

那应该是O(nlogn)吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-17 22:04:15 From FishC Mobile | 显示全部楼层
御笔剑客 发表于 2018-9-17 21:31
那应该是O(nlogn)吧

不会,递归在前面,if 左右相等,即只有一个元素时,返回,遍历只有一次。前面的递归感觉好费,其实就是第一个元素和 mid+1 吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-17 22:05:49 | 显示全部楼层
claws0n 发表于 2018-9-17 22:04
不会,递归在前面,if 左右相等,即只有一个元素时,返回,遍历只有一次。前面的递归感觉好费,其实就是 ...

总时间应该是:T(n)=2T(n/2)+f(n) 吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-17 22:22:12 From FishC Mobile | 显示全部楼层
御笔剑客 发表于 2018-9-17 22:05
总时间应该是:T(n)=2T(n/2)+f(n) 吧

我没这样算,反正你要的是上限。你这个算法会是 nlogn 吧?
你看 lans 是递归,所以不会往下走,直到 if,退出。才来执行 rans,同理...。之后才遍历,所以两者是独立的。
你的 mid 是局部变量吧?两个递归完后会变回 (1+n)/2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 11:07:41 From FishC Mobile | 显示全部楼层
御笔剑客 发表于 2018-9-17 22:05
总时间应该是:T(n)=2T(n/2)+f(n) 吧

看漏了,是 nlogn,但是计算的方式不像是那么简单。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-18 14:59:42 | 显示全部楼层
claws0n 发表于 2018-9-18 11:07
看漏了,是 nlogn,但是计算的方式不像是那么简单。

设执行时间为k次,然后多次迭代,k=log2n,应该就算出来是nlogn了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 15:04:22 From FishC Mobile | 显示全部楼层
御笔剑客 发表于 2018-9-18 14:59
设执行时间为k次,然后多次迭代,k=log2n,应该就算出来是nlogn了

对,如果说是看大体的话,但是我看了累加的次数,非常不对称,并不是单纯的 2 4 8 这种折半的遍历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表