数据结构学习笔记(二)
上一节:数据结构学习笔记(一)
本节专门讲算法的设计要点
算法是什么
算法,是一种解决问题的具体思路,比如上一节里我将数据运算的解决思路称为算法,说得更具体些,一个算法是规则的有穷集合,这些规则为为解决某一特定问题规定了一个运算序列,相信很多人曾经用C写过排序算法,C语言可以看作是这些规则的载体。
如何设计算法
算法的特性
一个算法,必须要满足以下特性:
1.有穷性:一个算法需要在有限步骤内结束
2.确定性:算法每一步需要确切并清楚,这取决于你将大致思路化为明确“小目标”的功力
3.零个或多个输入:典型的零输入算法——printf(),设计算法的目的一般是针对不定输入的情况去提高效率和减少空间
4.一个或多个输出
5.可行性:理论上,算法的每一步运算要求仅依靠纸笔就可完成,个人认为可行性得看计算机本身的运算能力,或许有的运算现在几乎难以实现,但未来却可行。
要注意的是,程序和算法十分相似,但是程序本身可以是无穷的死循环,比如操作系统
设计思路
本人在学习数字信号处理的时候写过不少仿真算法,以简单的彩色变灰度图算法为例:
1.首先,明确算法输入与输出的性质,特别是数学表示,彩图本质上是RGB图像,数学上称为三阶矩阵,而灰度图是典型二阶矩阵,因此算法必须能够将矩阵降维度。
2.接下来,算法需要明确降低维度的具体规则,细化到彩图的每一个像素点的映射函数如何设计
3.接着,尝试对一副固定分辨率的图像利用matlab读入并处理,观察结果并调整算法细节,以达到最佳效果
4.最后,想办法实现对不同分辨率的彩色图像处理,并对算法的运行效率作出评估
说到评估,其最基本的两条标准:存储空间占用与机器时间占用,在《数据类型与结构》中提出了一种系统化选择数据结构的方法,该方法同样可用于算法的评估,具体我不细讲,大致思路是对算法的每一步运算进行空间占用与时间占用的加权求和,书上列出的评估结果包含了至少三层加权求和,其中的权重取决于结构与运算的复杂性、在应用中的相对重要性、使用频率、执行的代价等,总的来说,评估十分复杂和综合,需要将算法本身与要解决的实际问题联合起来。