01 – 算法的时间复杂度案例

一、时间复杂度案例

时间复杂度-事前预估算法时间开销与问题规模的关系

算法1:逐步递增型

// 算法1:逐步递增型
void loveYou(int n)
{
	int i = 1; // 执行一次
	while (i <= n)  // 执行3001次
	{
		i++;
		printf("I Love You %d\n", i); // 执行3000次
	}
	printf("I love you more than %d\n", n);  //执行1次
} 


int main()
{
	int n = 10;
	loveYou(n);
	return 0;
}

以下是部分代码执行结果:

01 - 算法的时间复杂度案例

注意点:这里判断语句while要比printf()多执行一句,时间复杂度T(3000)= 1+3001+2*3000+1,用大O表示法:T(n) = O(n)。


算法2:嵌套循环型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>、

// 算法2:嵌套循环型
void loveYou(int n)
{
	int i = 1; // 执行一次
	int count = 0;
	while (i <= n)  // 外层执行n次
	{
		i++;
		printf("I Love You %d\n", i); 
		for (int j = 1; j <= n; j++)
		{
			printf("I am Iron Man\n"); // 内层循环执行n*n
			count++;
		}
	}
	printf("I love you more than %d\n", n);
	printf("count=%d\n", count);
}


int main()
{
	int n = 10;
	loveYou(n);

	return 0;
}

以下是部分代码执行结果:

01 - 算法的时间复杂度案例

注意点:这里的时间规模T(n) = O(n) + O(n2) = O(n2)


算法3:指数递增型

#include <stdio.h>

// 算法3:指数递增型
void loveYou(int n)
{
	int i = 1; // 执行一次
	int count = 0;
	while (i <= n)  // 外层执行n次
	{
		i = i*2; //每次翻倍
		printf("I Love You %d\n", i);
		count++;
	}
	printf("I love you more than %d\n", n);
	printf("count=%d\n", count);
}


int main()
{
	int n = 100;
	loveYou(n);

	return 0;
}

以下是部分代码执行结果:

01 - 算法的时间复杂度案例

计算上述时间复杂度T(n):

设最深层循环的语句频度(总共循环的次数)为 x,(这里相当于x个2相乘)

由循环条件可知,循环结束时 2x > n 跳出循环

x > log2n

x是执行次数, 所以 x = log2n+1 跳出循环

综上所述:时间复杂度T(n) = O(x) = O(logn)


算法4 :数字搜索型

情形1:最好的时间复杂度(n = 1)

void loveYou(int flag[],int n)
{
	int i = 0; // 执行一次
	int count = 0;

	printf("I am a superman %d\n");
	
	for (int i = 0; i < n;i++)
	{
		if (flag[i] == n)
		{
			printf("I love you %d\n");
			break;
		}
		count++;
	}
	printf("count=%d\n", count);
}


int main()
{
	int flag[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 1;
	loveYou(flag,n);

	return 0;
}

以下是执行结果:以下是执行结果:

01 - 算法的时间复杂度案例

情形2:最坏时间复杂度( n = 10)

以下是执行结果:

01 - 算法的时间复杂度案例

情形3:平均复杂度(元素n在任意一个位置的概率相同,即1/n)

循环次数X = (1+2+3+……+n) * 1/n = (1+n)/2

关于数据结构中时间复杂度汇总

算法类型时间复杂度备注
线性查找(O(n))顺序查找
二分查找(O(\log n))仅适用于有序数组
冒泡排序(O(n^2))最好情况 (O(n))(提前终止)
插入排序(O(n^2))最好情况 (O(n))(近乎有序)
快速排序平均 (O(n \log n)),最坏 (O(n^2))基于分治,常用且高效
归并排序(O(n \log n))稳定排序,空间复杂度 (O(n))
堆排序(O(n \log n))原地排序(空间 (O(1)))
Floyd-Warshall(O(n^3))多源最短路径
斐波那契递归(O(2^n))低效,可用迭代优化为 (O(n))

关于时间复杂度的几个结论

  • 结论1:可以只考虑阶数高的部分
  • 结论2:问题规模足够大时,常数项系数也可以忽略
  • 结论3:加法规则-只保留高阶项
  • 结论4:乘法规则-都保留
  • 结论5:顺序执行的代码只会影响常数项,可以忽略
  • 结论6:只需要挑循环中的一个基本操作分析它的执行次数与问题规模n之间的关系即可
  • 结论7:如果有多层嵌套循环,只需关注最深层循环了几次
  • 结论8:算法的性能问题只有在问题规模n很大的时候才会暴露出来

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(7)
何大锤的头像何大锤管理团队

相关推荐

  • C语言初阶 – 指针

    一、指针是什么? 指针是什么? 指针理解的2个要点: 1、指针是内存中一个最小单元(内存单元)的编号,也就是地址 2、平时口语中说的指针,通常是指针变量,用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量 那么我们就这样理解:内存 指针变量 我们可以通过&(取地址操作符)取出变量的内存地址,把地址可以存放到一个变量中,这个变…

    2025年6月29日
    000
  • 09 通讯录管理系统

    通讯录管理系统 1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C++来实现一个通讯录管理系统 系统中需要实现的功能如下: 2、创建项目 创建项目步骤如下: 2.1 创建项目 打开vs2017后,点击创建新项目,创建新的C++项目 填写项目名称,选择项目路径 2.2添加文件 添加成功后,效果如图: 至此,项目已创建完毕 3、菜单功能 …

    2025年6月22日
    300
  • 08 结构体

    8 结构体 8.1 结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 8.2 结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: 示例: 总结1:定义结构体时的关键字是struct,不可省略 总结2:创建结构体变量时,关键字struct可以省略 总结3:结构体变量利用操作符 &…

    2025年6月21日
    300
  • 07 指针

    7.1 指针的基本概念 指针的作用: 可以通过指针间接访问内存 7.2 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名; 示例: 指针变量和普通变量的区别 总结1: 我们可以通过 & 符号 获取变量的地址 总结2:利用指针可以记录地址 总结3:对指针变量解引用,可以操作指针指向的内存 7.3 指针所占内存空间 提问:指针也是种数据类型…

    2025年6月20日
    300
  • 第2章 C语言概述

    一、复习题 1、C语言的基本模块是什么? 它们都叫函数 2、什么是语法错误?写一个英语例子和C语言例子 3、什么是语义错误?写一个英语例子和C语言例子 4、Indiana Sloth编写了下面的程序,并征求你的意见。请帮助他评定 第一行没有加<> 赋值语句错误 函数错误应该是printf 花括号不齐全 二、编程练习 2.1 2.2 2.3 编写一…

    2025年6月20日
    000

发表回复

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

评论列表(1条)

  • minnie的头像
    minnie 2025年5月25日 下午6:01

    好厉害的一个网站赞喝彩

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......