我在线阅读HashSet
使用HashMap
作为其基础数据结构。
HashMap
使用ArrayList
作为其基础数据结构,列表中的每个项目都是LinkedList
或tree
的对象。
以这种方式初始化HashSet
时的时间复杂度是多少?可以 O(1)吗?如果没有,为什么?
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.add(6);
list.add(0);
HashSet<Integer> set = new HashSet<>(list);
答案 0 :(得分:3)
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return viewModel.items[section].sectionTitle
}
不使用HashMap
作为其基础数据结构。
ArrayList
维护一个由原始数组构建的哈希表,并使用链表或树的混合策略来处理冲突。您可以通过检查source code for java.util.HashMap
。
因为要构建一个哈希表,你需要在每个条目上调用哈希函数来确定哈希位置,最小边界是O(N)。最坏的情况是病态分布的密钥(例如,每个密钥是冲突),这将比O(N)差得多。由于Java 8实现在最坏的情况下降级为平衡树而不是链表,因此最坏情况的运行时将为O(N log N)。 (在先前版本的Java中,使用线性探测,我认为最坏的情况是O(N²))。
答案 1 :(得分:1)
您的List
可以包含n
个可能全部重复或全部唯一或混合的对象。
HashSet
集合的属性是它不包含重复的对象。
因此,遍历List
并将每个对象添加到HashSet
的时间复杂度为O(n)