【发布时间】:2013-02-05 14:32:09
【问题描述】:
定义:数组 A(a1,a2,...,an) 是 >= 比 B(b1,b2,...bn) 如果它们大小相等,则 a_i>=b_i 对于每个 i 从 1 到 n.
例如:
[1,2,3] >= [1,2,0]
[1,2,0] not comparable with [1,0,2]
[1,0,2] >= [1,0,0]
我有一个列表,其中包含大量此类数组(大约 10000,但可以更大)。数组的元素是正整数。我需要从这个列表中删除所有比至少一个其他数组大的数组。换句话说:如果存在这样的B A >= B 然后删除A。
这是我目前的O(n^2) 方法,它非常慢。我只是将每个数组与所有其他数组进行比较,如果它更大,则将其删除。有什么方法可以加快速度。
import numpy as np
import time
import random
def filter_minimal(lst):
n = len(lst)
to_delete = set()
for i in xrange(n-1):
if i in to_delete:
continue
for j in xrange(i+1,n):
if j in to_delete: continue
if all(lst[i]>=lst[j]):
to_delete.add(i)
break
elif all(lst[i]<=lst[j]):
to_delete.add(j)
return [lst[i] for i in xrange(len(lst)) if i not in to_delete]
def test(number_of_arrays,size):
x = map(np.array,[[random.randrange(0,10) for _ in xrange(size)] for i in xrange(number_of_arrays)])
return filter_minimal(x)
a = time.time()
result = test(400,10)
print time.time()-a
print len(result)
附:我注意到使用 numpy.all 而不是内置的 python all 会大大降低程序的速度。可能是什么原因?
【问题讨论】:
-
所以你想要最小的数组?你怎么处理无法比较的数组...我没有关注...
-
没有。我需要删除所有与较小数组相比的数组。例如:List([1,2,3], [1,2,1], [1,0,2])。我需要删除 [1,2,3],因为它大于 [1,2,1]。但是,我无法对 [1,0,2] 做任何事情,因为它无法与任何其他数组进行比较。
-
那么最后,您只剩下无法相互比较的数组了吗?
-
是的!正是我需要的。这是用于求解丢番图方程组的 TSS 算法的一部分。
-
为什么
[1,2,0]和[1,0,2]没有可比性?只是前 n-1 个索引不相等?另一个需要考虑的O(N^2)方法,但可能更快,是使用更高维的 numpy 数组而不是所有这些循环。
标签: python algorithm optimization numpy