数据结构和算法
一、什么是数据结构和算法绪论
1、什么是数据结构?
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。程序设计 = 数据结构 + 算法
简单来说数据结构就是关系,元素相互之间存在的一种或多种特定关系的集合。
1.1 逻辑结构和物理结构
传统上,我们把数据结构分为逻辑结构和物理结构。
a.逻辑结构
是指数据对象中数据元素之间的相互关系,也就是我们今后最需要关注和讨论的问题。
(1)集合结构:集合构成中的元素除了同属于一个集合外,它们之间没有其他关系。
(2)线性结构:在线性结构中的数据元素之间是一对一的关系。
(3)树形结构:元素之间存在一对多的层次关系。
(4)图形结构:数据元素之间是多对多的关系。
b.物理结构
是指数据的逻辑结构在计算机中的存储形式。数据元素的存储形式有两种:顺序存储和链式存储。
(1)顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
(2)链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。链式存储结构的数据元素存储关系并不能反映其逻辑关系,需要一个指针存放数据元素的地址。
2、什么是算法?
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
2.1 算法的特性
算法具有五个特征:输入,输出,又穷性、确定性和可行性。
(1)算法要有零个或多个输入;
(2)算法至少有一个或多个输出;
(3)有穷性指算法在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成;
(4)确定性指算法的每一个步骤都具有确定的含义,不会出现二定义性;
(5)可行性指算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
2.2 算法设计的要求
算法设计的要求有:正确性、可读性、健壮性、时间效率高和存储量低。
(1)正确性
算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能够正确反映问题的需求、能够得到问题的正确答案。
大体分为以下四个层次:
a.算法程序没有语法错误;
b.算法程序对合法输入能够产生满足要求的输出;
c.算法程序对于非法输入能够产生满足规格的说明;
d.算法程序对于故意刁难的测试输入都有满足要求的输出结果。
(2)可读性
算法设计的另一目的是为了便于阅读、理解和交流,我们写代码的目的不仅仅是为了让计算机执行,也为了便于他人阅读和自己日后阅读修改。
(3)健壮性
当输入数据不合法时,算法也能做出相关处理,而不是产生异常、崩溃或莫名其妙的结果。
(4)时间效率高和存储量低。
一个好的算法应该具备时间效率高和存储量低的特点。
2.3 算法效率的度量方法
一个程序的运行时间依赖于算法的好坏和问题的输入规模(输入规模指输入量的多少)。
(1)时间复杂度
在进行算法分析时,语句总的执行次数T(n)是关于问题n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。 记做: T(n) = O(f(n))。它表示随着时间规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
由于时间 2x= n 得到 x = log(2)n,所以这个循环的时间复杂为O(logn)
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
(2)空间复杂度
在写代码的时候可以用空间来换取时间的。
算法的空间复杂度通过计算算法所需要的存储空间实现,S(n) = O (f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
通常,我们都用“时间复杂度”来指运行时间的需求,用“空间复杂度”来指空间需求。
当直接让求“复杂度”时,通常指的是时间复杂度。