©版权声明:本文为博主原创文章,未经博主允许不得转载。
首先,附上第一章的思维导图:
1 计算机与算法
1.1 计算
- 对象:规律、技巧
- 目标:高效、低耗
1.2 伸缩计算机
古埃及利用勾股定理,过某点做某条指定直线的垂线。
计算机是什么?
计算过程中所允许的工具。
计算=信息处理
借助某种工具,遵照一定规则,以明确而机械的程序进行
1.3 有穷性文本
Hailstone序列的定义
算法的有穷性
1.4 好算法
正确、健壮、可读、效率(运行时间,所需内存空间,所需资源)
2 计算模型
2.1 问题规模
DSA:DATA STRUCTURE & ARTHITECHTURE
对不同DSA进行描述
划分等价类
最坏性能
2.2 理想模型
图灵机模型
3 大O记号
考察成本的增长趋势
- O(1)
常数,有一些特例,不一定不含循环(logn几乎是常数),不一定不含分支转向(分支转向不可得到的地方),不一定不能有递归调用。
- O(logn)
对数,底数无所谓,常数次幂无所谓;对数多项式,ploy-log function,取高阶。
- O(n^x)
多项式(polynomial function)
线性(linear function):所有O(n)类函数
效率通常认为可令人满意
- O(2^n)
intractable,难解问题,无效算法。
O,上界,覆盖;omiga,下界。
3.1 2-subset
难解问题,化为有效算法的过程可能是很难的。
问题描述:
S包含n个正整数,sum S=2m
S是否有子集T,满足sum T=m?
实际例子:
美国大选,各自洲,是否可能选票相同的情况。
**定理 **2-Subset is NP-complete
就目前的计算模型而言,不存在可在多项式时间内回答此问题的算法。
4 递归
是一种减而治之的策略,递归每深入一层,带求解问题的规模就缩减为一个常数,直至最终蜕化为平凡的简单问题。
上面是书中的介绍,我认为递归是一种解决问题的方式,直接得到问题的通解不容易,但是得到问题的递推公式(即利用n-1规模的解来求n规模的问题)和平凡解很简单,于是让计算机来计算整个调用过程,这种算法策略,就叫做递归。
还有一个比较类似的算法策略叫做迭代,也是一个重复反馈的过程,但是与递归不同的地方在于,迭代是重复进行同一个运算,来逼近所需目标,而不是减小问题的规模来求解的思路,因此不需要用内存保存n-1、n-2……3、2、1规模的解。所以一般使用迭代来解决问题,可以节省空间成本,但是相应的,对程序员来说,会比递归的方法要难想到一点。
声明:本文部分图片引用自“清华大学-学堂在线-数据结构课程”、《数据结构(C语言版)邓俊辉-清华大学》