我的用例是在多个级别上应用过滤器。将其视为仅具有2个级别的树结构(目前,我的用例仅包括2个级别,但预期的解决方案应该是具有超过2个级别的可能性)。
*-----------* ( Level 1 )
/ \ / \
/ \ / \
* * * * (level 2)
我想要一个能够有效存储这些信息并给出数千个单独条目的数据结构,我应该能够根据用户的接受偏好来过滤数据。
级别1的大小为数千,级别1的每个成员依次可以有数千个子级。
示例 - 让我们考虑一个问题,我有来自2个国家,美国和英国的数千人,我想根据用户要求过滤人。考虑用户在多个级别上有多个选项。
US--------------------------UK ( Level 1 )
/ \ / \
/ \ / \
/ \ / \
/ \ / \
florida texas london Manchester
/\ |\ /\ /\
/ \ | \ / \ / \
/ \ | \ / \ / \
Male Female M F M F M F
Eg1 - 用户说删除了美国的所有人。 因此,在遍历人员列表时,我将删除所有国家==美国
的人Eg2 - 用户说从列表中删除所有美国人,但不应删除德州人。
Eg3 - 用户说美国的所有人都应该被包括在内,除了德克萨斯州的男性。
那么存储这些规则的最佳数据结构是什么,并将其应用于列表以根据用户的偏好获取人员。
加上它,可以有数千个国家和数千个城市。
如果您可以建议两个级别的数据结构,即使这样也会很棒。
答案 0 :(得分:0)
我建议使用多个索引的简单列表。也就是说,无论他们在哪个国家/地区,您都会列出所有人。
然后,您决定要将哪些属性用于过滤器。你提到过国家,州,城市和性别。所以你有四个哈希映射。
因此,如果您想选择居住在美国德克萨斯州的所有男性,您只需要与列表相交。那就是:
(尽管在这种情况下,你可以通过注意住在德克萨斯州的每个人都住在美国,并消除第一个十字路口来优化上述内容。)
无论如何,使用这种技术,您可以有任意数量的选择标准。
如果您有k
选择条件,则最差情况下的运行时间与k * n
成比例,其中n
是您列表中的总人数。平均运行时复杂度应该更好。如果您根据哈希集中的条目数量订购交叉点,则可以快速缩短运行时间。例如,在上述情况下,您首先要选择居住在德克萨斯州的人数,这会大大减少您的搜索空间。然后与美国交叉,最后是性别。
索引的空间复杂度为O(n * k)。也就是说,每个人的每个哈希映射中都会有一个条目。