动态数据结构是支持动态的更新操作,里面存储的数据是时刻在变化的。它支持快速地查询、快速插入、删除数据。
本文没有对各种动态数据结构的定义和实现进行分析,而是简要地讨论它们的优势、劣势和应用场景。因为对于工程应用来说,更重要的是根据这些数据结构的特点,合理地使用它们。
1、散列表
散列表使用哈希函数进行映射,因此查找、插入、删除操作的时间复杂度一般为O(1)。
限制:①要求设计合适的散列函数。要尽可能让散列后的值随机且均匀分布,这样会尽可能地减少散列冲突,即便冲突之后,分配到每个槽内的数据也比较均匀。并且,散列函数的设计也不能太复杂,太复杂就会太耗时间,也会影响散列表的性能。
②要求尽可能避免散列冲突。一般有开放寻址法和拉链法,开放寻址法在插入操作频繁的情况下,性能下降严重,拉链法更为普适。为了避免频繁插入后,遍历链表的时间复杂度太高,还可以将链表改为其他动态查找数据结构,比如红黑树,在jdk8中,HashMap底层就采用了这一策略。
缺点:①不能顺序遍历;②如果要扩容、缩容的话会出现性能损耗。
适用场景:适用于那些不需要顺序遍历,且数据插入删除并不频繁的情况。
2、跳表
跳表基于用空间换时间的原理,通过对有序链表构建多级索引来提高查询的效率,让链表也可以进行“二分查找”。支持快速的插入、删除、查找操作,时间复杂度都是 O(logn)。并且,可以实现顺序遍历、范围