我有2个数组A和B.我试图找到数组A和B中常见元素的最小值。
赞,如果A = [1,3,2,1]
& B = [4,2,5,3,2]
,因此它应该返回2
,因为它是A& A中的最小元素。 B.我的代码适用于这种情况,但在某些情况下它不起作用。我不知道如何解决它。请帮忙!
def findMin(A, B):
A.sort()
B.sort()
i = 0
for x in A:
if i < len(B) - 1 and B[i] < x:
i += 1
if x == B[i]:
return x
return -1
另外,我希望最坏的情况时间复杂度为O((N+M)*log(N+M))
答案 0 :(得分:5)
你在那里投掷你并不真正需要的东西,找到两者的交集使用一套,然后拿最小...
>>> A = [1,3,2,1]
>>> B = [4,2,5,3,2]
>>> min(set(A).intersection(B))
2
这将使你的功能:
def findMin(A, B, default=-1):
return min(set(A).intersection(B), default=default)
默认参数是在两个列表之间没有交集时返回的内容(您似乎选择了-1),但这是Python 3.x的补充,如果您遇到Python 2.x,则需要通过例外来处理它,例如:
def findMin(A, B, default=-1):
try:
return min(set(A).intersection(B))
except ValueError:
return default
至于复杂性,最坏的情况是交叉点为O(len(A) * len(B))
,尽管平均情况为O(min(len(A), len(B))
(请参阅time complexity),然后您需要min
操作添加在顶部的是O(N)
。
答案 1 :(得分:2)
awk '{$1=$3=""}1' file
返回a = [1,2,3,4,5,6]
b = [3,5,7,9]
shared = (set(a).intersection(b))
shared = sorted(shared)
print shared[0]
答案 2 :(得分:1)
Itertools chain aproach:
>>> import itertools
>>> A = [1,3,2,1]
>>> B = [4,2,5,3,2]
>>> min(x for x in itertools.chain(A, B) if x in A and x in B)
2
答案 3 :(得分:0)
我建议使用set
,因为它的实现速度会快得多。您只需要在转换为min
s的两个列表的交集处使用set
函数。它太简单,高效,不需要任何排序。
min(set(A) & set(B))
要使初始算法正常工作,您只需要将if
替换为while
循环:
while i < len(B) - 1 and B[i] < x:
答案 4 :(得分:0)
如果数组的大小存在很大差异,则更快的方法是为set
创建一个较小的intersection
:
def find(a, b):
small, large = sorted([a, b], key=len)
return min(set(small).intersection(large), default=-1)
与100000
和10000
元素的比较:
import random
import timeit
def find_no_sort(a, b):
return min(set(a).intersection(b), default=-1)
a = [random.randrange(0, 100000) for _ in range(100000)]
random.shuffle(a)
b = [random.randrange(0, 100000) for _ in range(10000)]
random.shuffle(b)
print('Sorted: ', timeit.timeit('find(a, b)', number=100, globals=globals()))
print('Not sorted: ', timeit.timeit('find_no_sort(a, b)', number=100, globals=globals()))
输出(Windows 8上的Python 3.5.1):
Sorted: 0.8935029393830678
Not sorted: 1.7727491360998975