Algorithm 保存(或分类)前10名畅销产品的最有效方法是什么?

Algorithm 保存(或分类)前10名畅销产品的最有效方法是什么?,algorithm,sorting,Algorithm,Sorting,当你想保持前十名的畅销书并随着产品的销售不断调整它时,什么是一个好的算法?我只是在为面试而学习时感到好奇 一个很好的例子是亚马逊如何保持大多数销售产品的排名 我想他们可能会使用排序算法,但考虑到有成吨的产品,当每种产品的销售次数发生变化时,每次排序都可能太慢,因为排序平均需要O(N log N)。 或者他们用链表来维持秩序?如果一个产品超过了以前的畅销书,只需将其放在链表的前面。这通常是用a实现的。这通常是用a实现的。您可以将最好的产品保存在平衡的二叉搜索树中(如std::set或std::ma

当你想保持前十名的畅销书并随着产品的销售不断调整它时,什么是一个好的算法?我只是在为面试而学习时感到好奇

一个很好的例子是亚马逊如何保持大多数销售产品的排名

我想他们可能会使用排序算法,但考虑到有成吨的产品,当每种产品的销售次数发生变化时,每次排序都可能太慢,因为排序平均需要O(N log N)。
或者他们用链表来维持秩序?如果一个产品超过了以前的畅销书,只需将其放在链表的前面。

这通常是用a实现的。

这通常是用a实现的。

您可以将最好的产品保存在平衡的二叉搜索树中(如
std::set
std::map
)。无论何时销售一个产品,您都可以增加它的销售数量(产品映射到销售数量的方式取决于访问模式,但哈希表在大多数情况下都可以正常工作),如果它不在树中,则插入它(如果已经存在,您可以删除它并重新插入到树中)。插入后,如果产品数量超过
k
(本例中为10),则需要删除该产品。这种方法的优点是我们在树中只保留
k
最佳项,因此每次更新的时间复杂度是
O(logk)
,而不是
O(logn)


但是,包含最佳
k
项的简单数据结构(如排序向量或排序列表)也可以很好地用于较小的
k

您可以在一个平衡的二元搜索树中保留最好的产品(如
std::set
std::map
)。无论何时销售一个产品,您都可以增加它的销售数量(产品映射到销售数量的方式取决于访问模式,但哈希表在大多数情况下都可以正常工作),如果它不在树中,则插入它(如果已经存在,您可以删除它并重新插入到树中)。插入后,如果产品数量超过
k
(本例中为10),则需要删除该产品。这种方法的优点是我们在树中只保留
k
最佳项,因此每次更新的时间复杂度是
O(logk)
,而不是
O(logn)


但是,包含最佳
k
项的简单数据结构(如排序向量或排序列表)也可以很好地用于较小的
k

哦,完全忘记了优先级队列。。谢谢二进制堆不是一个特别好的数据结构,因为在堆中查找一个项来更新它是非常昂贵的。更新(重新调整堆)是O(logn),但查找该项是O(n)。您可以使用单独的数据结构来跟踪项在堆中的位置,但这样做需要额外的插入和删除工作。如果您需要经常更改优先级,最好使用基于指针的堆,例如,或某种平衡搜索树。哦,完全忘记优先级队列。。谢谢二进制堆不是一个特别好的数据结构,因为在堆中查找一个项来更新它是非常昂贵的。更新(重新调整堆)是O(logn),但查找该项是O(n)。您可以使用单独的数据结构来跟踪项在堆中的位置,但这样做需要额外的插入和删除工作。如果需要经常更改优先级,最好使用基于指针的堆,例如,或某种平衡搜索树。