如何使用散列 table 跟踪树中的节点?

How do I keep track of nodes in a tree using hash table?

我正在尝试实现斐波那契堆,我需要跟踪其节点以进行后续操作。 对于初学者来说,斐波那契堆可以被认为是一棵 m 度树或一组树,指针指向结构中的最大节点。 树结构以一个词及其频率作为输入,并要求给出最常出现的词作为输出。 例如, 输入:

Ann 31
Dustin 27
Ryan 43
Ashley 13
Sunday 23
Tuesday 19
2 //Output two top most occurring words in the tree

Output:
Ryan, Ann

我对散列的理解table非常初级。我输入单词作为键,它给出一个哈希值作为输出。我如何强制此输出成为指向存储其频率的树中相应节点的指针? 另外,给定输入以查找 'n' 个频繁出现的单词,我能否重复删除顶部节点 'n' 次并将其重新插入到结构中?或者我最好保留一个排序的哈希 table?

作为以前编写过其中一个代码的人,您可以通过几种不同的方式来完成您想要做的事情。

  1. 插入函数return指向结构内部节点的指针,然后使用一些辅助散列table来存储这些指针。要进行插入,您将插入键及其优先级,返回一个指向斐波那契堆中节点的指针,然后添加键和指向外部哈希的指针 table(在 Java ,类似于 HashMap;在 C++ 中,类似于 std::unordered_map;我建议不要自己滚动)。

  2. 使用侵入式数据结构,让每个键存储在斐波那契堆中,实际上是完整的节点结构。 Fibonacci 堆的实现将覆盖输入的相关字段以将其连接到堆结构中,并且假设您以某种合理的方式存储节点,您可以根据需要查找它们。

我个人认为对于大多数应用程序而言,选项 (1) 比选项 (2) 更干净,但有理由更喜欢 (2) 而不是 (1)。

在 meta note 上,Fibonacci 堆是出了名的难以编码,并且在实践中比二进制堆慢得多,尽管它们在许多用例中渐近地更快。我建议不要实际使用一个,除非你有令人信服的理由这样做。