出处: 算法第四版 Edition Sedgewick 著,问题 1.4.7

三道小题初看觉得很简单,但是仔细一分析,a、b小题里面的内循环操作次数是和外层的n、i值有关,并不是简单的操作N次,很久没有算过时间复杂度了,稍微感到有点棘手。

    public static void fa(int N) {int sum = 0;for (int n = N; n > 0; n /= 2) {for (int i = 0; i < n; i++) {sum++;}}System.out.println(sum);}public static void fb(int N) {int sum = 0;for (int i = 1; i < N; i *= 2) {for (int j = 0; j < i; j++) {sum++;}}System.out.println(sum);}public static void fc(int N) {int sum = 0;for (int i = 1; i < N; i *= 2) {for (int j = 0; j < N; j++) {sum++;}}System.out.println(sum);}

从直觉上来说a和b的操作次数是差不多的,但是实际代码运行两者差别很大

答案和做法

a小题

如果按照通常的方法,分析for有多少个,那么分析起来会很痛苦,外层循环是O(logN)O(logN)O(logN)的操作很容易看出来,但是第二个for,i和n是挂钩的,这个时候通常的方法就不起作用了。
换一种思路,先写一下sum++操作的运行次数
N N/2 N/4 ... 1 ,这实际上是一个等比为2的等比数列,我们把这个数列记为L,它的项数为n
注意到第n项等于1,而L的首项是N,那么1=N∗21−n1=N*2^{1-n}1=N∗21−n,得出n=log2(N)+1n=log_2(N)+1n=log2​(N)+1

对L用等比公式求和,Sn=N∗1−(12)n1−12S_n=N*\frac{1-(\frac{1}{2})^n}{1-\frac{1}{2}}Sn​=N∗1−21​1−(21​)n​ =N(2n−1)N(2^n-1)N(2n−1),把n带入,化简即可得到2N−12N-12N−1

也就是说内循环的总操作次数是2N,那么它其实就是O(N)O(N)O(N)级别的算法

b小题

b小题其实和a小题很相似,只不过b的数列变为
1 2 4 … N,等比为2,同样是n项
n同样等于log2(N)+1log_2(N)+1log2​(N)+1,因为2n−1=N2^{n-1}=N2n−1=N

而L的和 Sn=N∗1−2n1−2S_n=N*\frac{1-2^n}{1-2}Sn​=N∗1−21−2n​ =N(2n−1)=2N−1N(2^n-1)=2N-1N(2n−1)=2N−1,
那么b也是O(N)O(N)O(N)级别的算法

c小题

c小题用常规的做法做即可,c是O(NlogN)O(NlogN)O(NlogN)级别的算法

解释一下a,b同为O(N)级别的算法,为什么它们实际操作次数却不一样,因为O(N)取的是近似值,剩余的较低次项都被忽略了,但是实际计算中低次项的次数同样很关键,因此a,b的执行次数会不一样

参考:
https://github.com/reneargento/algorithms-sedgewick-wayne/issues/9
https://math.stackexchange.com/questions/401937/how-is-nn-2n-4-1-equal-to-2n-1-using-the-formula-for-geometric-series
https://stackoverflow.com/questions/29966730/order-of-growth-of-as-function-of-n

