1-1 什么是数据结构

决定了数据的顺序和位置关系。

数据存储于内存时,决定了数据顺序和位置关系的便是“数据结构”。

1-2 链表

链表是数据结构之一,数据呈线性排列。
在链表中,数据的添加删除都较为方便,就是访问比较耗费时间。
第1章 数据结构
特点 :

  1. 每个数据都有1个“指针”,它指向下一个数据的内存地址。
  2. 数据一般都是分散存储于内存中。
  3. 顺序访问。
  4. 添加/删除数据,改变添加位置前后的指针指向.

时间消耗:

  1. 线性查找:O(n);
  2. 添加/删除数据:O(1);

补充说明

循环链表
第1章 数据结构
循环链表没有头和尾的概念。想要保存数量固定的最新数据时通常会使用这种链表。

双向链表
第1章 数据结构
双向链表存在两个缺点:
一是指针数的增加会导致存储空间需求增加;
二是添加和删除数据时需要改变更多指针的指向。

1-3 数组

是数据呈线性排列的一种数据结构。
第1章 数据结构
特点 :

  1. 数据按顺序存储在内存的 连续空间 内,
  2. 每个数据的内存地址(在内存上的位置)都可以通过数组下标算出。
  3. 随机访问。
  4. 添加/删除数据,数组的操作就要比链表复杂多。需要把已有数据一个个移开,最后在空出来的位置上添加数据。

时间消耗:

  1. 查找: 恒定的O(1);
  2. 添加/删除数据:O(n);

补充说明
第1章 数据结构

1-4 栈

栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。

第1章 数据结构
第1章 数据结构
特征

  1. “后进先出”结构(Last InFirst Out,简称LIFO)。
  2. 添加和删除数据的操作只能在一端进行。
  3. 访问数据也只能访问到顶端的数据。

1-5 队列

队列中的数据也呈线性排列。

第1章 数据结构
第1章 数据结构
特征

  1. “先进先出”结构(FirstIn First Out,简称FIFO)。
  2. 添加和删除数据的操作分别是在两端进行。
  3. 不能直接访问位于中间的数据,必须通过出队操作将目标数据变成首位后才能访问。
  4. 给数据设定合适的空间非常重要。

1-6 哈希表

哈希表存储的是由 (key)和 (value)组成的数据。

第1章 数据结构
特征

  1. 把键当成数据的标识符,把值当成数据的内容。
  2. 数据存储上的灵活性和数据查询上的高效性。

说明
在哈希表中,我们可以利用哈希函数快速访问到数组中的目标数据。如果发生哈希冲突,就使用链表进行存储。这样一来,不管数据量为多少,我们都能够灵活应对。

如果数据的空间太小,使用哈希表的时候就容易发生冲突,线性查找的使用频率也会更高;
反过来,如果数据的空间太大,就会出现很多空箱子,造成内存的浪费。因此,给数据设定合适的空间非常重要。

补充说明
在存储数据的过程中,如果发生冲突,可以利用“链地址法”,
“开放地址法”,“线性探测法”等方法计算候补地址。

1-7 堆

堆是一种图的树形结构,被用于实现“优先队列”(priority queues)。
优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺序取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。

第1章 数据结构
特征

  1. 堆中的每个结点最多有两个子结点。且子结点必定大于父结点。
  2. 树的形状取决于数据的个数。
  3. 结点的排列顺序为从上到下,同一行里则为从左到右。
  4. 堆中最顶端的数据始终最小。

消耗时间

  1. 最小值的时间复杂度都为O(1)。
  2. 重构树的时间复杂度便为O(logn)。
  3. 添加数据O(logn)。

1-8 二叉查找树

二叉查找树(又叫作二叉搜索树或二叉排序树)是一种数据结构,采用了图的树形结构。
第1章 数据结构
特征

  1. 每个结点的值均大于其左子树上任意一个结点的值。
  2. 每个结点的值均小于其右子树上任意一个结点的值。
  3. 二叉查找树的最小结点要从顶端开始,往其左下的末端寻找。
  4. 二叉查找树的最大结点要从顶端开始,往其右下的末端寻找。

时间复杂度

  1. 比较的次数取决于树的高度。
  2. 树的形状又较为均衡的话,比较大小和移动的次数最多就是log2n。因此,时间复杂度为O(logn)。
  3. 如果树的形状朝单侧纵向延伸,树就会变得很高,此时时间复杂度也就变成了O(n)。

补充说明

平衡二叉查找树,可以修正形状不均衡的树,让其始终保持均衡形态,以提高查找效率。
子结点数可以自由设定,并且形状均衡的树便是B树。

相关文章: