定義: 配列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 ですが、それ以上になる可能性があります) で構成されるリストがあります。配列の要素は正の整数です。このリストから、少なくとも 1 つの他の配列よりも大きいすべての配列を削除する必要があります。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
PS組み込みのpythonの代わりに使用するとall
、プログラムが劇的に遅くなることに気付きました。その理由は何ですか?