我正在尝试实现Fibonacci堆,我需要跟踪其节点以便后续操作。 对于没有经验的人来说,Fibonacci堆可以被认为是一个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'次并将其重新插入结构中吗?或者我最好保留一个已排序的哈希表?
答案 0 :(得分:0)
作为之前编写其中之一的人,有几种不同的方式可以帮助您完成您尝试做的事情。
让insert函数返回指向结构内部节点的指针,然后使用一些辅助哈希表来存储这些指针。要进行插入,您需要插入密钥及其优先级,然后将指针移交给Fibonacci堆中的节点,然后将密钥和指针添加到外部哈希表(在Java中,类似于HashMap
;在C ++中,类似于std::unordered_map
;我建议不要自己滚动。)
通过让每个存储在Fibonacci堆中的密钥实际上是完整的节点结构来使用侵入式数据结构。然后,Fibonacci堆的实现将覆盖输入的相关字段以将其连接到堆结构中,并且假设您以合理的方式存储节点,您可以根据需要查看它们。
我个人认为对于大多数应用来说,选项(1)比选项(2)更清晰,但有理由更喜欢(2)超过(1)。
在一个元记录中,斐波纳契堆很难编码,在实践中比二进制堆快得多,即使它们在许多用例中渐近更快。除非你有令人信服的理由,否则我建议不要使用其中一个。