设置组合数据结构(和存储复杂性)

时间:2013-09-07 04:33:20

标签: data-structures set complexity-theory combinations space-complexity

我遇到一个问题,我需要将一组(唯一子集)中的唯一组合与给定值相关联。例如:设S={a, b, c, d},所需的数据结构应执行以下操作:

键 - >值

{a,b} -> value1
{a,c} -> value2
{c,d} -> value3
  • 属性1:密钥中集合的长度是固定的(在此示例中,它固定为2)。
  • 属性2:数据结构不包含S的所有可能子集。

问题1 :包含这些值的简单地图的存储复杂性是多少?上!)? (鉴于| S | = N并且它没有固定)

问题2 :是否存在可以存储此类元素的高效数据结构? (存储复杂性需要最重要的效率)

1 个答案:

答案 0 :(得分:0)

一组n个项目中大小为k的不同子集的数量为n!/(k!*(n-k)!)。这也是存储值的地图的最佳存储复杂性。

您可以使用二叉树林来表示子集。节点将包含一个键和两个子指针。叶节点将表示大小为1的子集。叶节点上方级别上的父节点将表示大小为3的子集,因为它们包含一个键并指向包含键的两个叶节点。下一级父节点将表示大小为7的子集,依此类推。

你将获得一个带有n!/(k!*(n-k)!)可能的根节点的森林。您的“简单地图”将是一个从根节点映射到存储值的哈希映射。

要获得最佳存储复杂性,您需要避免重复等效节点。在林中创建节点时,必须检查是否已创建表示同一子集的节点。如果存在等效节点,则必须重用该节点而不是创建新节点。因此节点可以有许多父母。 (您可能希望将节点放在哈希表中以避免重复。)由于所述复杂性,林将由顶级节点控制。由于每个节点的大小都是固定的,因此整个森林的存储成本将受根节点数乘以常数的限制。