如何衡量算法的效率?时间复杂度&&空间复杂度

这篇具有很好参考价值的文章主要介绍了如何衡量算法的效率?时间复杂度&&空间复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇博客会讲解如何衡量一个算法的效率。衡量算法的效率,主要有2个维度,分别是:时间复杂度和空间复杂度。

  1. 时间复杂度用来衡量算法的时间效率。时间复杂度越低,算法的耗时越短,效率则越高。
  2. 空间复杂度用来衡量算法的空间效率。空间复杂度越低,算法占用的空间越小,效率则越高。

我们实现算法时,应该尽可能的降低算法的时间复杂度和空间复杂度,提升程序的效率。那么,如何计算时间复杂度和空间复杂度呢?

如何衡量算法的效率?时间复杂度&&空间复杂度

时间复杂度

时间复杂度计算的是算法执行的大致次数。举个例子:

void test(int n)
{
	int count = 0;
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			++count;
		}
	}

	for (int i = 0; i < 2*n; ++i)
	{
		++count;
	}

	for (int i = 0; i < 10; ++i)
	{
		++count;
	}
}

在函数test中,一共执行了几次++count呢?应该是n^2 + 2*n + 10次,这里为了直观,^并不表示异或的意思,而是次方的意思,比如n^2表示n的平方。

由于n^2 + 2*n + 10是一个准确的执行次数,我们称之为准确的时间复杂度函数式。一般来说,我们不会去考虑准确的时间复杂度函数式,有2个原因:

  1. 不好计算。虽然看起来我们算出了“准确”的执行次数,但是其实也不是很准确,因为还有其他的语句执行没有计算进去,比如++i,变量count的定义等。哪怕把这些语句都计算进去了,也只是C语言语句的执行次数,在编译期间,会转换为汇编语言,这些指令的执行次数你算了吗?很难吧。
  2. 不好比较。这些“准确”的式子太长了,如果有2个算法,想要比较它们的时间复杂度谁高谁低,不方便比较。

所以,时间复杂度一般采用大O的渐进表示法,这是一个估算值,规则是:

  1. 如果只有常数项,用O(1)表示。
  2. 只保留最高阶项。
  3. 系数取1。
  4. 一般变量取大写的N。

比如:准确的执行次数是n^2 + 2*n + 10,只取最高阶项N^2,且系数是1,得O(N^2)。下面再举几个例子:

  • 准确的执行次数:3*n^3 + 2*n^2 + n + 10000,大O的渐进表示法:O(N^3)。
  • 准确的执行次数:10000,大O的渐进表示法:O(1)。

下面再看一个问题:二分查找的时间复杂度是多少?不知道二分查找的朋友,戳这里

这里介绍时间复杂度的另外一个规则:只考虑最坏情况。那么,二分查找的最坏情况是什么呢?那就是:找不到!假设查找了x次,有2^x==N,即x=log2N,所以时间复杂度是:O(log2N),一般来说底数的2会比较难打出来,我是用数学公式的方式打出来的,为了简单起见,就写O(logN)来代替。

空间复杂度

空间复杂度计算的是算法消耗的额外空间,计算方式和时间复杂度类似,一般采用大O的渐进表示法,表示算法创建的额外变量的大概个数。比如冒泡排序:

void bubble_sort(int arr[], int sz)
{
	for (int i=0; i<sz-1; ++i)
	{
		bool flag = true; // 假设已经有序
		for (int j=0; j<sz-1-i; ++j)
		{
			if (arr[j] > arr[j+1])
			{
				flag = false;
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
		if (flag)
		{
			break;
		}
	}
}

创建的额外变量有flag, i, j, tmp等,由于是常数项,故空间复杂度为O(1)。

举一个空间复杂度是O(N)的例子。对于递归求n的阶乘的算法:

int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n-1);
}

由于会递归调用n次,每次调用都会创建一块栈帧,而栈帧里的额外变量是常数个,故空间复杂度是O(N)。

总结

  1. 时间复杂度和空间复杂度衡量的是算法的时间和空间效率,一般更加看重时间效率,所以会有“以空间换时间”的做法。
  2. 一般都采用大O的渐进表示法,时间复杂度计算大致的执行次数,空间复杂度计算额外创建变量的大致个数,计算时都只考虑最坏情况。
  3. 只保留最高阶项,且系数取1。如果只有常数项,则复杂度为O(1)。

