如何在python中以给定的时间复杂度从两个数组中找到最小元素

时间:2016-08-05 20:01:46

标签: python time-complexity minimum

我有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))

5 个答案:

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

10000010000元素的比较:

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