算法导论——初初见面

算法听起来很高大上,其实它的确很高大上,只要大学里面学习计算机的肯定接触过算法,只是绝大数情况下我们学习的课程叫做数据结构,它包含两部分内容:数据结构和算法,说这个的目的是告诉大家算法并不是女神,虽然我们都是屌丝但是算法和我们已经很熟悉了,如果碰巧你毕业了并且如愿以偿的做了码农、IT狗那么算法将要跟随我们一生,鉴于此我们对算法还是要给予高度重视的。

算法的重要性
社会是互联网的、是智能的,他们背后的支撑就是算法,算法的好坏就要在于它的性能即我们常说的时间性能与空间性能,但是随着计算机硬件技术,计算机系统结构的发展,CPU越来越快,内存越来越大!大家都是土豪为什么要在乎性能呢?换cpu加内存条不就行了吗?不!算法的存在是很有必要的。

算法是衡量程序的一般性标准:算法在现代计算机科学至少在软件工程领域,它的地位实在是尴尬因为他是用来被出卖的!我们的程序,我们的软件对于用户来说需要用户友好、需要安全这是需要付出性能代价的,对于开发者而言我们更喜欢用java而不是c因为前者的面向对象特性、更高层次的抽象使得我们更容易使用但我们需要付出性能代价,如果它的性能本来就很低,我们就无法对程序对软件提出更高的要求,大数据、多并发、云计算更是空谈!随着计算机能力的不断增强,我们使用计算机来求解比以前更大的问题,我们需要性能更加优越的算法就像我们需要更多的钞票一样,我们不仅仅满足于吃饱饭,我们需要旅游、需要看书、需要谈恋爱但是前提是需要用钞票来换取!

如何衡量算法的性能
把运行时间看作是输入规模的函数
为了保证软件的正常使用,我们关心的肯定是最坏情况,最坏情况代表了对用户的承诺!T(n)定义为输入规模为n时的最长运行时间!那么如何来确定这个最长运行时间呢?找一台配置最差的计算机来运行一次程序?就算是同一台计算机每次运行时间也是不尽相同的!

算法分析的大局观(big idea)——渐近分析

  1. 忽略掉与机器有关的常量。
  2. 关注运行时间的增长代替关注具体的运行时间
    渐进符号⊙:弃去低阶项,忽略常数因子。
    ex:3n^3+2n^2+1024=⊙(n^3).

现在摆在我们面前的有两台计算机:天河二号与486机器,可能前者的机器性能是后者的十亿倍,百亿倍甚至更高,那么对于同一个问题如果后者程序采用了性能更佳的算法那么随着输入规模的增大,必然存在某一点n当输入规模等于n时两者所耗费的时间是一样的,超过这个n时486机器将运行的更快!这就是算法的威力。
1. 无论机器性能多么优越,那只是个常数(10亿or100亿),可以省略。
2. 一个坏算法,当输入规模逐渐变大时,运行时间的增长率也越来越快就好比
⊙(1)与⊙(n):前者的运行时间是个常数,好比是100s,后者的运行时间是线性增长的,当输入规模很小的时候后者的运行时间很小甚至比100s还小,可是它的运行时间是线性增长的当n大于临界点的时候,后者必然需要更多的运行时间(从这里我们也可以看到算法的时间复杂性是不一定的,它与输入规模有关,并且高时间复杂度的算法也是有研究必要的至少在临界点之前它所花费的时间更少,对于小规模输入的问题任然很有效)。
插入排序的运行步骤
对于插入排序来说当输入已经是有序时,我们只需移动n-1(输入个数)次即可是⊙(1)级别
*输入是逆序时我们需要移动1+2+3+…….+n-1是⊙(n^2)级别的
归并排序是⊙(nlgn)级别的,但是要使nlgn<n^2 也是需要条件的,即输入规模要大于临界点*

总结

  1. 算法是IT狗、码农必须接触的
  2. 算法的性能是很重要的,也是衡量程序的一般性标准
  3. 我们关心随着输入规模增大,程序运行时间的增长率,而不关心程序具体运行了多长时间
  4. 对于算法时间复杂性的研究我们采用渐近分析的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值