def binary_find(element, seq):
low, high = 0, len(seq),
while low != high:
mid = (low + high) // 2
if seq[mid] == element:
return True
elif seq[mid] < element:
low = mid+1
else:
high = mid
return False
def remove_adjacent(seq):
ret = []
last = object()
for element in seq:
if element != last:
ret.append(element)
last = element
return ret
这里有一个更快的解决方案:
它在
O(min(n + m, n * log(m)))
时间内运行,其中n是长度的最小值,m是最大值。它同时迭代两个列表,在开始时跳过尽可能多的元素。在此处提供分析:http://ptspts.blogspot.ch/2015/11/how-to-compute-intersection-of-two.html
任何迭代
L1
,每次迭代所有L2
的操作都需要二次时间。改进的唯一方法是避免遍历所有L2
。(在末尾从L
中删除重复项也有类似的问题。)如果使用
set
表示L2
(和L
),当然每个in L2
步都是恒定时间,因此整个算法是线性的。而且您可以始终构建自己的哈希表实现,而不是使用set
。但这是一个很大的工作。在使用二叉搜索树,甚至只使用排序列表和
binary_find
函数,您可以在O(nlogn)中完成。而且这binary_find
更容易自己编写。所以:或者,更简单地说,也可以对L1排序,然后就不需要
^{pr2}$remove_adjacent
:不管怎样,这是O(nlogn),其中N是较长列表的长度。相比之下,原始答案是O(N^2),其他答案是O(N^3)。当然有点复杂,但还是很容易理解的。在
您需要编写
binary_find
(如果适用的话,remove_adjacent
),因为我假设如果您甚至不想使用额外的内置函数,您就不想使用stdlib之外的东西。但那真的很简单。例如:如果您甚至不想使用
sorted
或list.sort
,那么您也可以很容易地编写自己的排序。在怎么样:
不是特别有效,但是在代码中它看起来像这样(通过重复来说明这一点):
只需检查元素是否已在L中,如果不在L中则添加到L中,就可以避免从L1和L2中删除。那么在L1和L2中是否有重复并不重要。在
相关问题 更多 >
编程相关推荐