- 集合和映射都是高级的数据结构
- 他们都是由动态数据结构(链表,二叉树)底层实现的
集合
- 一般元素不能重复(多重集合允许元素重复)
链表实现
- 链表中不允许重复元素出现即可实现集合
- 但是链表的平均复杂度是O(n),所以集合复杂度是O(n2) (假设集合中有n个元素),因此效率很低
- Java中的HashSet是结合哈希表和链表实现的集合,性能很好
二分搜索树实现
- 二分搜索树可以自然而然地实现集合
- 二分搜索树的优势在于每次遍历都是一分为二,一般可以少遍历很多元素,因此平均复杂度是O(log n)
- 因此集合复杂度是O(n * log n)
- O(log n) 比 O(n) 表现好得太多了
二分搜索树的致命缺点
- 同样的数据,可以对应不同的二分搜索树。当二分搜索树中的元素有序添加时,比如依次添加1 2 3 4 5 6 7…,那就会形成一个链表(也就是退化成链表了),性能会大大降低!
- 为了解决这个问题,提出了平衡二叉树(也就是红黑树),Java类库中的TreeSet就是由红黑树底层实现的
有序集合和无序集合
- 有序集合的元素具有顺序性 —> 这是基于搜索树的实现
- 无序集合的元素不具有顺序性 —> 这是基于哈希表的实现
映射
- 也称字典
- 有两个值 key、 value
- 非常容易使用链表或者二分搜索树来实现
- 原来的链表中每个节点至存储一个值,只要再多存储一个值,即可实现映射
- 如果映射中的value都为null,则相当于set
- 一般来说映射中的key不能重复,value可以重复(但是多重映射允许有重复的键)
- 同样的,
- 有序映射中的键具有顺序性 —> 基于搜索树的实现
- 无序映射中的键不具有顺序性 —> 基于哈希表的实现