图片说明

数据结构的基本概念

  • 数据:数据是信息的载体,是所有能描述事物属性的数,字符以及所有能输入到计算机被计算机程序识别和处理的符号的集合
  • 数据元素:数据元素是数据的基本单位
  • 数据项:数据项是构成数据元素不可分割的最小单位
  • 注意:不要混淆数据,数据元素和数据项,例如:学生记录就是一个数据元素,它由学号,姓名,性别等数据项组成
  • 数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集
  • 数据类型: 原子型,结构类型和抽象数据类型:抽象数据组织与相关操作
  • 抽象数据类型:通常用数据对象,数据关系和数据操作三组来表示抽象数据类型
  • 数据结构:是相互之间存在一种或者多种特定关系的数据元素的集合,数据结构主要包括三个方面的内容(逻辑结构,存储结构,数据运算),一个算法的设计取决于逻辑结构,而算法的实现则取决于存储结构
  • 数据的逻辑结构
  • 数据的逻辑结构分为线性结构和非线性结构
  • 线性结构:结构中的数据元素只存在一对一的关系
  • 树形结构:结构中的数据元素存在一对多的关系
  • 图状结构和网状结构:结构中的数据元素存在多对多的关系
  • 集合:结构中的数据元素除了”同属于一个集合”的关系外,别无其他的关系

数据的存储结构

数据的存储结构是指数据元素在计算机中的表示,又称为物理结构,是数据的逻辑结构用计算机语言的实现,是基于计算机语言的,数据的存储结构是逻辑结构在计算机上的映射,他不能独立于逻辑结构存在

  • 顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元里面,元素之间的关系用存储单元之间的关系来表示,其优点是可以实现随机存取,每个元素占用最小的存储空间,缺点是只能使用相邻的一整块存储单元,可能产生较多的外部碎片
  • 外部碎片,是由于大量信息由于先后写入、置换、删除而形成的空间碎片。为了便于理解,我们将信息比作货物,将存储空间比作仓库来举例子。假设,我们有编号为1、2、3、4、5、6的6间仓库库房,前天送来了一大宗货,依次装入了1、2、3、4、5号仓库,昨天又因故将4号库房的货物运走了,那么数值上说我们还有两间空仓库的空间,但是如果这时候送来两间仓库容量的货物但要求必须连续存放的话,我们实际上是装不下的。这时的4、6号仓库,就成为一种空间的碎片。由于这样的原因形成的空间碎片,我们称之为外部碎片。从上面的例子我们可以理解,外部碎片是可以通过一些措施来改善或者解决的。对于在硬盘上的外部碎片,我们通常用磁盘碎片整理来解决,对应上面的例子,就是将5号仓库的货物及时移动到新腾出的4号仓库,这样,1-4号仓库都是满的,而5、6号仓库则形成了有效的、连续的空间,能够适应新的应用要求了;对于内存中的外部碎片,我们内存管理中常用的页面管理形式,就是为了解决这个问题的。这里就不详述了。
  • 内部碎片,是由于存量信息容量与最小存储空间单位不完全相符而造成的空间碎片。还是沿用上面的例子,这次我们的6间仓库目前都是空置的,但是假设我们管理仓库的最小空间单位是间,今天运来了容量为2.5间仓库的货物,那也要占用我们1-3号3间仓库,尽管3号仓库还闲置着一半的空间,但是这半间仓库已经不能再利用了(因为是以间为最小单位么);这时,我们的仓库中就形成了半间仓库的空间碎片,仓库的有效容量只剩下3间仓库了
  • 链式存储 :不要求逻辑上相邻的数据元素在物理位置上也相邻,借助指示存储位置的指针来表示元素之间的逻辑关系,优点是不会出现碎片现象,充分利用所有的存储单元,缺点是:每个元素存储指针而占用多余的存储空间,只能实现顺序存取
  • 索引存储:在存储元素信息的同时,还建立附加的索引表,索引表中的每一项为索引项,索引项由关键字和地址组成,其优点是检索速度快,缺点是增加了索引表占用多余的内存空间,在增加删除数据时都需要修改索引表
  • 散列存储:根据元素的关键字直接算出元素的存储地址,优点是检索,删除增加元素速度都很快,缺点是,如果散列函数不好的话可能出现存储单元的冲突,解决的话会增加时间和空间的开销

数据的运算

运算的定义是根据逻辑结构的,指出运算的功能,运算的实现是根据存储结构的,指出运算的基本步骤
例题

链式存储设计时,结点内的存储单元地址是(A)
A.一定连续 B.一定不连续
C.不一定连续 D.部分连续,部分不连续
请在这里输入引用内容
解析:链式存储设计时,各个结点的存储空间可以不连续,但是结点内的存储单元地址一定是连续的

算法的基本概念

算法是对特定问题的一种求解步骤,是指令的有限序列,其中每一条指令有一条或多条操作
算法的五大重要特性
1.有穷性
2.确定性:不会产生二义性,相同的输入只能有相同的输出
3.可行性
4.输入
5.输出
一个好的算法有下面的特点:
正确性,可读性,健壮性和效率与低存储量需求

时间复杂度

(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
图片说明
解析:选C,n始终为问题规模,时间频度与n^2成正比
图片说明
解析:选B

图片说明
解析:选A
算法原地工作是指辅助空间为常量
算法的时间复杂度不是程序具体执行时间,不可以赋予n一个特殊的值

空间复杂度

一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。