算法初体验之算法的基本概念及定义

很多学生,学了四年的计算机专业,很多程序员,做了很长时间的编程工作,却始终搞不懂算法时间复杂度的估算,这不得不说是一件很可悲的事情。因为弄不清楚,也就不去深究自己写的代码是否效率低下了,是不是可以通过优化让计算机更加快速高效。

算法的定义

算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作

算法的特征

有穷性,确定性,可行性,输入,输出。

算法的设计的要求

正确性,可读性,健壮性,高效率和低存储量的要求

算法的度量方法

事后统计法,事前分析估算方法

在讲解如何让使用事前估算法之前,我们先给出了函数渐进增长的的定义。

函数的渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n).于是我们可以得出一个结论,判断一个算法好不好,我们只通过少量的数据是不能做出准确判断的,如果我们可以对比算法的关键执行次数的渐进增长性,基本就可以分析出:某个算法,随着n的变大,它会越来越优于另一种算法,或者说越来越差于另一种算法。然后给出了算法时间复杂度的定义和推导大O阶的步骤。

推导大O阶:
  • 用常数1取代运行时间中的所有加法常数
  • 在修改后的运行次数函数中,只保留最高阶项
  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数
    得到的结果就是大O阶

通过这个步骤我们可以得到算法运行次数表达式后,很快得到它的时间复杂度,即大O阶,同时我也提醒大家,其实推导大O阶很容易,但如何得到运行次数的表达却是需要数学功底的。

总结

假设CPU在短短几年间,速度提高了100倍,这其实已经很夸张了,而我们某个算法可以写出的时间复杂度是O(n)的程序却写出了O(n²)的程序,仅仅因为容易想到也容易写。即在O(n²)的时间复杂度算法程序下,速度其实只提高了10倍,而对于O(n)的时间复杂度的算法来说,那才是真的100倍。也就是说,一台老式CPU的计算机运行O(n)的程序和一台速度提高100倍新式CPU运行 O(n²)的程序,最终效率高的胜利方却是老式CPU的计算机,原因在于算法的好坏决定了程序运行的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为数字计算机编写程序的过程特别愉快,因为我们不仅可以获得经济和科学两方面的收益,还能尽享写诗或作曲般的艺术体验.本书是多卷丛书中的第一卷,整个丛书旨在培训读者掌握程序员必备的各种技能. 在接下来的章节中,我不打算介绍计算机程序设计的入门知识,而是假定读者已有了一定的基础.预备知识实际上非常简单,但初学者恐怕需要一些时并动手实践,方能理解数字计算机的概念.读者应该具有如下知识. (a) 对存储程序式数字计算机的工作原理有一些认识.不一定需要电子学背景,但需要知道指令在机器内存中是如何保存和连续执行的. (b) 能够用计算机可以“理解”的确切术语来描述问题的解决方案.(这些机器不懂所谓的常识,它们只会精准地按要求干活,不会多做也不会少做.这是刚开始接触计算机时最难领悟的概念.) (c) 掌握一些最基本的计算机技术,例如循环(重复执行一组指令)、子程序的使用、下标变量的使用. (d) 能够了解常见的计算机术语,如内存、寄存器、位、浮点、溢出、软件等.正文中未给出定义的一些术语,会在每卷最后的索引部分给出简明的定义.或许可以把这四点归结为一个要求:读者起码为一台计算机编写和测试过至少(比如说)4个程序. 我力图使本套丛书能满足两方面的需求.首先,这些书总结了几个重要领域的知识,可以作为参考书;其次,它们可以用作自学教材或计算机与信息科学专业的大学教材.为此,我在书中加入了大量的习题,并为多数习题提供了答案.此外,我在书中尽可能地用事实说话,言之有据,避免做一些含糊的泛泛而谈. 这套书针对的读者不是那些对计算机只有一时兴趣的人,但也绝不仅限于计算机专业人士.其实,我的一个主要目标是使其他领域的广大工作者能够方便地了解这些程序设计方法,他们本可以利用计算机获得更丰硕的成果,但却没时去技术刊物中查找必需的信息. 本套丛书的主题可以称为“非数值分析”.在传统意义上,计算机是与方程求根、数值插值与积分等数值问题求解联系在一起的,但我不会专门讨论数值问题,最多顺带提一下.数值计算的程序设计是一个发展迅猛、引人入胜的领域,目前已出版了许多相关图书.不过,从20 世纪60 年代初期开始,计算机更多地用于处理那些很少出现数值的问题,此时用到的是计算机的决策能力而非算术运算能力.非数值问题中也会用到一些加法和减法,但基本不需要乘法和除法.当然,即便是主要关注数值计算的程序设计的人也可以在非数值方法的学习中受益,因为数值程序中也会用到非数值方法. 非数值分析的研究成果散见于大量科技刊物中.通过研究,我从大量文献中提炼出了一些可以用于多种编程场合的最基本的方法,并尝试着将其组织为一套“理论”.同时,我还展示了如何应用这一理论解决大量的实际问题. 当然,“非数值分析”是一种太过负面的否定性的提法,使用肯定性的描述语来刻画这一研究领域要好得多.“信息处理”对于我们的内容而言过于宽泛,“程序设计技术”又显得太狭窄了,因此我提出用算法分析来概括本套丛书的主题比较恰当,这一名称暗示我们将探讨“与特定计算机算法的性质有关的理论”.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值