一次广告投放会话(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