数据结构学习实录二—算法的评价

xiaoxiao2021-02-28  88

这个算是考研必考题吧,不讨论不行,当然,在实际程序编写的时候也自然要考虑。

首先,什么是算法?

  算法是指对特定问题求解步骤的一种描述,他是指令的有限序列。简而言之就跟你去吃饭一样,首先走路,走到饭店,点餐,吃饭,付账,回家。

那么这就是吃饭算法。

1.走路。

2.点饭。

3.吃饭。

4.付账。

5.回家。

这就是一个有限序列。所以第一算法要有限,无限死循环可不是算法。比如你一直走路,点饭,走路,点饭……  永远结束不了,也吃不了饭。第二算法的指令是有序的,不能互换位置。就比如上面,如果吃饭和点饭互换位置,那就好恶心,你去饭店先吃了口水饭(别人吃过的)自己再点饭,而且没吃就付账走人了,这不是荒唐吗。

所以总结下来,算法具有五个重要特征:

1.有穷性:算法步骤是有限的,可以被执行完的。

2.确定性:算法每一条指令必须是明确的,无歧义的。

3.可行性:算法中的操作必须是基本运算执行有限次可以实现的。

4.输入:有0个至多个输入端口。这个很无聊,就是说可能会有输入端口。

5.输出:一个或多个输出。这个输出是广义的,不是说必须输出信号。比如你对菜进行搅拌,只是改变其状态,没有新菜出来,这也算是输出。

好的算法有哪些要求呢?

1.正确性。这个属于废话,你写的算法是错的,还想算是好的算法,那不是扯蛋吗。

2.可读性。方便编程人员进行阅读。这个很重要,在你自己查错,改编或跟他人合作编程时,这个非常重要。正宗的反面教材就是我国的计算机二级考试,完全为考试而考试,丝毫不注重实用,学出来的学生不如不学,对编程彻底丧失兴趣并且排斥,简称误人子弟。其经常考a=a+a++-a+++a----a+++a,问a等于几?这种代码写不得,毫无意义并且给自己和队友造成不必要的麻烦,在公司写这种代码被认为成挑衅。

3.健壮性:当用户或其他程序或函数传递过来非法数据时,算法能做出适当的处理,不会产生莫名其妙的结果。就比如你要的是数字,输出也是数字,对放给了你一个句号,不是数字,你却输出了2102130等数字,让别人不知道发生什么了,这就是程序的健壮性差。

4.效率和低存储量的要求。当然,一个算法步骤越少,速度远快,需要的空间越小越好。所以要尽可能的缩减时间和空间复杂度。

个人补充两点(考研不要答):低耦合,高内聚。做到一个函数只做一件事,函数与函数之间尽可能只是数据传递,而不是控制。这样有利于模块化编程和易于维护。

下面讲解必考知识点:时间复杂度与空间复杂度

准确说是算法耗时的数量级和空间占用的数量级。我们知道,计算机执行是很快的,内存也很大,你具体去关心他到底要用几毫秒,几纳秒是没意义的,速度很快吗,我们只关心他是n的几次方,次方的相差才能反映出区别,也方便计算。就比如我们算出一个算法根据数据规模n,所要执行的语句(计算机执行一条语句的时间是大致相同的,所以我们用语句个数来反映时间)是n^6+n^5+3n^2+5;我们说他的时间复杂度为n^6,那其他的呢?因为在海量数据计算下,最高次项对结果影响最大,并且考虑到便于估算的原因,所以我们只取最高次项。

下面接触下定义

频度:某一语句在算法中被重复执行的次数。

时间复杂度为算法中所有语句频度之和,记作T(n),且只分析T(n)的数量级。

例如   while(n!=0)n--;这条语句时间复杂度为n;而

while(n!=0) { while(nn!=0) nn--; n--; }时间复杂度为n*n;

定义 O(f(n))为取f(n)数量级的运算。

关于最坏/最好/平均时间复杂度:

分别指在算法执行该规模最耗时数据的时间复杂度。比如你用循环从头到尾去查一个数组中一个数字的位置,结果那个数字在数组最后面,一直查到最后才查到,这就是最坏的。最好的就是在第一个,上去就查到,平均就是平均值啦。

加法规则

T1(n)+T2(n)=O(max(f1(n),f2(n));

乘法规则

T1(n)*T2(n)=O(f(n)*g(n));

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n);

空间复杂度记作S(n),与时间类同。

本文为作者原创,任何形式的引用、转载等操作请提前获得作者授权,未经授权,禁止以任何形式引用或转载此文。

转载请注明原文地址: https://www.6miu.com/read-80809.html

最新回复(0)