Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-2列表,并从2个列表中查找最大乘积_Python_List - Fatal编程技术网

python-2列表,并从2个列表中查找最大乘积

python-2列表,并从2个列表中查找最大乘积,python,list,Python,List,我有两个由数字(整数)组成的列表;两者都有200万个独特的元素 我想从列表1中找到数字a,从列表2中找到数字b- 1)a*b should be maximized. 2)a*b has to be smaller than certain limit. 以下是我的想法: maxpq = 0 nums = sorted(nums, reverse=True) nums2 = sorted(nums2, reverse=True) for p in nums: n = p*dropwhi

我有两个由数字(整数)组成的列表;两者都有200万个独特的元素

我想从列表1中找到数字a,从列表2中找到数字b-

1)a*b should be maximized.
2)a*b has to be smaller than certain limit.
以下是我的想法:

maxpq = 0
nums = sorted(nums, reverse=True)
nums2 = sorted(nums2, reverse=True)
for p in nums:
    n = p*dropwhile(lambda q: p*q>sqr, nums2).next()
    if n>maxpq:
        maxpq=n
print maxpq
有什么建议吗? 编辑:我的方法太慢了。这需要一天以上的时间。

这可能会更快

def doer(L1, L2, ceil):
    max_c = ceil - 1
    L1.sort(reverse=True)
    L2.sort(reverse=True)
    big_a = big_b = big_c = 0

    for a in L1:
        for b in L2:
            c = a * b
            if c == max_c:
                return a, b
            elif max_c > c > big_c:
                big_a = a
                big_b = b
                big_c = c

    return big_a, big_b


print doer([1, 3, 5, 10], [8, 7, 3, 6], 60)

注意,它对列表进行了适当的排序;这会更快,但在您的场景中可能适用,也可能不适用。

谢谢大家的建议和想法。我终于想出了一个有用的解决办法。他在这件事上表现得很好

它使用python标准库中的
bisect
模块

编辑:对分模块进行二进制搜索,以便在排序列表中查找值的插入位置。因此,它减少了比较的数量,这与我以前的解决方案不同


以下是线性时间解决方案(排序后):


你有什么用?如果没有,它有什么问题?它太慢了D列表1有2000000个元素,这意味着根据我的代码,必须进行2000000个比较-在我的常春藤桥上的比较速度大约为1~2个比较/秒。这不会很顺利。你可能应该在你的问题中提到这一点,因为它目前非常模糊。为什么不直接做
max(nums)*max(nums2)
?@JoelCornett
a*b必须小于某个限制。
谢谢你的帮助,但不幸的是,我没有看到任何显著的加速。我想有一些很棒的算法在等着我们:PAh,二进制搜索可能是最好的,我去写一个二进制搜索算法,然后再回来,发现问题已经解决了:Pbisect确实解决了,上的第一段是一个很好的解释-它很快,因为它只需要查看列表中的一小部分项目(第一步是查看中间值,看看目标是在该点之前还是之后,然后可以忽略列表的一半)哦,我忘了一个条件。现在试试,谢谢。它返回正确的值,比对分模块更快<代码>11564.4234058毫秒用于我的对分,代码>5679.87929394毫秒用于你的对分:D
import bisect

def bisect_find(num1, num2, limit):
    num1.sort()    
    max_ab = 0

    for a in num2:
        complement = limit / float(a)
        b = num1[bisect.bisect(num1, complement)-1]

        if limit > a*b > max_ab:
            max_ab=b*a

    return max_ab
def maximize(a, b, lim):
    a.sort(reverse=True)
    b.sort()
    found = False
    best = 0
    j = 0
    for i in xrange(len(a)):
        while j < len(b) and a[i] * b[j] < lim:
            found = True
            if a[i]*b[j] > best:
                best, n1, n2 = a[i] * b[j], a[i], b[j]
            j += 1
    return found and (best, n1, n2)
a = [2, 5, 4, 3, 6]
b = [8, 1, 5, 4]
maximize(a, b, 2)   # False
maximize(a, b, 3)   # (2, 2, 1)
maximize(a, b, 10)  # (8, 2, 4)
maximize(a, b, 100) # (48, 6, 8)