数据结构 绪论

一.数据结构起源
   1968年,美国的Donald E.Knuth教授在其所写的《计算机程序设计艺术》中,系统的阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系。数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。

二.基本概念和术语
   数据 data:描述客观事物的符号。是计算机可以操作的对象,具备两个前提:可以输入到计算机,能被计算机程序处理。对于整型,实数型等数值类型,可以进行数值计算。对于声音,图像,视频等非数值类型,可以通过编码的手段转换成字符数据来进行计算机处理。
   数据元素 data element:组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理。
   数据项 data item:数据元素不可分割的最小单位。比如书目信息是一个数据元素,而书名,作者名是数据项。
   数据对象 data object:性质相同的数据元素的集合,是数据的子集。比如整数数据对象,字符数据对象。
   数据结构 data structure:相互之间存在一种或多种特定关系的数据元素的集合。

三.逻辑结构与物理结构
  数据结构其实就是指数据元素之间的相互逻辑关系。分为四种:集合结构,线性结构,树形结构,图形结构。
  物理结构是指数据的逻辑结构在计算机中的存储形式。分为两种:顺序存储[数据元素存放在地址连续的存储单元里,数据间的逻辑关系和物理关系是一致的],链式存储[数据元素存放在任意的存储单元里,可以连续也可以不连续]。
  
四.抽象数据类型
  数据类型 data type:是指一个值的集合和定义在这值集合上的一组操作的总称。数据类型按照值的不同进行划分,用来说明变量或表达式的取值范围和所能进行的操作。
  原子类型:不可再分解的基本类型。比如整型,实型,字符型。
  结构类型:由若干个类型组合而成,是可以再分解的。比如整型数组。

  抽象数据类型 abstract data type:指一个数学模型以及定义在该模型上的一组操作。其定义仅取决于他的一组逻辑特性,与其在计算机内部如果表示和实现无关。抽象数据类型还可以用户自己定义,可用固有的数据类型来表示和实现,可利用已经实现的操作来进行新的操作。

五.算法定义和特性
  算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
  输入输出:算法具有零个或多个输入,至少需要一个或多个输出。
  有穷性:执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
  确定性:算法的每一步骤都具有确定的含义,不会出现二义性。
  可行性:每一步都必须是可行的,每一步都能通过执行有限次基本操作完成

六.算法设计的要求
  正确性:1.没有语法错误。2.对于合法输入数据产生满足要求的输出结果。3.对于非法的输入数据可以得出满足规格说明的结构。4.对于精心选择的甚至刁难的测试数据都有满足要求的输出要求。
  可读性:写代码是为了让计算机执行,也为了便于他人阅读,理解和交流。
  健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
  时间效率高存储量低:算法执行时间短,程序运行所占用的内存或外部硬盘存储空间小。

七.算法效率的度量
  事后统计方法:需要通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较。但这种方法需要事先编好程序,费时费力。时间的比较又依赖于计算机硬件和软件等环境因素。算法的测试数据设计也很困难,因为程序的运行时间往往还与测试数据的规模有关。
  事前分析估算方法:消耗时间取决于1.算法采用的策略方法。2.编译产生的代码质量。3.问题的输入规模。4.机器执行指令的速度。

八.算法时间复杂度
  函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是大于g(n),那么我们说f(n)的渐进增长快于g(n),算法f的时间复杂度高于g。函数中的常数和其他次要项可以忽略,更应该关注最高阶项的阶数。
  算法的时间复杂度:也就是算法的时间度量,用语句总的执行次数来描述,记做:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐近时间复杂度。

  推导大O阶方法:1.用常数1取代运行时间中的所有加法常数。2.在修改后的运行次数函数中,只保留最高阶项。3.如果最高阶项存在且不为1,则去除与这个项相乘的常数。
  常数阶:与问题规模大小无关,即与n无关,执行时间恒定的算法,称之为具有O(1)的时间复杂度。
  线性阶:循环n次,循环体内是O(1)的步骤序列。
  对数阶:循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。 这里若循环次数设为x,则 2^x = n.因此循环次数为 x = log(n)。

cout = 1;  
while(count < n)  
{  
  count = count * 2;  
  /*时间复杂度为O(1)的步骤序列*/
}    

  平方阶: 总的执行次数为n+(n-1)+(n-2)+...+1 = (n^2+n)/2。因此时间复杂度为O(n^2)。
int i,j;  
for(i=0;i
{  
  for(j=i;j
  {  
      /*时间复杂度为O(1)的步骤序列*/
   }  
}  



   常见的时间复杂度:O(1)<O(log(n))<O(n)<O(nlog(n))<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
   最坏情况与平均情况:没有特殊说明情况下,都是指最坏时间复杂度。

九.算法空间复杂度:
   一个程序在计算机上执行时,除了需要存储程序本身的指令,常数,变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需要的辅助单元相对于输入数据量n是个常数,则称此算法为原地工作,空间复杂度为O(1)。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值