感谢大家的阅读!文章来源地址https://www.toymoban.com/news/detail-418965.html

到了这里,关于如何衡量算法的效率?时间复杂度&&空间复杂度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 算法的时间复杂度、空间复杂度如何比较?

    算法的时间复杂度、空间复杂度如何比较?

    目录 一、时间复杂度BigO 大O的渐进表示法: 例题一: 例题2: 例题3:冒泡排序的时间复杂度 例题4:二分查找的时间复杂度 书写对数的讲究: 例题5:  实例6: 利用时间复杂度解决编程题 ​编辑思路一: 思路二: 源码: 思路三: 回顾位操作符 二、空间复杂度详解 概念

    2024年02月15日
    浏览(9)
  • 算法的时间复杂度和空间复杂度

    算法的时间复杂度和空间复杂度

    目录 本章重点 一 时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 常见的时间复杂度的计算 二 空间复杂度 三 常见复杂度对比 四 复杂度的oj练习 4.1 消失的数字 4.2 旋转数字 每一天都是人生限定,每一天都值得100%努力 (1)算法效率(2)时间复杂度(3)空间复

    2024年02月01日
    浏览(8)
  • 算法的时间复杂度与空间复杂度

    算法的时间复杂度与空间复杂度

    1.算法效率 2.时间复杂度 3.空间复杂度 4.复杂度oj题目 1.算法效率 1.1 如何衡量一个算法的好坏 一辆车的好坏我们可以从价格,油耗...... 方面来衡量,但衡量一个算法的好坏我们该从哪一个方面入手呢?比如斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定

    2024年02月15日
    浏览(12)
  • 【算法基础】时间复杂度和空间复杂度

    【算法基础】时间复杂度和空间复杂度

    1 算法的评价 2 算法复杂度 2.1 时间复杂度(Time Complexity) 2.1.1 如何计算时间复杂度: 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度计算示例 例子1:计算数组中所有元素的和。 例子2:快

    2024年02月08日
    浏览(15)
  • 算法之【时间复杂度】与【空间复杂度】

    算法之【时间复杂度】与【空间复杂度】

    目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: 🍂线性阶:  🍂对数阶: 🍂平方阶: 2、空间

    2024年02月05日
    浏览(16)
  • 算法学习22:时间复杂度 和 空间复杂度

    算法学习22:时间复杂度 和 空间复杂度

    提示:以下是本篇文章正文内容: 😍😍😍文章链接👍👍👍 提示:这里对文章进行总结: 💕💕💕

    2024年04月22日
    浏览(25)
  • 数据结构:算法(特性,时间复杂度,空间复杂度)

    数据结构:算法(特性,时间复杂度,空间复杂度)

    算法(Algorithm)是对 特定问题求解步骤 的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。 算法必须是有穷的,而程序可以是无穷的 算法中每条指令必须有确切的含义,对于

    2024年02月06日
    浏览(16)
  • 算法时间空间复杂度

    算法时间空间复杂度

    1. 有穷性 :执行有穷步(有限步)之后结束。 2. 确定性 :只有唯一的执行路径。 3. 可行性 :代码可以执行起来。 4、 输入 :零个或多个输入。 5. 输出 :一个或多个输出。 时间效率和空间效率有时候是有矛盾的 概念: 若有某个辅助函数 f ( n ) color{pink}{f(n)} f ( n ) 使得当

    2024年02月04日
    浏览(10)
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    下列算法默认都是对数组进行升序 1.1、算法思想 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序的具体步骤如下: 从第一个元素开始,该元素可以认为已经被排序;

    2024年02月08日
    浏览(11)
  • 数据结构与算法—时间复杂度和空间复杂度

    数据结构与算法—时间复杂度和空间复杂度

    目录 1、什么是数据结构? 2、什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  三个例题:  OJ题分析时间复杂度 5、空间复杂度 (1)常见复杂度对比  (2)OJ题分析空间复杂度 小结 数据结构 (D

    2024年02月07日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包