三道计算时间复杂度的题目相关推荐

  1. 主项定理Master Method 计算时间复杂度

    在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们:  T(n) = a * T(n/b) + f(n)   ( a  ³  1,b  >  1,f(n)一般是个简单函数)这样的递归方 ...

  2. 你还在为时间复杂度不懂而担心吗???赶紧进来,这里手把手教你计算时间复杂度!!!

    作者:低调 作者宣言:写好每一篇博客 文章目录 前言 一.什么是时间复杂度? 1.1时间复杂度的概念 1.2复杂度计算在算法的意义 1.3如何计算常见算法的时间复杂度? 二.常见时间复杂度计算举例 三 ...

  3. 解读PMP考点:PMP考试中关于合同计算类型的题目

    解读PMP考点:PMP考试中关于合同计算类型的题目 1.一个总价加激励费用FPIF合同.合同规定目标成本为$120000,承包商的目标利润为$10000,价格上限为$140000,客户/承包商以80/ ...

  4. 计算时间复杂度--(简单版)

    步骤: 1.找到执行次数最多的语句 2.语句执行语句的数量级 3.用O表示结果 计算时间复杂度的3个出发点,掌握这三个出发点,那么一向搞不懂的时间复杂度就可以迎刃而解啦. 然后: 1.用常数1取代运行 ...

  5. 数据结构中常见的时间复杂度分析题目

    数据结构中常见的时间复杂度分析题目 时间复杂度基本概念 例如上面的代码,我们可以表示成T(n) = O(f(n)),而f(n) = 2n + 3.我们使用大O表示法可以写为T(n) = O(n). 分 ...

  6. [DAY001]考研数学极限的计算知识点与题目总结(一)

    内容说明:1. 博文绝大部分题目来自2022版武忠祥老师<十七堂课>,少部分来自宇哥的2022讲义2. 博文习题难度中下,计算量偏大,部分题目计算量极其巨大3. 勤练兵,常磨刀,瓜瓜要上岸 ...

  7. python计算三角形面积题目

    题目------ 代码------ # 程序设计: # 一.编写一个三角形类(注意三边之间的关系). # 1.包含计算三角形的面积方法 # s=根号下:p(p-a)(p-b)(p-c) 其中p=1/2 ...

  8. [DAY003]考研数学极限的计算知识点与题目总结(三)

    十多天没更了,中间做了一点其他的事情,看来要来一点额外的Pressure了. 干杯, 朋友 就让那一切成流水 把那往事 把那往事当作一场宿醉 明日的酒杯莫再要装着昨天的伤悲 请与我举起杯 跟往事干杯内 ...

  9. 学分绩点计算编程java_题目1133:学分绩点 (C++/Java)

    题目描述: 北京大学对本科生的成绩施行平均学分绩点制(GPA).既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算. 公式如下: 实际成绩 绩点 90--100 4.0 85--89 3. ...

最新文章

  1. 【第二篇】Volley的使用之加载图片
  2. orb-slam评价
  3. 浅谈SD-WAN未来的发展方向
  4. 负样本修正:CVR预估时间延迟问题
  5. 玩聚SR和FriendFeed的区别
  6. 二叉树的左右子树交换
  7. Where is ABAP Netweaver HTTP 304 not modified set
  8. ObserveIT Client安装后屏幕延迟问题
  9. 网络编程之 传输层的协议TCP与UDP
  10. 《Python编程从入门到实践》记录之类存储在模块及其导入
  11. 阿里云IoT安全运营中心-Link SOC,安全运营托管功能发布
  12. PSP完美手感十字键改造超详细攻略
  13. 多一个渠道,多一份收益!
  14. 维控plc解密 维控程序文件密码 工程密码 子程序密码搞定
  15. linux后加网卡,Linux添加网卡教程
  16. python热度评价指标_文本相似性热度统计方案(python版)
  17. 【报告分享】2021小红书品牌投放产品介绍-小红书(附下载)
  18. GAMIT重新编译及升级
  19. Origin | 一个X对应多个Y的折线图
  20. tcp协议通过什么来区分不同服务器,tcp协议通过什么来区分不同的连接

热门文章

  1. 12 图形数据库是什么?
  2. c语言实现路由器原理,无线路由器天线原理图 无线路由器天线接入与工作原理...
  3. 【程序员必修数学课】-基础思想篇-数学归纳法-如何用数学归纳提高代码效率
  4. 抓包神器TCPDUMP的分析总结-涵盖各大使用场景、高级用法
  5. 为什么Vue项目总是在1024端口启动?
  6. Python 重命名文件或目录(os.rename)
  7. 【Web】Monit监控程序使用
  8. 机器人工程师的成长之路
  9. 加入购物车 如果已有商品 数量++
  10. Win10家庭版不支持“本地用户和组”,如果要支持需要升级到专业版