我有一个应用程序,其中有很多组。一套可能是
{4, 7, 12, 18}
唯一编号且全部小于 50。
然后我有几个数据项:
1 {1, 2, 4, 7, 8, 12, 18, 23, 29}
2 {3, 4, 6, 7, 15, 23, 34, 38}
3 {4, 7, 12, 18}
4 {1, 4, 7, 12, 13, 14, 15, 16, 17, 18}
5 {2, 4, 6, 7, 13, 15}
数据项 1、3 和 4 与集合匹配,因为它们包含集合中的所有项目。
I need to design a data structure that is super fast at identifying whether a data item is a member of a set includes all the members that are part of the set (so the data item is a superset of the set). My best estimates at the moment suggest that there will be fewer than 50,000 sets.
我当前的实现将集合和数据作为无符号 64 位整数并将集合存储在列表中。然后为了检查数据项,我遍历列表进行 ((set & data) == set) 比较。它可以工作,并且空间效率高,但速度很慢(O(n)),我很乐意用一些内存来换取一些性能。有人对如何组织这个有更好的想法吗?
Edit:非常感谢所有的答案。看来我需要提供有关该问题的更多信息。我先获取集合,然后逐一获取数据项。我需要检查数据项是否与其中一组匹配。
这些集合很可能是“块状”的,例如对于给定的问题 1、3 和 9 可能包含在 95% 的集合中;我可以在某种程度上提前预测这一点(但不是很好)。
对于那些建议记忆化的人:这是记忆化函数的数据结构。这些集合代表已经计算出的通用解,数据项是函数的新输入。通过将数据项与通用解决方案相匹配,我可以避免大量处理。