索引优先队列

一次广告投放会话(session)中,服务器会分别打印推送日志(push)、展示日志(show)(如果广告成功展示)和点击日志(click)(如果广告被点击),一次广告会话由唯一id标记,一个广告可能被点击多次,也可能不被点击。由于广告服务器的并发处理,同一id对应的推送日志,展示日志,点击日志可能不会按照原本的顺序出现(原本顺序指先推送后展示最后点击)。设计算法在内存有限的情况下,统计每一次广告投放的展示与点击次数。约定:展示日志和点击日志的时间差不超过10分钟,广告推送后20分钟后产生的点击视为无效不计入点击次数。

考虑到需要对推送日志、展示日志、和点击日志按id进行匹配,可以采用词典存储,由于日志很多,不能都存入词典,可以采用时间队列将推送时间已超过当前时间20分钟的日志从词典中剔除,并输出展示与点击次数。

具体可以采用词典{id:(push, show, click)}和有限队列<push.time, id>来实现。

Code

class IndexedPriorityQueue:

  def __init__(self):

    self.container = {}

    self.queue = []

 

  def top(self):

    if len(self.queue) <= 0:

      raise IndexError("Queue is EmptyNow!")

    key_index = self.queue[0][1]

    return self.container[key_index]

 

  def top_key(self):

    if len(self.queue) <= 0:

      raise IndexError("Queue is EmptyNow!")

    return self.queue[0]

 

  def pop(self):

    if len(self.queue) <= 0:

      raise IndexError("Queue is EmptyNow!")

    _, index_key = heapq.heappop(self.queue)

    e = self.container[index_key]

    del self.container[index_key]

    return e

 

  def push(self, e, index_key, queue_key):

    if index_key in self.container:

      raise IndexError("Duplicated keyserror!")

    heapq.heappush(self.queue, (queue_key,index_key))

        self.container[index_key] = e

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值