从最大优先级队列中获取最小元素

时间:2017-12-20 00:20:27

标签: priority-queue

从最大priority queue获取最小元素的最有效方法是什么?

假设我创建了一个通用priority queue。现在这个queue包含猫和猫有一个变量鱼,这是猫吃过的鱼的数量,我想让猫吃掉最少的鱼并给她多一些鱼,然后{{1再次sort(这意味着我调用priority queue来获取更接近根的鱼)。但由于swim()是最大值(它必须是最大值,它不能是最小值),我怎样才能得到吃过最少鱼的猫?

2 个答案:

答案 0 :(得分:0)

给定顶部元素最大的优先级队列,获取最小项的唯一方法是从队列中删除所有元素。您删除的最后一个是最小的项目。该方法的复杂性是O(n log n)。此外,您必须保存已弹出的项目,并在删除最后一项后将其重新放入队列。

您似乎已将优先级队列实现为二进制最大堆。如果是这种情况,那么最小的项目将是一个叶子,根据定义,它将在最后的n / 2个项目中。因此,如果您有权访问支持数组,则可以搜索最后一个项目的最后n / 2项。这是O(n)操作。

如果您需要定期删除最小的项目,可以考虑实施min-max heap

答案 1 :(得分:0)

重新定义鱼的订购属性。

如果您使用的是使用import re from collections import defaultdict ga_re = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>" # our regex to subtract google analytics script file_texts = defaultdict(str) # Temp store for file text file_paths = ['first_file.html', 'second_file.html'] # list of files you want to run for file_path in file_paths: with open(file_path, mode='r') as f: # Extract text from file file_text = ''.join(f.readlines()) file_texts[file_path] = file_text # Write to backup file with open('{}.backup'.format(file_path), mode='w+') as fbackup: fbackup.write(file_text) with open(file_path, mode='w+'): # Perform regex sub and write to file file_text = file_texts[file_path] file_text_result = re.sub(ga_re, file_text, re.DOTALL) f.write(file_text_result) 概念的语言,一种方法是编写一个比较器来反转fish的默认排序属性。另一种选择是在创建/推动猫时存储鱼数的负数。逻辑可以构建到cat对象中,因此用户只能查看和操作正数量的鱼,但它们在内部存储为负值。