使用填充的ArrayList初始化HashSet的时间复杂度是多少?

时间:2017-05-23 20:12:57

标签: java performance collections

我在线阅读HashSet使用HashMap作为其基础数据结构。

HashMap使用ArrayList作为其基础数据结构,列表中的每个项目都是LinkedListtree的对象。

以这种方式初始化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);

2 个答案:

答案 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)