当您希望保留十大畅销产品并在产品销售时不断调整时,有什么好的算法可供使用?我在面试时很好奇。
一个很好的例子是亚马逊如何保持大部分销售产品的排名。
我认为他们可能会使用排序算法,但鉴于产品数量众多,每次产品销售次数发生变化时,每次排序可能太慢,因为排序需要平均O( N log N)。 或者也许他们使用链表来保持订单?如果一个产品超过以前的畅销商品,只需将其放在链接列表的前面。
答案 0 :(得分:4)
通常使用priority queue实现heap。
答案 1 :(得分:1)
您可以将最佳产品保存在均衡的二叉搜索树中(例如std::set
或std::map
)。每当产品销售时,您可以增加它的销售数量(产品映射到销售数量的方式取决于访问模式,但哈希表在大多数情况下都能很好地工作),如果它&# 39;不在树中插入它(你可以删除它并重新插入树中,如果它已经存在)。插入后,如果产品超过k
(本例中为10),则需要删除该产品。这种方法的优点是我们只在树中保留k
个最佳项,因此每次更新的时间复杂度为O(log k)
,而不是O(log n)
。
但是,包含最佳k
项的简单数据结构(如排序向量或排序列表)也适用于小k
。