【发布时间】:2017-04-30 09:17:00
【问题描述】:
假设我有一个约 20-100 个整数的数组,例如 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9](实际上数字更像 [106511349 , 173316561, ...],所有非负 64 位整数都在 2^63 以下,但出于演示目的,让我们使用这些)。
还有许多(约 50,000)个较小的数组,通常包含 1-20 个术语来匹配或不匹配:
1=[2, 3, 8, 20]
2=[2, 3, NOT 8]
3=[2, 8, NOT 16]
4=[2, 8, NOT 16] (there will be duplicates with different list IDs)
我需要找出其中哪些是正在测试的数组的子集。匹配列表必须包含所有正匹配,并且没有负匹配。所以对于这个小例子,我需要返回[3, 4] 之类的东西。列表 1 无法匹配,因为它需要 20,而列表 2 无法匹配,因为它没有 8。在这些情况下,可以通过使用高位/使数字为负数来轻松表示 NOT。
我需要以每秒 10,000 次的速度快速执行此操作。小数组是“固定的”(它们很少更改,比如每隔几秒一次),而大数组是针对每个要扫描的数据项完成的(因此每秒有 10,000 个不同的大数组)。
这已经成为一个瓶颈,所以我正在寻找优化它的方法。
我不确定最好的数据结构或表示这一点的方法。一种解决方案是转过头来看看我们甚至需要考虑哪些小清单:
2=[1, 2, 3, 4]
3=[1, 2]
8=[1, 2, 3, 4]
16=[3, 4]
20=[1]
然后我们会建立一个列表来检查,并对这些列表进行完整的子集匹配。但是,某些术语(通常是更频繁的术语)最终会出现在许多列表中,因此这里并没有太大的实际意义。
我想知道是否有人知道解决此类问题的更好算法?
【问题讨论】:
标签: algorithm performance data-structures language-agnostic subset