我想使用一个数据结构,该数据结构使我可以在最佳运行时存储最多的x对象,并在最佳的运行时间内管理该结构。
我们称其为 Rank_List()
。让我们定义X = 2
,以下情况应发生。
ranked_list = Rank_List()
ranked_list.add((obj1, 0.5)
print ranked_list -> [(obj1, 0.5)]
ranked_list.add((obj2, 0.75))
print ranked_list -> [(obj2, 0.75), (obj1, 0.5)]
因此,我们可以看到它可以保持排名(首先为0.75,而0.5在第二位)
ranked_list.add(obj3, 0.7)
print ranked_list -> [(obj2, 0.75), (obj3, 0.7)]
添加另一个比OBJ1更高的对象后,OBJ1被排除在列表之外(X = 2
因此,只有多达2个对象可以存储在列表中)
是否存在Python中已经存在类似的数据结构?如果没有
从我了解的注释中,您希望从序列中提取顶级k元素。在这种情况下,您根本不需要整理列表。您可以使用堆队列。
hapq是一棵二进制树,任何父母的价值要么小于其任何一个孩子(如果您翻转值)。这意味着您总是可以按顺序(k)时间找到顶部的K元素,但是在插入时保持堆仅需O(logn)时间。总体而言,对于n个项目和k个最高项目(按顺序),这为您提供了非常有效的O(Klogn)算法。
Python标准库包括heapq
模块为您执行此操作。
您可以自己保留堆,也可以使用heapq.nlargest
功能为您的估计构建堆,然后直接返回顶部K项目。
要将k 最大的项目保存在手动保存的堆中,首先构建k元素的列表(如(priority, elem)
元组),一旦达到该大小,请使用heapify()
,然后从那里开始使用heapreplace()
将下一个元素推入列表,然后删除最小的。这样,您总是保留固定尺寸的最大物品。最后,使用sorted(heap, reverse=True)
以相反排序的顺序(最大到最小)为您提供那些最大的项目。