出处: 算法第四版 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. 对于正交频分复用的异构网络的理解
  2. ISIS—BGP—VRRP 城域网典型架构图 拓扑实验
  3. BASIC-1 闰年判断
  4. JS编写一个函数,实现传入一个不定长度字符串,查找出重复次数前n名的字符并分别统计其次数
  5. dijkstra java pre_Dijkstra算法实现
  6. bind 启动redis_详解Redis开启远程登录连接
  7. theano java_Theano:调用Theano函数的论据
  8. 5G NR随机接入过程
  9. C# 小数点后保留两位小数
  10. 【原创】领导力文化-译稿
  11. 【Android应用】 苏州实时公交
  12. nib和itk读取nii数据的差异——一个自己调了半天的bug复盘
  13. Java 找出1000以内所有的完数
  14. Swift语言和其他计算机语言的比较
  15. ChatGPT通过谷歌L3入职测试,拿到18万美元offer?程序员们该何去何从?
  16. 2021杭州(准)独角兽企业
  17. Warcraft III 守望者的烦恼
  18. 作为精益敏捷根基的科学管理与福特、大野耐一、戴明、德鲁克
  19. 零基础小白如何提高学Python的效率?
  20. 实用统计软件(SAS)练习题(一)

热门文章

  1. 从指南针到动手搭建自己的第一台计算机
  2. 初级日语|日语助词有哪些?作用是什么?
  3. multer 文件上传系统在express中的使用
  4. 计算机专业求职指南:如何打造出色的技能组合
  5. 西航职院计算机工程学院,西航职院 | 计算机工程学院组织召开2019级新生见面会...
  6. 全能计算机怎么玩游戏,新买的电脑配置很好 ,测验玩游戏全能玩 。但是进入游戏后fps很低 不是很高 有点卡 是不是...
  7. 百度地图API实现自动定位城市,省市二联重新地图重新定位
  8. 车牌识别SDK,解决多行业全方位方案
  9. 【线性代数05】行列式的性质和应用
  10. 0代码搭建数据大屏技术 - 观远(AI+BI)商业智能数据分析平台