数据结构 ——— 常见的时间复杂度计算例题(上篇)

目录

前言

例题1:

例题2:

例题3:

例题4:


前言

在上一章讲解了时间复杂度的概念,以及用 大O的渐进表示法 表示 时间复杂度

数据结构 ——— 算法的时间复杂度-CSDN博客

接下来利用C语言代码的例题,更深一步的掌握用 大O的渐进表示法 表示 代码的时间复杂度


例题1:

代码演示:

void Func1(int N)
{
	int count = 0;

    // 循环1
	for (int k = 0; k < 2 * N; k++)
	{
		count++;
	}
	
	// 循环2
    int M = 10;
	while (M--)
	{
		count = count + 1;
	}
}

问:计算 Func1 函数的时间复杂度?

代码解析:

循环1 执行了 2*N 次,循环2 执行了 10 次 

时间复杂度函数式:F(N) =  2*N + 10

根据大O的渐进表示法的规则:只保留最高阶项(除去 F(N) 中的10) ;如果最高阶项存在且不是1,则去除与这个项目相乘的常数(除去 F(N) 中的2),得出大O的渐进表示法

大O渐进表示法:O(N)


例题2:

代码演示:

void Func2(int N, int M)
{
	int count = 0;

	// 循环1
	for (int k = 0; k < N; k++)
	{
		count++;
	}

	// 循环2
	for (int k = 0; k < M; k++)
	{
		count++;
	}
}

问:计算 Func2 函数的时间复杂度?

代码解析:

循环1 执行了 N 次,循环2 执行了 M 次

时间复杂度函数式:F(N) =  N + M

根据大O的渐进表示法的规则:N 和 M 都是平阶,且不是常数,所以都要保留下来,得出大O的渐进表示法

大O的渐进表示法:O(N + M)


例题3:

代码演示:

void Func3(int N)
{
	int count = 0;

	// 循环1
	for (int k = 0; k < 100; k++)
	{
		count++;
	}
}

问:计算 Func3 函数的时间复杂度?

代码解析:

循环1 执行了 100 次

时间复杂度函数式:F(N) = 100

根据大O的渐进表示法的规则:用常数1取代运行时间中的所有加法常数( F(N) 中的 100 取代为1),得出大O的渐进表示法

大O的渐进表示法:O(1)

注意:O(1) 并不是代表代码只执行了 1 次,而是代表代码执行了常数次


例题4:

代码演示:

const char* Find_Str_Element(const char* str, int character)
{
	while (*str != '\0')
	{
		if (*str == character)
			return str;
		else
			str++;
	}

    return NULL;
}

问:计算 Find_Str_Element 函数的时间复杂度?

代码解析:

例题4 代码的意思是:在 str 字符串中找出和 character 相同的元素,如果找到了就返回 character 位置的指针,如果 str 字符串遍历完了都没有找到就返回 NULL

但是 例题4 代码的运行次数并不是像 例题1、2 一样,固定执行 N 次 或者 N + M 次,而是要分情况看待:

最好情况:character 元素是 str 字符串首元素,程序执行 1 次 

中间情况:character 元素是 str 字符串中间元素,程序执行 N/2 次

最坏情况:character 元素是 str 字符串尾元素 或者 str 中没有 character ,程序执行 N 次

注意:在实际中一般情况关注的是算法的最坏运行情况(底线思维,做最坏的打算)

所以 str 字符串查找 character 元素的时间复杂度为:O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值