0

我正在尝试实现斐波那契堆,并且需要跟踪其节点以进行后续操作。对于初学者来说,斐波那契堆可以被认为是一个 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

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

4

1 回答 1

0

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

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

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

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

在元注释中,斐波那契堆是出了名的难以编码,并且在实践中比二进制堆慢得多,尽管它们在许多用例中渐近地更快。除非您有令人信服的理由,否则我建议您不要实际使用它。

于 2016-11-15T00:53:39.203 回答