我有预先定义的匹配: 父ENTITY具有与之关联的SET键值。 父ENTIRY下的每个SET可以定义为
ENTITY A:
SET A1. {key1=v11 and key2!=v25}
SET A2. {key1=v12 and key3=v31, v33}
SET A3. {key1=v15 and key2=v25 and key3=v35}
Entity B:
SET B1. {key1=v16 and key2=v26}
SEY B2. {key3!=v39}
SET B3. {key1!=v11 and key3=v31}
我会收到输入为:
{
key1 : [v11,v12,v13],
key2 : [v23,v24],
key3 : [v31,v39]
}
这意味着key1有3个值,key2有2个值,key3只有一个值。
然后我必须返回所有具有至少一个SET的实体,其中所有键值匹配都由传递的键值对满足。
因此,对于上面提到的实体A,集合A1和集合A2的输入满足其键值对,而对于ENTITY B,没有集合满足其键值对。 所以只有ENTITY A就是答案。
可以有200-1000个父母ENTITIES,每个父母20个SET ENTITY&每个SET 200个键值对。输入最多可包含50个键值对。
我无法查询外部数据库以进行评估。但是数据结构应该是可序列化的,以便存储到memcache或redis中。
答案 0 :(得分:0)
为了简单起见,让我修复符号并在python中编写。
你称之为ENTITY的是一组用“键”标记的词典,其中对象列表为值。为简单起见,我们假设值是数字(但我们真正需要的只是比较操作)
E1 = {
{'k1': [4], 'k2': [20,12]},
{'k4': [2,20,25], 'k3': [2,3]}
}
E2 = {
{'k2': [2,3,4], 'k4': [2], 'k3': [14]},
{'k3': [1]},
{'k3': [12,23]}
}
输入只是一个字典,再次用'keys'标记,并用对象列表作为值。
INPUT = {'k2': [2], 'k3': [14,12] }
我认为您应该按排序顺序保留值数组。这应该允许您在线性时间内比较给定键的列表。总的来说,给定输入的复杂度应该是O(EKL),其中E是实体的数量,K是键的数量,L是列表的长度。同样,它需要O(EKL)内存。
我希望你的界限在这种情况下比较需要几秒钟。如果这还不够,那就让我们进一步思考:)
-
编辑:您可以简单地使用一组元组(entity_id,set_id,key,value),并将平衡的BST作为值的索引。然后搜索应该在O(log n)附近。你有没有想过这样的结构?