亚马逊采访概率

rpl*_*usg 14 algorithm

有一个很大的单词文件正在动态变化.我们不断在其中添加一些词语.您如何在每个时刻跟踪前10个趋势词?

我在博客中发现了这个问题,但我无法理解答案.答案是:哈希表+最小堆

我理解为什么hashtable而不是min-heap部分,有人可以帮助我吗?

Avi*_*hen 7

如果是,top 10 trending words那么你应该使用max-heapa hash-table.

当一个新单词添加到该文件时,然后:

  • Createxx.key=word和的新元素x.count=1.
  • Add x到了hash-table.O(1).
  • Add x到了max-heap.O(lgn).

将现有单词添加到文件后,则:

  • Find xhash-table.O(1).
  • Update x.countx.count++.

当需要检索时top 10 trending words:

  • Extract10次​​起max-heap.10*O(lgn)=O(10*lgn)=O(lgn).

如您所见,所有需要的操作最多都在完成O(lgn).

  • 你必须使用MinHeap,而不是MaxHeap.所以,如果你在堆中有k个项目,那么堆的peek是最小的; 而其他人(k - 1)比窥视要大.现在,如果有一个带有count> peek的新单词,我们想要提取min(O(logk))并插入新项目(O(logk)).如果新项目的计数小于peek,则表示它是小于堆中的任何其他项(因为它是一个Min Heap).我们只是丢弃这个词,因为它不会成为前k的一部分. (5认同)
  • 你想要使用最小堆:当一个不在前10名的现有单词成为前10名时,删除min将是一致的时间. (4认同)