Algorithm 实现数据结构

Algorithm 实现数据结构,algorithm,data-structures,heap,Algorithm,Data Structures,Heap,我们有m种不同的产品(编号从1到m)。招标开放时间为m天,在此期间有n人提出购买要约(每个要约针对一种产品), 每天结束时,将出售出价最高的产品(包括所有尚未售出的产品) 我们应该实现一个提供以下操作的数据结构: Init(m)->使用m个元素初始化DS,但不提供 Bid(j,p)->在产品j的复杂性O(1)中添加价格为p的报价 销售->以最高报价销售产品。以O(对数m)摊销的复杂度返回j(出售的产品)和p(出售产品的价格) 我试图通过使用fibonacce堆来解决这个问题: 我们创建一个新的

我们有m种不同的产品(编号从1到m)。招标开放时间为m天,在此期间有n人提出购买要约(每个要约针对一种产品), 每天结束时,将出售出价最高的产品(包括所有尚未售出的产品)

我们应该实现一个提供以下操作的数据结构:

  • Init(m)->使用m个元素初始化DS,但不提供
  • Bid(j,p)->在产品j的复杂性O(1)中添加价格为p的报价
  • 销售->以最高报价销售产品。以O(对数m)摊销的复杂度返回j(出售的产品)和p(出售产品的价格)
  • 我试图通过使用fibonacce堆来解决这个问题:

    • 我们创建一个新的fib堆并插入m次(键为j且信息为null的产品)

    • 我使用减少fib堆中的关键点的思想,并将信息与新的p堆交换

    • 我使用deletemin的思想来删除max

    所以为了解决这个问题,我认为我应该使用最大堆而不是最小堆,这让我觉得我的方法是错误的

    有人能帮我找到真正的解决办法**

    您可以通过保留一个产品的哈希表(最大出价)和一个按最大出价排序的产品列表,来获得Bid()的O(logm)和Sell()的O(1)


    对于Bid(),如果需要,可以更新表,如果需要,可以使用二进制搜索更新列表;对于Sell(),您只需从列表中弹出最上面的项目,然后从地图中获取价格。

    是的,您需要一个最大堆。除此之外,您概述的解决方案是正确的。不知道如何使用列表在O(logn)中进行出价。如果列表是双链接列表,则在放置新出价时移动项目需要O(n)搜索。如果列表保存在一个数组中,那么找到新的点是O(logn),但实际上插入它将是O(n),因为你必须向下移动所有东西以形成一个空间。在学习了二进制堆、二项式堆、惰性二项式堆和fib堆之后,我们遇到了这个问题,所以我认为答案应该是使用这些数据结构的思想。根据上面要求的复杂性,这个问题使我想到使用fib堆,但出售最大值(而不是fib中的最小值)和增加信息(而不是减少fib中的键)使我很难完成解决方案。