优先级队列无间隙重排:现有代码输出不符,求解决方案
问题分析与解决方案
你的代码逻辑存在问题:每次遇到未记录过的旧优先级就直接分配递增的新优先级,但没有给相同的旧优先级绑定同一个新优先级,导致原队列中相同的3被分别分配了1和2,最终出现不符合预期的结果。
正确实现方法
核心思路是先为所有独特的旧优先级建立连续的映射关系,再批量替换任务的优先级:
def rearrange_priority(self): # 收集所有存在的优先级,去重后按从小到大排序 unique_priorities = sorted({task['Priority'] for task in self.queue}) # 构建旧优先级到连续新优先级的映射(从0开始递增) priority_map = {old_p: new_p for new_p, old_p in enumerate(unique_priorities)} # 遍历队列,替换每个任务的优先级 for task in self.queue: task['Priority'] = priority_map[task['Priority']]
逻辑说明
- 去重排序:通过集合去重得到所有存在的优先级,再排序保证顺序(比如原队列的
[0,0,3,3,4,5]会得到[0,3,4,5])。 - 建立映射:用
enumerate为每个旧优先级分配连续的新值,最终映射表为{0:0, 3:1, 4:2, 5:3}。 - 批量替换:每个任务根据自身旧优先级查映射表,替换为对应的新优先级,确保相同旧优先级的任务得到同一个新值。
测试原示例时,最终队列优先级会变成0,0,1,1,2,3,完全符合你的预期。
内容的提问来源于stack exchange,提问作者janiceeeee
相关产品推荐
相关产品推荐

