数据结构最适合于键值对评估

时间:2014-01-16 09:51:55

标签: algorithm data-structures associative-array key-value key-value-store

我有预先定义的匹配: 父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中。

1 个答案:

答案 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)附近。你有没有想过这样的结构?