您的问题是您必须遍历 的每个组合(n1, n2)
,并且存在组合,当并且仅相当大len(numset1) * len(numset2)
时,它们变得非常大。numset1
numset2
换句话说,你的算法的运行时间是 O(n^2) (如果len(numset1)
大约等于len(numset2)
。让我们让运行时间更快。:-)
如果我们对列表进行排序,这将变得容易得多。所以让我们排序numset1
和numset2
。
>>> numset1.sort()
>>> numset2.sort()
现在,比较numset1
(call it) 的最小元素和 (call it )n1
的最小元素。如果较小,那么我们知道有比它大的元素。如果更小,我们知道其中没有任何元素比它小。numset2
n2
n1
len(numset2)
numset2
n2
numset1
现在,我们不想实际删除列表开头的元素,因为这是对 Python 列表的 O(n) 操作。因此,让我们跟踪我们在每个列表中的位置并迭代。
>>> n1_idx, n2_idx, accumulator = 0, 0, 0
>>> while n1_idx < len(numset1) and n2_idx < len(numset2):
if numset1[n1_idx] < numset2[n2_idx]:
accumulator += len(numset2) - n2_idx
n1_idx += 1
else:
n2_idx += 1
在此操作结束时,我们花费了 O(nlog(n)) 时间对列表进行排序,并花费了 O(n) 时间进行迭代,因此我们的整体运行时复杂度为 O(nlog(n))。
那,并且accumulator
有对的数量(n1, n2)
where n1 < n2
。