地图树的最佳数据结构是什么。


9

我正在寻找一种数据结构,它基本上是一棵地图树,其中每个节点上的地图都包含一些新元素以及其父节点地图中的元素。这里的映射是指具有键和值的编程映射,例如STL中的映射或python中的dict。

例如,可能有一个根节点:

root = {'car':1, 'boat':2}

和2个子级,每个子级都向父级地图添加一个元素

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

我希望这是尽可能节省空间的,即我不想在每个节点上存储结果图的完整副本,但理想情况下,查找仍然是O(log N),N是总数节点上的元素,而不是整个树。

我当时在想也许有一个智能哈希函数可以用于此目的,但是什么也没想出来。

天真的方法是将新添加的条目存储在每个节点的映射中,然后在未找到任何内容的情况下向上移动树。我不喜欢这样,因为它取决于树的深度。


所以每个节点都代表一个地图,该地图可以细化存储在父节点中的地图?
Suresh Venkat 2010年

另外,您是指数学或地图学意义上的地图吗?
Suresh Venkat 2010年

我的意思是从数学/ CS角度看地图。例如在STL中映射。
phreeza

@Suresh:看来这不是一种改进。如果我的问题正确,则子节点会将新元素添加到其父节点的映射中。
Jukka Suomela

为了回答第一个问题,每个节点都在增加更多键/值对的意义上优化了地图。
phreeza 2010年

Answers:


10

您没有说什么查询,但是我假设query()接受一个节点和一个键并想要关联的值(如果不存在这样的值,则返回null)。在这种情况下,我认为通常不能比在每个节点上存储单独的映射更好。例如,考虑一棵毛毛虫树,其中每个路径节点都有一个与之连接的分支分支(总共2n个节点)。将其根植在路径的一端。现在假设键的Universe大小为m。对于每个分支节点v和m个可能的键中的每个,该键在v处可以存在或不存在,并且都符合您的子树约束。因此,每个键是否存在于每个fork节点上有可能性,因此仅需要mn位空间即可存储所需的信息。2mn


5
但是该示例并未显示您必须存储冗余信息(即,您还需要在每个子节点上复制根节点的条目)!
Jukka Suomela

我糊涂了。在具有节点的深度为的树中,很明显,您无法在空间中存储绑定。您的示例还显示了更多内容吗?1nmo(m)
Radu GRIGore

15

首先,我认为您所说的“地图”是TCS术语中的“字典”。其次,我不理解“理想情况下,查找仍然是O(logN)“,因为在字典中查找各种哈希表需要O(1)时间。第三,您尚未说明问题是静态的还是动态的;我假设是静态的。

这个问题的最佳复杂度是 Θ(前身搜索),例如 O(lglgN)使用van Emde Boas。如果您的字数是Θ(lgn); 有关最佳的前任范围,请参见http://people.csail.mit.edu/mip/papers/pred/pred.pdf

解决该问题的正确方法是建立一个全局哈希表,并为表中的每个键分别处理层次结构。一键x,我们知道它出现的节点。考虑树的有序遍历。节点在哪里x出现按此顺序定义间隔。确定是否x 在某个节点的哈希表中 v,你必须问是否 v刺破上面定义的任何段。这很容易通过前驱搜索完成,在该搜索中,我们为所有间隔端点构建了一个前驱表。

对于下限,请注意,甚至有一个刺伤问题也与前任一样困难(请参见有色前任搜索的减少内容)。由于上面的论文参考文献显示了针对先前搜索的最佳直接求和行为,因此这意味着上述算法对于节点数与键总数之间的任何比率都是最佳的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.