【发布时间】:2014-09-04 07:14:16
【问题描述】:
我有一个来自表查找的 int 迭代器,需要检查它们的多重集是否包含在给定的固定“多重集”ms 中。目前,我在开始时对ms 进行排序,然后在我的迭代器中对 int 进行排序并检查(排序列表的)多重集包含,如下所示:
vals = sorted(my_vals)
for it in ... :
test_vals = sorted( i for i in it )
if is_sublist(test_vals,vals):
# do stuff
在哪里
def is_sublist(L1,L2):
m = len(L1)
n = len(L2)
i = j = 0
while j <= n:
if i == m:
return True
elif j == n:
return False
a,b = L1[i], L2[j]
if a == b:
i += 1
j+= 1
elif a > b:
j += 1
else:
return False
- 通常,我的列表很短(1--20 个元素)
- 我尝试使用
Counter,但其初始化的时间劣势比遏制测试的时间优势更糟糕。 - 我这样做了~10^6 次,所以我应该在
cython中这样做
任何想法或指针都会很好——谢谢! (抱歉,太早点击发帖按钮了……)
【问题讨论】:
-
is_sublist是做什么的?您正在检查L1“支配”L2的前缀,其中“支配”是指L1[i] >= L2[i]。这是你想要的吗? -
顺便说一句:
sorted(i for i in it)可以写成sorted(it)。 -
is_sublist(L1,L2)返回True如果它L2包含等于L1的有序子列表。
标签: python multiset containment