数据结构小结

我们先简单了解一下一些名词的定义。

数据:

对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机程序处理的符号的总称。数据的含义很广泛,如图像、声音等都可以通过编码而归之为数据的范畴。

数据元素:

是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可包含多个数据项。数据项是数据的不可分割的最小单位。如把一本书看成一个数据元素,则可把书名、作者名,看成这个数据元素包含的两个数据项。

数据对象:

是性质相同的数据元素的集合,是数据的一个子集。如整形数据对象是集合 N={0,+-1,+-2......}。

数据结构:

相互之间存在一种或多种特定关系的数据元素的集合。数据元素不是孤立存在的,数据元素相互之间的关系称为结构.

结构定义中的“关系”描述数据元素之间逻辑关系,所以又称为数据的逻辑结构。

通常有4类基本结构: 

  • 集合 :结构中的数据元素除了“同属于一个集合”的关系外,无其它关系。

  • 线性结构: 结构中的数据元素存在一对一的关系。

线性结构特点:a.存在惟一一个被称为“第一个”的数据元素。b.存在惟一一个被称为“最后一个”的数据元素。c.除第一个外,每个数据元素均只有一个前驱。d.除最后一个外,每个数据元素均只有一个后继。

  • 树形结构: 结构中的数据元素存在一对多的关系。

  • 网状结构/图形结构: 结构中的数据存在多对多的关系。

从上面的一些图可以看出:元素或节点可以看成是数据元素在计算机中映像。

数据结构在计算机中的表示(映像)称为数据的物理结构/存储结构

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像非顺序映像。

顺序映像:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

非顺序映像:借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

由上面两种不同的表示方法,可以得到两种不同的存储结构顺序存储结构链式存储结构

任何一个算法的设计取决于选定的数据逻辑结构,而算法的实现依赖于采用的存储结构。

数据类型:

可分为两类:

  • 非结构的原子类型:值不可分解。如整形、字符型、枚举类型、空类型。
  • 结构类型:值是按某种结构组成的,可分解。它的成分可以是非结构的,也可以是结构的。如数组是由若干分量组成,每个分量可以是整形的,也可以是数组。

算法:

对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作。算法有5个重要特性:

  • 有穷性:算法的执行步骤数量有穷,每一步的执行时间有穷。
  • 确定性:算法中每条指令含义要明确。算法只有惟一的一条执行路径,即相同的输入只能得到相同的输出。
  • 可行性:算法是能行的,即算法中描述的操作都可以通过已经实现的基本运算 执行有限次来实现。
  • 输入:0个或多个
  • 输出:1个或多个

线性结构也有很多种:(线性表、栈、队列、串)

线性表是最常用且最简单的一种数据结构,是n个数据元素的有限序列。

线性表的顺序存储结构:用一组地址连续的存储单元依次存储线性表的数据元素。逻辑上相邻的元素物理位置上也相邻。优点是可随机存取表中任意元素。(只要确定了起始位置,线性表中的任一数据元素的位序与起始位置相差一个常数,任意数据元素可随机存取。所以是一种随机存取的存储结构)。缺点是插入删除操作需要移动 大量元素。

线性表的链式存储结构:用一组任意的存储单元存储线性表的数据元素。(任意指:存储单元地址可以是连续的也可以是不连续的)。逻辑上相邻的元素物理位置上不一定相邻。优点是插入删除仅需修改指针,不需要移动数据元素。缺点是没有可随机存取的特点,求线性表的长度时不如顺序存储结构。(在单链表中取得第i个元素,必须从头指针出发寻找,所有不同的位置所花时间不同,所以是非随机存取的存储结构)

另外链表还有 循环链表 和双向链表,这里不详细介绍了。

栈:限定仅在表尾进行插入删除操作的线性表。

栈也分顺序栈和链栈

队列:一种先进先出的线性表,与栈相反.只允许在表的一端插入,而在另一端删除元素。

队列也分链队列和顺序队列。

串:不详细解释了

数组和广义表也不详细解释了。

树和二叉树:

树是:n(>=0)个节点的有限集。有且仅有一个根节点。

森林:是m棵互不相交的树的集合。

二叉树

是另一种树形结构。特点是每个结点至多只有两棵子树,并且子树有左右之分,次序不能颠倒。

二叉树有5种基本形态:

二叉树有下列重要性质:

性质1:在二叉树的第 i 层上至多有2^{i-1}个结点( i >= 1)。

性质2:深度为 k 的二叉树的最大结点数为    \sum_{i=1}^{k}2^{i-1}=2^{k}-1 。所有层数的结点加起来.此时为满二叉树

性质3:对任何一棵二叉树。如果叶子结点数为 n0 ,度为2的结点数为 n2,则 n0 = n2 +1.

设 n1 为度为1的结点数,则  n = n0 + n1 + n2

设 B 为分支总数(只有度为1或2的结点才有分支),所以 B = n1 + 2*n2     n = B + 1     n =  n1 + 2*n2 + 1

下面看一下完全二叉树和满二叉树

性质4:具有 n 个结点的完全二叉树的深度为  (不大于log2n 的整数)+1

性质5:124页不详细介绍了。

二叉树的存储结构:

顺序存储结构:仅适用于完全二叉树。因为如果是一般二叉树,最坏情况下,还是需要长度为 \sum_{i=1}^{k}2^{i-1}=2^{k}-1  的一维数组,然而实际上,一般二叉树并没有这么多的结点。

链式存储结构又分为二叉链表三叉链表。链表中每个结点至少有3个域:数据域与左右两个指针域,三叉链表中加了一个指向双亲结点的指针域。

不同的存储结构,实现二叉树的操作方法也不一样。如 找结点 x 的双亲,在三叉链表中实现很容易,而在二叉链表中需要从根指针出发。

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/81268116