您的位置:首页 > 理论基础 > 数据结构算法

大话数据结构与算法:算法初步1

2016-05-26 21:45 375 查看

1.算法的定义:

什么是算法呢?算法是描述解决问题的方法。如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

对于一个特定的问题,是可以有多个算法来解决的。那么我们就会想,有没有通用的算法呀?其实这个问题很弱智,就像问与没有包治百病的药啊!!!

2.算法的特性:

     算法具有5个基本特性:输入、输出、有穷性、确定性和可行性。
输入和输出特性比较容易理解,算法具有零个或多个输入。尽管对于绝大多数算法来说,输入参数都是必要的,但对于个别情况,如打印“Hello World”
这样的代码,不需要任何输入参数,因此算法的输入可以是零个。算法至少有一个或多个输出,算法是一定需要输出的。不需要输出,我们用这个算法干嘛?输出的形式可以使打印输出,也可以是返回一个或多个值等。
有穷性指算法在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
确定性是指算法的每一步骤都具有明确的含义,不会出现二义性。算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。
一个好的算法应该具备正确性、可读性、健壮性、高效性和低存储量的特性。

3.算法效率的度量方法

刚才我们提到设计算法要提高效率。这里效率大都指算法的执行时间。那么我们如何度量一个算法的执行时间呢?

3.1事后统计方法

这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
但是,这种方法是具有很大的缺陷的。(1)必须依赖算法实现编制好的程序,这通常需要花费大量的时间和精力。如果
编制出来发现它根本是很糟糕的算法,岂不是竹篮打水一场空?(2)时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。要知道,现在的一台四核处理器的计算机,跟当年286/386/486等老爷爷辈的机器相比,在处理算法的运行速度上,是不能相提并论的;而所用的操作系统、编译器、运行框架等软件的不同,也可以影响他们的结果;就算是同一台机器,CPU使用率和内存占有情况不一样,也会造成细微的差异。
算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在校的测试数据面前往往得不到体现。比如10个数的排序,不管用什么算法,差异几乎是零。而如果有100万个随机数字排序,那不同算法的差异就非常大。那么我们为了比较算法,到底用多少数据来测试,这是很难判断的问题。
因为基于事后统计方法有这样那样的缺陷,我们考虑后不予接纳。

3.2 事前分析估算方法

在计算机程序编制前,依据统计方法对算法进行估算。
经过分析,我们可以发现,一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:(1)算法采用的策略,方法;(2)编译后产生的代码质量;(3)问题的输入规模;(4)机器执行指令的速度;第一条当然是算法好换的根本,第二条往往要有软件来做支撑,第四条要看计算机硬件的性能。也就是说,抛开与计算机软件、硬件相关的因素,一个程序的运行时间,依赖于算法设计的好坏和问题的输入规模。通俗的讲,问题输入规模是指输入量的多少。
相面我们可以比较两种求和的算法:
循环迭代求和:
int i, sum=0,n=100;    //执行1次
for(i=1;i<=n;i++)      //执行n+1次
{
sum = sum + i;   //执行n次
}
printf(“%d”,sum);  //执行1次
高斯求和:
int i,sum = 0, n = 100;  //执行1次
sum = (1+n)*n/2;         //执行1次
printf("%d",sum);         //执行1次

孰优孰劣,一览无余!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: