三道计算时间复杂度的题目

三道计算时间复杂度的题目出处 算法第四版 EditionSedge 著 问题 1 4 7 三道小题初看觉得很简单 但是仔细一分析 a b 小题里面的内循环操作次数是和外层的 n i 值有关 并不是简单的操作 N 次 很久没有算过时间复杂度了 稍微感到有点棘手 publicstatic intN intsum 0 for intn N n gt 0 n 2 for inti 0 i lt

出处: 算法第四版 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小题

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






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

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

b小题

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

c小题

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228935.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:51
下一篇 2026年3月16日 下午5:51


相关推荐

  • iPhone越狱cydia源大全

    iPhone越狱cydia源大全越狱后如何添加 cydia 源及 cydia 源大全 希望对大家能有所帮助 工具 原料 cydia 步骤 方法越狱后添加 cydia 源进入 Cydia 管理中找到软件源 先添加源 进入 软件源 之后点击右上角的编辑 然后点击左上角的添加 输入源的地址 1 Cydia 贴吧源 推荐 apt cydiaba cn2 HackCN 源

    2026年3月20日
    5
  • qt录制屏幕_iphone录屏转gif

    qt录制屏幕_iphone录屏转gif一、说明:不断地截取选中的区域,然后将其制作成gif动图。二、效果图:1、可设置要录制屏幕的宽高,支持右下角直接拉动改变.2、可设置变宽的宽度3、可设置录屏控件的背景颜色4、可设置录制的帧数5、录制区域可自由拖动选择三、代码:1、main.cpp#pragmaexecution_character_set(“utf-8”)#include”gifwidget.h”#include<QApplication>#include<QTe

    2026年2月4日
    7
  • 技术至简-9:什么是脉冲调制以及脉冲幅度调制PAM与脉冲编码调制PCM的区别?

    技术至简-9:什么是脉冲调制以及脉冲幅度调制PAM与脉冲编码调制PCM的区别?脉冲调制 在常规的调制中 通常使用正弦波或复指数信号作为载波 来传递基带信号 而脉冲调制是 使用矩形脉冲信号作为载波 来传递基带信号 有分为两种类型 脉冲幅度调制 PAM 与脉冲编码调制 PCMPAM 脉冲幅度调制利用连续时间的基带时域信号去调制矩形脉冲载波信号的幅度 即矩形脉冲载波信号的幅度的变化来传递连续时间的基带时域信号的幅度 因此在传输信道上 PAM 传递的是调制后的矩形脉冲信号 具体过程如下 1 采样 得到时域信号的幅度值 2 传输 在信道中 直接传递信

    2026年3月17日
    2
  • decode和encode函数_python lstrip

    decode和encode函数_python lstrip字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编…

    2022年10月6日
    7
  • Java学习笔记目录索引 (持续更新中)

    Java学习笔记目录索引 (持续更新中)Java学习路线目录索引一、Java基础(省略)Lambda表达式及函数式接口二、Java数据库MySQL一概念、DDL、DML、DQL、事务、约束等数据库设计一多表关系、三大范式JDBC一基本使用、DAO组件、连接池、JDBCTemplate三、JavaWebHTML相关学习CSS—常用属性CSS—选择器及三大特性CSS—网页的布局方式C…

    2022年5月14日
    44
  • linux 查看cuda版本

    linux 查看cuda版本nvcc V

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号