常见数据结构
在计算机科学中,数据结构(英语:data structure)是计算机中存储、组织数据的方式。 数据结构意味着介面或封装:一个数据结构可被视为两个函数之间的介面,或者是由数据类型联合组成的存储内容的访问方法封装。本文介绍一些常见的数据结构以及查询时间复杂度。
数组
- 所谓数组,是相同数据类型的元素按一定顺序排列的集合。
- 特点: 长度固定,无法动态扩展,空间分配快,存在空间浪费,查询效率高。
链表
- 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
- 特点:动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。
二叉树
- 有一个ROOT节点
- 每一次查询都需要从一个节点开始进行,如果是图类的数据结构,则起点是不固定的。
- 一个节点有两个子节点
- 与拥有多个子节点的树相比,两个子节点会让树变得更深,好处二叉排序树时会看到。
- 父节点都有一个到子节点的引用(指针)
- 有些时候,为了遍历方便,还需要一个从子节点到父节点的引用(指针)。
二叉有序树
- 左边的子节点上的数据一定比父节点的小。
- 右边子节点一定比父节点的数据大。
平衡二叉有序树
- 一棵空树或它的左右两个子树的高度差的绝对值不超过 1。
- 左右两个子树都是一棵平衡二叉树。
跳表(skiplist)
- 由很多层结构组成
- 每一层都是一个有序的链表。
- 最底层(Level 1)的链表包含所有元素。
- 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
- 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。
B 树
- 保持数组大小不变,增加数组的个数。
- 树高:一般来说,树的高度要比二叉平衡树低很多。
- 数组:每一个node,都是一个“数组”。
B+ 树
- Branch节点不能直接查到数据后返回,数据必须读穿或写穿到leaf节点后才能返回。
- 子叶节点的最后一个元素是到下一个leaf节点的指针。
查询时间复杂度
- 数组: 数组中第 n 个数据的时间花费是 O(1) 但是要在数组中查找一个指定的数据则是 O(N)。
- 链表: 查找一个节点或者访问特定编号的节点则需要 O(n) 的时间。
- 二叉树:普通二叉树查询每个结点只需遍历一次,故时间复杂度为O (n)。
- 二叉有序树: 因为有序,最好的情况是 O(logn),但是可能不平衡,最坏是 O(n)。
- 平衡二叉有序树:O(logn)。
- skiplist: O(logn)。
- B树: O(logn), B 树相比于普通的平衡二叉树在于其节点是个数组,他的树高度比较低。
- B+ 树:O(logn)B+ 树相比 B 树 在于Branch节点不能直接查到数据后返回,数据必须读穿或写穿到leaf节点后才能返回,子叶节点的最后一个元素是到下一个leaf节点的指针。这样的好处很好支持范围查询。