【问题标题】:Whats an optimal data structure for a tree of maps什么是地图树的最佳数据结构
【发布时间】:2011-05-15 21:30:19
【问题描述】:

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

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

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

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

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

然后我的搜索将在节点上执行。因此,例如 child1['jet'] 返回 35,但 root['jet'] 返回未找到错误。

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

我在想也许我可以使用一个智能哈希函数,但我想不出任何东西。

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

【问题讨论】:

    标签: data-structures maps hash hierarchical-trees


    【解决方案1】:

    据我了解,您正在寻找'jet',这将为您提供child1 的整个列表。

    您的主要数据将是一棵树。您将保留对该级别所有数据的引用(例如'jet':35,以及指向父级的指针。

    引用将通过另一个哈希结构。这会将键 ('jet') 映射到指向树的指针。

    map['jet']  =>  {'jet':35, parent:root}
    

    然后可以扩展为

    map['jet']  =>  {'car':1, 'boat':2, 'jet':35}
    

    【讨论】:

    • 啊,我应该说得更清楚一点。我的搜索将在节点上执行。因此,例如 child1['jet'] 返回 35,但 root['jet'] 返回未找到错误。我将进行编辑以澄清。
    【解决方案2】:

    如何创建一个比较哈希图的函数,无论它们是否匹配,它都会返回真或假,这可能是键值对排序的一个棘手的原因。

    然后在向树添加新节点(地图)时使用此功能。检查树中的所有现有节点,如果 hashmap 已经存在,则让它指向那个节点。

    这可能需要大量处理来比较哈希图,但这将节省大部分空间。

    希望这会有所帮助。

    编辑:您也许可以在地图上做一个联合,看看结果是否相同长度进行比较。

    【讨论】:

    • 我不明白,难道我还需要一个包含所有节点条目的哈希图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多