Go多级优先队列

Go multi level priority queue

在 Go 中,container/heap 包可以用作 PriorityQueue -- https://pkg.go.dev/container/heap#example-package-PriorityQueue

有没有多级优先队列的Go包?如果没有,自己怎么写?

“多级优先队列”,我的意思是:

示例结果可以是

course A: 99 98 98 
course B: 92 90 88
course C: 91 89 87

注释,

  1. course D: 最高分 90 89 88 前 3 名未进入前 3 课程。

  2. 可能会出现学生分数不足以填满所有前 N 个最高分的情况。例如:

    course E: 85 82
    course F: 83
    course G: 82 80 78
    
  3. 进一步的要求,实际上,

    • 数据来自解析一个超复杂超大的XML文件,因此我需要单遍遍历XML文件,这就是为什么我需要优先队列。
    • XML文件实际上是SQLServer Trace文件,里面包含成百上千条SQL命令(SQL命令是课程,他们的持续时间是课程分数),这是我需要优先级队列的第二个原因——只跟踪排名靠前的队列。

您不需要任何奇异的队列结构来解决它。您甚至根本不需要优先级队列,尽管这是执行 select-k 操作的简单方法。 (如果您不需要相对于彼此对输出进行排序,而只是在 some 顺序中排在前 N 个,那么使用 selection 算法会更有效快select.)

对于任务 2,您只需遍历所有分数,为每门课程建立最高分。完成后,您会找到前 N 门课程。完成后,再次遍历所有标记,将这些课程的标记过滤到单独的容器中。然后在每一个中做一个select-k。

如果使用优先级队列,此方法的运行时间为O(m + N^2 log N)(其中m为标记总数),如果使用O(m + N^2)使用高效的 selection 算法。后一个时间限制是该问题的最佳可能,因为需要检查 O(m) 个输入并且需要生成 O(N^2) 个输出。