我试图弄清楚对 Java 基本集合的操作有哪些复杂性(使用 big-o 符号)。与C++ 语言的这个问题类似。
这是我所拥有的,使用常识:
列表
数组列表
- 加(E e) O(1)
- 添加(整数索引,E e) O(n)
- 设置(int索引,E元素 O(1)
- 获取(整数索引)O(1)
- 删除(E e)删除(整数索引) O(n)
- 包含(E e)O(n)
- 列表连接(addAll)O(n)
链表
- 加(E e) O(1)
- 添加(整数索引,E e) O(n)
- 设置(int索引,E元素 O(n)
- 获取(整数索引)O(n)
- 删除(E e)删除(整数索引) O(n)
- 包含(E e)O(n)
- 列表连接(addAll)O(1)
套
HashSet 和 LinkedHashSet
- 加(E e) O(1)
- 删除(E e)O(1)
- 包含(E e)O(1)
- 使用迭代器查找/获取元素O(n)
树集
- 加(E e) O(log n)
- 删除(E e)O(log n)
- 包含(E e)O(log n)
- 全部添加O(n log n)
- O(n)使用迭代器或可能O(log n)在实现二分查找时查找元素
地图
HashMap 和 LinkedHashMap
- put(K键,V值) O(1)
- 得到(K键) O(1)
- 删除(E e)O(1)
- containsKey(对象键) O(1)
- 包含值(对象值)O(n)
- 全部放O(n)
- 使用迭代器查找/获取元素,O(n)或者可能O(log n)与
TreeSet
树状图
- put(K键,V值) O(log n)
- 得到(K键) O(log n)
- 删除(E e)O(log n)
- containsKey(对象键) O(log n)
- 包含值(对象值)O(n)
- 全部放O(n log n)
- 使用迭代器查找/获取元素O(n)
注意:基于散列的集合假定设计良好的散列函数在,O(1)否则它在O(n)
问题: 这是正确的吗?