扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析

这篇具有很好参考价值的文章主要介绍了扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、复杂度分析

复杂度分析本身是非常理论化的一个内容,在计算机科学中,有一个专门的学科叫做——计算复杂性理论

很多童鞋看过《算法导论》,这本书的内容很多很强调算法导论。

但是实际上,对于普通程序员来说,不需要过度强调理论化的内容。因为工作中更多面对的是实际的
软件工程,工程化的工作不需要面对太多理论性的东东。

2、复杂度分析

复杂度分析的作用:是为了表示算法的性能。

对于同样一个任务,可能有多个实现方式,即多个算法。这些不同的算法,它们的时间性能是否有差异呢?


我们虽然可以用一个测试用例,或者一组测试用例实际比较性能差异。
但是,这样的比较结果有局限性。


比如,需要保证运行不同算法的计算机硬件设备的性能一致,甚至深入的说,他们的OS当时的状态都需要是一致的。
这本身很难保证,而且测试结果也与我们的测试用例设计和用例输入相关。


而且,最重要的是这样比较是事后的

如何突破局限性,如何事前比较呢?
种种这样的需求,都需要我们有一套工具,从数学的层面,用抽象的方式,判断一个算法的性能是怎样的?

为了回应这样的需求,就产生了复杂度分析这样一个概念。

3、复杂度分析和算法性能的关系

复杂度分析,如何表示算法的性能呢?

需要注意的是,算法复杂度分析通常考虑最坏的情况。


这样的思想非常普遍,比如上班时,为了不迟到,考虑最长需要多少时间,甚至将堵车的时间都考虑进去。

即,复杂度分析,表示的是算法运行的上界。


对于我们的线性查找法代码,我们来进行一个复杂度分析吧,代码再一次贴出来:

public static <E> int search(E [] data,E target){
    for (int i = 0; i < data.length; i++)
        if (data[i].equals(target))
            return i;
    return -1;
}

具体的分析过程如下:
n = data.length
T 表示时间
T和n的关系到底是怎样的?
T = n?n个元素全部扫描了一遍? 就是n?
T = 2n?if里有比较、有返回结果这2步 就是2n?
T = 3n? 其实if中的data[i],要在数组data中找到i这个元素,是一步寻址,也需要算作一个子步骤。 3n了?
T = 4n?for循环中也包含每次要做的事情,i<data.length,也是一个判断操作,所以4n?

T = 5n?for循环中还有一个i++的操作,所以5n?
T = 5n+2? int i =0;加1次,return -1;加1次,所T=5n+2?
……


其实,再继续分析下去还可以分析出很多可能,就不继续分析了,为什么不继续了呢?


因为真的分析的话,拿出for循环对应的汇编代码,看看这个循环执行了多少指令?


可是拿出汇编代码也不够,因为汇编代码对应着机器指令,而机器指令不仅仅是代码有多少行而已,
还要追溯到运行代码的CPU架构上,有些复杂指令在有些CPU上,就一个指令,但在另外一些CPU上,可能就是多个指令。


对于上层应用软件开发者来说,分析清楚每一行高级语言代码对应着多少机器指令,是一件非常困难,甚至说不可能的事情,其实也没有必要。

而且即便T=5n+2,那这个等式的时间单位是多少呢?是毫秒ms嘛?肯定不对应时间,对应的是指令数,但是一条指令在cpu中执行多久我们知道嘛?

我们不知道。


所以,这些其实我们都不需要考虑,我们需要进行一个化简。这也是计算机科学家们定义复杂度分析这个概念时做过的事儿,没错,他们做了化简。


我们不需要知道执行这样一个循环,对这n个元素操作,每一次循环需要执行多少个指令;
我们只需要知道,整个算法和这个data数组的大小,和这个数据规模n成一个正比的关系即可。


4、O(n)

这个就记作O(n),表示的就是运行时间和数据规模n之间的一个正比关系。
进一步看,如果:
T = c1*n + c2
这个算法我们就可以记作O(n),即常数c1、c2都被我们忽略掉了,即算法复杂度的世界中,常数不重要。

5、复杂度描述的是什么?

复杂度描述的是:随着数据规模的增大,算法性能的变化趋势。

假设有2个算法,分别是T1和T2,它们的详细情况如下:

T1 = 10000n
T2 = 2n²
第一个算法 O(n)级别的算法,第二个算法O(n²)级别的算法。
从复杂度理论的角度来看,第一个算法优于第二个算法。

**因为总是会存在某一临界点n0,当n>n0,T1<T2。
可以计算出,这里的临界点n0为5000。
一旦数据规模大于5000,算法一的性能优势就体现出来了,而且n越大,体现的越明显。

所以O(n)描述的就是随着n的变化,算法的性能的变化趋势,

而不是说n取某个值时,算法的性能。


实际上,如果测试数据小于5000,比如为100时,第二个算法O(n²)反而优于第一个算法O(n);


但是评价算法性能,我们要看n逐渐上涨的情况,甚至看n无穷大的情况文章来源地址https://www.toymoban.com/news/detail-417839.html

到了这里,关于扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想

    接下类,我们学习另外一类非常基础的算法,即排序算法。 排序算法是计算机科学领域研究的非常深入的一类算法,排序这个动作本身也是非常重要的, 很多时候面对无需的数据,首先需要做的就是对他们进行排序。 排序算法——目的:让数据有序。 排序算法——种类:种

    2023年04月21日
    浏览(18)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(10)
  • 【算法与数据结构】--算法应用--算法和数据结构的案例研究

    一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理 : 甘特图算法 :甘特图是一种项目进度管理工具,它使用甘特图算法来展示项目任务

    2024年02月08日
    浏览(15)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(15)
  • 数据结构和算法——数据结构

    数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(14)
  • 数据结构与算法 --- 数据结构绪论

    早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问

    2024年02月14日
    浏览(10)
  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(10)
  • 数据结构与算法——什么是数据结构

    数据结构与算法——什么是数据结构

    当你决定看这篇文章,就意味着系统学习数据结构的开始。下面我们先来讲什么是数据结构。 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储  {1,2,3,4,5}  是为了后期取得它们

    2024年02月15日
    浏览(10)
  • 【数据结构与算法】不就是数据结构

    【数据结构与算法】不就是数据结构

      嗨喽小伙伴们你们好呀,好久不见了,我已经好久没更新博文了!之前因为实习没有时间去写博文,现在已经回归校园了。我看了本学期的课程中有数据结构这门课程(这么课程特别重要),因为之前学过一点,所以就想着深入学习一下子。毕竟这门课程对于 考研 和 就业

    2024年02月07日
    浏览(10)
  • 【数据结构与算法】1.数据结构绪论

    【数据结构与算法】1.数据结构绪论

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据结构是计算机中存储、组织数据的方式。 数据结构是一种具有一定逻辑关系,

    2024年01月23日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包