常用数据结构优缺点对比
常用数据结构 | 使用场景 | 优点 | 缺点 | 备注 |
数组 | 数据量小、数据规模已知 | 在已知下标的情况下可以随机访问修改元素值O(1) | 大小固定,删除,插入效率低,存储数据种类单一 | 创建时在内存中预留一块连续的区域,内存空置率高利用率较低,删除某一个,右序位置都会受到影响,有序数组比无序查找更快 |
链表 | 数据量较小,需要频繁增加,删除操作的场景 | 插入、删除快,内存利用率高 | 因为含有大量的指针域,占用空间较大;查找元素需要遍历链表来查找O(n),效率低 | 创建时不指定大小,内存大小随数据量变化;内存的存储位置可以在任何地方,不要求连续,可扩展性强;每一个数据保存邻近的数据的地址 |
顺序栈 | 输入数据量可预知,应用于实现递归功能方面,例如斐波那契数列。 | 提供一种后入先出的存储方式 | 只能在一头操作数据,存取其他项很慢,如果对数组大小创建不当,可能会产生栈溢出的情况 | 在输入数据可预知的情况下,使用数组实现栈,并且数组实现栈效率更高,出入栈都在数组末尾 |
链栈 | 输入数据量未知 | 不会出现栈溢出 | 由于入栈时,需要创建插入节点,要向操作系统申请内存,所以链栈没有顺序栈效率高 | 同上 |
队列 | 数据量小、数据规模已知 | 提供一种先入先出的存储方式 | 只能在一头添加,另一头获取存取其他项很慢 | 如果数据量已知就使用数组实现队列,未知就使用链表实现,出队和入队均是O(1) |
二叉查找树 | 结合数组和链表的优点,适合数据量较大且数据是随机分布的 | 查询增删速度较快(如果树平衡),存储的数据类型相对灵活,不指定内存大小,内存利用率较高 | 1.只能从根节点开始查询,不具备随机访问性;2.插入数据不随机且连续有序时,构造的二叉树就会只有左子树或右子树,形成一种链式结构,查询增删效率O(logN)降低,甚至接近链表为O(n) | 具有一定顺序,左子节点值较小,右子节点值较大 |
平衡二叉树(红黑树) | 无论数据是否随机分布都能提供O(logN)级别的查询,增删效率 | 改善了二叉搜索树的缺点 | 实现起来稍微复杂,平衡树结构会产生了额外开销 | 它的前提是一个二叉搜索树,且任意节点的子树的高度差都小于等于 1,改善了二叉搜索树的缺点 |
堆(完全二叉树) | 常用于实现优先队列,如针对TOP型排序问题(获取最大或最小前n项) | 插入删除较快,对最值数据项存取很快 | 对其他项存取很慢 | 堆是一颗完全二叉树,堆中任意节点总是不大于或不小于其子节点的值。 |
哈希 | 数据量大且不需要对最大最小值存取 | 关键字已知则存取速度极快 | 如果不知道关键字则存取很慢;基于数组,创建后扩展性差;数据没有顺序概念 | 哈希表中的 key 是不允许重复的;基于哈希映射,会有冲突产生 |
图 | 对现实世界的建模 | 直观 | 有些算法慢且复杂 | |
排序算法对比