数据结构(笔记二):
—算法:
--举例:
高斯的1~100运算
普通的运算:
高斯的运算:
-可能以计算机的神速,两个算法都可以秒杀解决掉!但是,如果我们把条件换成1加到1千万,或者1加到1千亿,差距就可想而知了,好的算法甚至让人脑快过电脑。
--算法的五个基本特征:
输入、输出、有穷性,确定性和可行性。
输入:
- 算法具有零个或多个输入。
- 尽管对于绝大多数算法来说,输入参数都是必要的。但是有些时候,像打印"I love fishc.com,就不需要啥参数啦。
输出:
- 算法至少有一个或多个输出。
- 算法是一定要输出的,不需要它输出,那你要这个,算法来干啥?输出的形式可以是打印形式输出,也可以是返回一个值或多个值等。
有穷性:
- 指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。一个永远都不会结束的算法,我们还要他干啥?
确定性:
- 算法的每一个步骤都具有确定的含义,不会出现二义性。
- 算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。
- 算法的每个步骤都应该被精确定义而无歧义。
可行性:
- 算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
--算法效率的度量方法:
效率高一般指的是算法的执行时间快。
---事后统计法:
比较容易想到的方法就是我们把算法跑若干次,然后拿个“计时器”在旁边计时。这种方法叫做-事后统计方法。
事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
但这种方法显然是有很大缺陷的:
- 必须依据算法事先编制好测试程序,通常需要花费,大量时间和精力,完了发觉测试的是糟糕的算法,那不是功亏一篑?赔了娘子又折兵?
- 不同测试环境差别不是一般的大!
我们把刚刚的估算方法称为事后诸葛亮。
为了对算法的评判更为科学和便捷,他们研究出事前分析估算的方法。
---事前分析估算法:
在计算机程序编写前,依据统计方法对算法进行估算。
估算依据:
-
1,算法采用的策略,方案
-
2.编译产生的代码质量
-
3.问题的输入规模
-
4·机器执行指令的速度
如果想成为好人,就去做个菩萨。用你相信你是菩萨的时,你就是一个菩萨了。
很多时候,决定一个人的并不是他之前做过什么,而是在那之后,他意识到了什么。
--算法时间复杂度:
推导大O阶:
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
- 得到的最后结果就是大0阶。
根据运行时间分为:
-
最好情况:花费时间最少,循环运行的时间最少。
-
最坏情况:最坏运行时间是一种保证。在应用中,这是一种最重要的需求,。
-
平均情况:最好与最坏的平均值。
通常除非特别指定,我们提到的.运行时间都是最坏情况的运行时间。
--算法空间复杂度:
-
我们在写代码的时候完全可以用空间来换取时间。
-
举个例子说,要判断某年是不是闰年,你可能会花一点心思来写一个算法,每给一个年份,就可以通过这个算法计算得到是否是闰年的结果。
另外一种方法是,事先建立一个有2056个元素的数组,然后把所有的年份按下标的数字对应,如果是闰年,则此数组元素的值是1,如果不是元素的值则为0。这样,所谓的判断某一年是否为闰年就变成了查找这个数组某一个元素的值的问题了。
-
显然对时间复杂度的追求更是属于算法的潮流。
参考资料:小甲鱼视频《数据结构和算法》