数据结构 学习记录 1
A 计算
1.什么是算法?
-
计算 = 信息的处理
借助某种工具,遵照一定的规则,以明确而机械的形式进行
-
计算模型 = 计算机 =信息处理工具
-
所谓算法,即在特定计算模型下,旨在解决特定问题的指令序列
- 输入:待处理的信息(问题)
- 输出:经处理的信息(答案)
- 正确性:的确可以解决指定的问题
- 确定性:任一算法都可以描述为基本操作组成的序列
- 可行性:每一基本操作都可以实现,且在常数时间内完成
- 有穷性:对于任何输入,经有穷次基本操作,都可得到输出
-
举个例子:
那么对于这个例子来说,输入就是直线L上的点p,输出就是经过p且垂直于L打的直线,在这个由绳子组成“计算模型”,运行了得到垂线这个算法
2.算法有穷性:
关于算法的有穷性上面已经介绍到了,现在举一个例子:Hailstone Sequence。
希尔顿序列问题是一个著名的数学问题,至今未证明其正确性,也没证明其错误性,即任何一个正整数N,如果是偶数的话就除以2,如果是奇数的话就乘以3再加上1,最后这个数都会变为1。其表达式如下:
通过递归发现,每次对n这个数字进行判断奇偶性,采用不同的计算公式。例:当n=5的时候,结果:Halistone(5)={5,16,8,4,2,1}
我们针对这个过程写出一个程序:
1int halistone(int n)
{
int length =0;
while(n>1)
{
(n%2)?n/=2:n=n*3+1;
length++;
}
return length;
}
当我们输入n = 5,程序能在有穷次得到输出,那当我们输入n = 27的时候了?我们可以给出:
Halistone(27)={27,82,41,124,62,31,94,47,142,71,214,107, … }
那么我们可以看到,该程序无法判断有穷性,不满足对于任何输入这一条件,所以该程序不能作为算法。
总结:程序未必等于算法,要满足算法的有穷性。
3.好算法:
什么是一个好算法?这个问题并不能很好的回答的问题,列举一下几点:
- 正确:符合语法、能够编译、链接
- 健壮性:能辨别不合法的输入并做适当处理,而不会非法退出
- 可读性:结构化 + 准确命名+ 注释 + … …
这些确实是一个好算法的一些方面,但是从数据结构的角度来讲,我们其实最需要关注的一点是
- 效率(Efficiency):速度尽可能快,存储空间尽可能少(既要马儿快快跑,也要马儿吃得少!)
B 计算模型
To measure is to konw.
If you can not measure it,you can not improve it.
1.算法分析
- 正确性:算法功能与问题是否一致?
- 成本:运行时间 + 所需存储空间(如何度量 + 如何比较?)
- 考察:如果我们定义一个通用的数学公式T(n)来计算算法的时间成本,意义不大…毕竟可能出现的问题实例太多,如何归纳概括?
- 观察:问题实例的规模,往往是决定计算成本的主要因素。规模接近,计算成本也接近;规模扩大,计算成本也上升。
- 那么,如果我们计算:用算法A求解某一问题规模为n的实例,所需的计算成本讨论特定算法A(及其对应的问题)的时间T(n)来进行对比了?这样仍然有问题… …因为同一问题等规模的不同实例,计算成本不尽相同,甚至有本质的区别。
既然这样,那么我们该怎么定义计算成本T(n)了? 同一问题等规模的不同实例,计算成本不尽相同,那么,在规模同为n对的所有实例中,我们只关注最坏(成本最高)者来作为其计算成本T(n)。以最坏的情况作为准则的原则,这也是很好理解。上述方法为对特定算法的评价。