给定两个列表(不一定排序),最有效的非递归算法是什么,用于查找这些列表的交集?
我不认为我可以访问哈希算法。
给定两个列表(不一定排序),最有效的非递归算法是什么,用于查找这些列表的交集?
我不认为我可以访问哈希算法。
为什么不自己实现一个简单的哈希表或哈希集?如果你的列表很大,避免nlogn交集是值得的。
由于你事先对数据有一定了解,应该能够选择一个好的哈希函数。
时间复杂度: O(n) 空间复杂度: O(1) 用于识别交点的解决方案。
例如,通过在每次到达末尾时交换指针,这两个给定节点将检测到交点。 视频解释在此处。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pA = headA;
ListNode pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
谢谢。
我对交集的理解是找到交点。
例如:
对于给定的列表 A 和 B,A 和 B 将在点 c1 "相遇/交叉",上述算法将返回 c1。正如 OP 所述,OP 没有访问哈希映射或某种类型,我相信 OP 是说该算法应具有 O(1) 空间复杂度。根据Big-Oh符号的定义:
如果存在正常数c和n 0 ,使得N ≥ n 0 时 T(N) ≤ cf(N),则 T(N) = O(f(N))。
实际意义是,如果两个列表的大小相对较小,例如每个列表不超过100个元素,则使用两个for循环可以很好地解决问题。循环第一个列表并在第二个列表中查找相似的对象。在我的情况下,它可以很好地工作,因为我的列表中不会有超过10-20个元素。但是,一个好的解决方案是对第一个列表进行排序O(n log n),对第二个列表也进行排序O(n log n),然后将它们合并,大约需要O(n log n)的时间,粗略地说是O(3n log n),假设两个列表的大小相同。
在PHP中,类似于
function intersect($X) { // X is an array of arrays; returns intersection of all the arrays
$counts = Array(); $result = Array();
foreach ($X AS $x) {
foreach ($x AS $y) { $counts[$y]++; }
}
foreach ($counts AS $x => $count) {
if ($count == count($X)) { $result[] = $x; }
}
return $result;
}