数据结构02算法
1 数据结构与算法的关系
数据结构与算法的关系就相当于梁山伯和祝英台、罗密欧和朱丽叶的关系。只谈数据结构,当然是可以,但是只学数据结构,学完后,很可能不知道数据结构有什么用处,但是在学习数据结构的同时一起学习算法,就会发现,甚至开始感慨:计算机界的前辈们,的确是—些很牛很牛的人,他们使得很多看似很难解决或者没法解决的问题,处理得如此美妙和神奇。
2 算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
3 算法的特性
算法具有五个具体特性:
- 输入:一个算法有零个或多个输入。
- 输出:一个算法有一个或多个输出。
- 有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
- 确定性:算法中每条指令必须有确切的含义,且相同的输入只能得到相同的输出。
- 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4 算法设计的要求
通常设计一个“好”的算法应考虑达到以下目标:
- 正确性:算法应能正确地求解问题。
- 可读性:算法能具有良好的可读性,以帮助人们理解。
- 健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
- 效率与低存储需求:效率是指算法执行的时间,存储量需求是指算法执行过程中所需的最大存储空间。
5 算法效率的度量方法
设两个算法的输入规模都是,算法A要做
次操作,可以理解为先有—个
次的循环,执行完成后,再有—个
次循环,最后有三次赋值或运算,共
次操作。算法B要做
次操作,算法A和算法B谁会更快呢?
准确说来,答案是不一定的。
此时我们给出这样的定义,输入规模没有限制的情况下,只要超过一个数值
,这个函数就总是大于另—个函数,我们称函数是渐近增长的。
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽赂,而更应该关注主项(最高阶项)的阶数。
5.1 算法时间复杂度
在进行算法分析时,语句总的执行次数是关于问题规模门的函数进而分析
随
的变化情况并确定
的数量级。算法的时间复杂度,也就是算法的时间度量,记作
。它表示随问题规模
的增大,算法执行时间的增长率和
的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中
是问题规模
的某个函数。
这样用大写来体现算法时间复杂度的记法,我们称之为大
记法。
推导大阶的方法:
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。
得到的结果就是大阶
常见的时间复杂度如下所示。
常用的时间复杂度所耗费的时间从小到大依次是:
5.2 算法空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:,其中,
为问题的规模,
为语句关于
所占存储空间的函数。
6 总结
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的特性:有穷性、确定性、可行性、输入、输出。
算法的设计的要求:正确性、可读性、健壮性、高效率和低存储量需求。
算法特性与算法设计容易混,需要对比记忆。
推导大O阶的步骤:
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。
得到的结果就是大O阶。
通过这些步骤,我们可以在得到算法的运行次数表达式后,很快得到它的时间复杂度,即大O阶。
接着给出了常见的时间复杂度所耗时间的大小排列: