数据结构与算法的关系

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

数据结构与算法的关系是相互依赖不可分割的。

1.两种算法的比较

现在我们要求写一个求1+2+3+........+100结果的程序:

我们大多数人会这样写:

这就是简单的一种算法,那么你是否想过,这样写的代码真的很好吗?执行效率是否高效?

我们小学就知道了,一种叫高斯算法:

就是把该算式正序排列一式,然后倒叙排列写成二式;两者相加就是左边等于两倍的sum,右边则为所以数之和;很容易得到sum;那么我们对程序就可以改进一下了:

这种算法相当于另一种求等差数列的算法,不仅仅可以用于1加到100,就是加到1000,10000,也就是瞬间的事情,而如果是刚刚第一种算法计算机要循环上百次,上千次,上万次。刚才第一种算法的效率大大不如现在的算法。

2.算法的特性

(1).输入输出

算法具有零个或者多个输入。

算法至少有一个或者多个输出。输出的形式可以是打印输出,也可以是返回一个或者多个值。

也就是输入可以没有,但是你必须要有输出。不然你要算法干嘛?

(2).有穷性

指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可以接受的范围内完成。

(3).可行性

算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

3.算法的设计要求

(1).正确性:

算法的正确性是指算法至少应该具备输入,输出和加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。

但是算法的“正确”通常在用法上有很大的差别,大体分成四个层次:

算法程序没有语法错误;

算法程序对于合法的输入数据能够产生满足要求的输出结果;

算法程序对于非法的输入数据能够产生满足规格说明的结果;

算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

(2).可读性

算法设计的另一目的是为了便于阅读,理解,交流。

可读性是算法好坏很重要的指标,如果可读性不好,时间长了,自己连自己写的都看不懂。

(3).健壮性

当输入数据不合法时,算法也能做出相关处理,而不是产生异常或者莫名奇妙的结果。

(4).时间效率高和存储量低

设计算法应该尽量满足时间效率高和存储量低的需求。

总之,好的算法,应该具有正确性,可读性,健壮性,高效率和低存储量的特征。

4.算法效率的度量方法

(1).事后统计方法

这种方法主要是通过设计好的测试程序和数据,利用计算机计时器不同算法编制程序的运行时间来进行比较,从而来确定算法效率的高低。

这种方法比较依赖于计算机硬件和软件等环境因素,故我们不予采纳。

(2).事后分析估计方法

是指在计算机程序编制前,依据统计方法对算法对算法进行估算。

还是看之前这两个算法:

显然,第一个算法,执行了1+(n+1)+n+1次=2n+3次;而第二种算法,是1+1+1=3次。其实上两个算法的第一条和最后一条都是一样的,所以我们关注中间的代码,忽略循环判断的开销,那么这两个算法其实就是n和1次的差距。算法好坏显而易见。

下面我们再来看一个列子:

上述算法若忽略第一次和最后一次执行次数为100^2,并且随着n值的增大,执行时间也会增大,远远多于前面两个算法的执行时间。

所以在分析程序的运行时间时,最重要的是把程序看成独立于程序设计语言的算法或者一系列步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值