/*(理解数据结构--个人学习笔记理解)*/
算法的定义
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列。
一个算法一个具有以下5个重要特性:
- 有穷性:一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。任何不会终止的算法都是没有意义的。
- 确定性:对于每种情况下执行的操作在算法中都有确切的规定,使算法的执行者或者阅读者都能明确其含义及如何执行,并且在任何条件下算法都只有一条执行路径,即对于相同的输入只能得出相同的输出,不能有二义性。
- 可行性:算法中的所有操作都必须足够基本,算法可以通过有限次基本操作来完成其功能,也就是说算法中的每一个动作都能够被机械地执行。
- 有输入:作为算法加工对象的量值,通常体现为算法中的一组变量。一个算法有零个或者多个输入。
- 有输出:一组与“输入”有确定对应的关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。一个算法有一个或者多个输出。
算法设计的目标
算法设计应满足以下几个目标:
- 正确性:要求算法能够正确地执行预先规定的功能和性能要求。这是最重要、最基本的标准。
- 可使用性:要求算法能够很方便地使用。这个特性也叫用户友好性。
- 可读性:算法应该易于使人理解,也就是可读性好。为了达到这个要求,算法的逻辑必须是清晰的、简单的和结构化的。
- 健壮性:要求算法具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查,不经常出现异常中断或死机现象。
- 高效率与低存储量需求:通常算法的效率主要指算法的执行时间。对于同一个问题,如果有多种算法可以求解,执行时间短的算法效率高。算法存储量指的是算法执行过程中所需的最大存储空间。效率和存储量都与问题的规模有关。
算法的描述
描述算法的方式很多,有的采用自然语言伪代码、流程图或者表格方式等,但计算机专业的学生应该熟练使用计算机语言来描述算法。(由于作者本身能力有限,便用C/C++语言来描述)
- 描述算法的一般格式和算法的设计步骤
描述算法的一般格式如下:
返回值 算法对应的函数名(形参列表)
{ 临时变量的定义
实现由输入参数到输出参数的操作
...
}
以上便就是一个函数体的样式
其中,“返回值”通常为bool类型,表示算法是否成功执行;“形参列表”表示算法的参数,由于算法包含输入和输出,所以形参列表由输入型参数构成;函数体实现算法的功能。
一个算法通常完成某个单一的功能,设计算法的一般步骤如下:
- 分析算法的功能;
- 确定算法有哪些输入,将这些输入设计成输入型参数;确定算法有哪些输出,将这些输出设计成输出型参数;
- 设计函数体,完成从输入到输出的操作过程。
- 输出型参数的设计
在设计算法时,输入型参数的设计是十分简单的,那么输出型参数如何设计呢?下面通过一个实例进行说明。
例如设计一个交换两个整数的算法,编写相应的函数swap01(x,y)如下:
void swap01(int x,int y)
{ int temp;
temp=x;
x=y;
y=temp;
}
在函数中的确实现了两个形参x和y的值交换,但调用该算法(也就是执行语句swap01(a,b))时发现a和b实参值并不会发生交换。出现错误的原因是这里的形参x,y既是输入型参数,又是输出型参数,而swap01中仅将形参x,y作为输入性参数设计。
改正方法1:采用指针的方式回传形参的值,将上述函数改为如下:
void swap02(int *x,int *y)
{ int temp;
temp= *x; //将x所指的值放在temp中
*x= *y; //将x所指的值改为y所指的值
*y=temp; //将y所指的值改为temp
}
这样调用该函数的方式改为swap02(&a,&b),其中,&a,&b分别是实参a,b的地址,显然改正后的算法swap02()比较复杂,可读性差。
改正方法2:采用引用型形参,也就是将输出型形参设计为引用型形参
在C++语言中提供了一种引用运算符“&”。当建立引用时,程序用另一个已定义的变量(目标变量)的名字初始化它,从那时起,引用变量作为目标变量的别名使用,对引用变量的改动实际上是对目标的改动。例如:
int a=4; //定义整数型变量a
int &b=a; //定义整数型变量a的引用变量b
第二个语句定义变量b时变量a的引用变量,b也等于4,之后这两个变量同步改变。
引用常用于函数形参中,当采用引用型形参时,在调用函数时会将形参的改变回传给实参。利用引用运算符将swap01()改为如下:
void swap(int &x,int &y) //形参前的“&”符号不是指针运算符,而是引用
{ int temp=x;
x=y;
y=temp;
}
当执行语句swap(a,b)时,形参和实参的匹配相当于:
int &x=a; //x为a的引用
int &y=b; //y为b的引用
这样,a与x共享存储空间,b与y共享存储空间,因此执行此函数后a和b的值发生了交换。这种改进方式十分简单,所以大多数都采用这种方式设计算法。