我正在寻找一种数据结构,它基本上是一张地图树,其中每个节点的地图包含一些新元素,以及其父节点地图中的元素。通过这里的地图我的意思是一个带有键和值的编程图,比如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是节点上的元素总数,而不是整个树。
我想也许我可能会使用一个智能哈希函数,但是无法想出任何东西。
天真的方法是将新添加的条目存储在每个节点的地图中,然后如果没有找到则向上移动树。我不喜欢这个,因为它取决于树的深度。
答案 0 :(得分:0)
如何创建一个比较散列图的函数,无论它们是否匹配都会返回true或false,这可能会对键和值对的排序造成一些棘手的原因。
每当您向树中添加新节点(map)时,都使用此函数。检查树中的所有现有节点,如果hashmap已经存在,只需指向那个。
这可能需要大量处理来比较散列图,但这样可以节省大部分空间。
希望这有帮助。
编辑:你可以在地图上做联盟,看看结果的长度是否相同。
答案 1 :(得分:0)
我的理解是,您正在寻找'jet'
,这将为您提供child1
的完整列表。
您的主要数据将是一棵树。您将保留对该级别所有数据的引用(例如'jet':35
,以及指向父级的指针。
引用将通过另一个哈希结构。这会将键('jet'
)映射到指向树的指针。
map['jet'] => {'jet':35, parent:root}
然后可以扩展到
map['jet'] => {'car':1, 'boat':2, 'jet':35}