我正在计算两个链接列表的交集,其中一个链接列表,如果大小&n;&#39; n&#39;第二个是大小&#39; m。下面的代码将较小的链表的项目存储在一个集合中。因此空间复杂度为O(m),其中m 但是,2个链表可能相等,m = n。复杂性O(n)也是如此? public IntersectionAndUnionLinkedList<T> intersection(IntersectionAndUnionLinkedList<T> list) {
final Set<T> items = new HashSet<>();
Node<T> firstSmall = null;
Node<T> firstBig = null;
if (size <= list.size) {
firstSmall = first;
firstBig = list.first;
} else {
firstSmall = list.first;
firstBig = first;
}
Node<T> n = null;
for (n = firstSmall; n != null; n = n.next) {
items.add(n.item);
}
IntersectionAndUnionLinkedList<T> intersectionlist = new IntersectionAndUnionLinkedList<>();
for (n = firstBig; n != null; n = n.next) {
if (items.contains(n.item)) {
intersectionlist.add(n.item);
}
}
return intersectionlist;
}
答案 0 :(得分:2)
以防 m = n , O(m)= O(n),但可以安全地说明内存复杂度 O( m)因为它是唯一真正的因素。
另一方面,HashSet<T>
在极端情况下可以降低内存效率:毕竟它使用桶,可以以糟糕的方式填充桶。这取决于HashMap<T>
的确切实现。虽然人们仍然期望线性存储器的复杂性,所以 O(m)。