【问题标题】:data structure best suited for key value pair evaluation最适合键值对评估的数据结构
【发布时间】:2014-01-16 09:51:54
【问题描述】:

我有预定义的匹配为: 父实体具有与其关联的键值集。 父 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 的键值对通过输入满足,而对于实体 B,没有集合满足其键值对。 所以只有实体 A 是答案。

可以有 200-1000 个父实体,每个父实体 20 个 SET 和每个 SET 200 个键值对。输入最多可以包含 50 个键值对。

我无法查询外部数据库进行评估。但是数据结构应该是可序列化的,以便存储到 memcache 或 redis 中。

【问题讨论】:

  • 请提供一些关于实体数量的详细信息(上限或预期值)实体中的集合数。这可能会严重影响最佳方法。
  • 完成,谢谢建议。

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


【解决方案1】:

为了简单起见,让我修正一下符号并用 python 编写。

您所说的实体是一组用“键”标记的字典,其中包含对象列表作为值。为简单起见,我们假设值是数字(但我们真正需要的只是比较操作)

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]}
}

输入只是一个字典,同样由“键”标记,并以对象列表作为值。

INPUT = {'k2': [2], 'k3': [14,12] }

我认为您应该按排序顺序保留值数组。这应该允许您在线性时间内比较给定键的列表。给定输入的总复杂度应该是 O(EKL),其中 E 是实体的数量,K 是键的数量,L 是列表的长度。同样,它会占用 O(EKL) 内存。

我预计在这种情况下,您的边界比较最多需要几秒钟。如果这还不够,那么让我们进一步考虑:)

--

编辑:您可以简单地使用一组元组(entity_id、set_id、key、value),并使用平衡的 BST 作为值的索引。然后搜索应该花费大约 O(log n)。你想过这样的结构吗?

【讨论】:

  • 我想在 C 中实现这一点。将 SET/dictionary 中的每个键与输入中的每个键按顺序进行比较会浪费一些时间。同样在找到键之后,将集合/字典中键的每个值与输入中接收到的同一键的每个值进行比较需要时间。我们可以加快速度吗?
  • 好吧,如果您将其实现为 Map,则查找键将花费恒定的时间。比较值最多需要线性时间 O(L)。由于我们对元素一无所知,因此无法改进。您需要检查每个实体和每个集合,以便提供额外的 O(EK) 因子。
  • 我今天能想到的唯一改进是为值而不是列表设置了一个结构。这将为每个键提供 O(L) 查找而不进行排序。
  • 第二件事是通过元组 (k1,k2,k3,...) 对 SET 进行索引。这将使您查找要考虑 O(1) 的集合。不过,它仍然是 O(EKL)。但是你当然可以添加一些小的优化。我建议实现一些简单的东西,测量瓶颈在哪里,然后调整这个特定的部分。
  • 听起来很酷..我肯定会从它开始 & 让我们看看我在哪里面临进一步的问题。谢谢..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多