Go多级优先队列
Go multi level priority queue
在 Go 中,container/heap
包可以用作 PriorityQueue --
https://pkg.go.dev/container/heap#example-package-PriorityQueue
有没有多级优先队列的Go包?如果没有,自己怎么写?
“多级优先队列”,我的意思是:
- 任务一:运行遍历所有学生的分数,找出分数最高的前N名学生。这是典型的 PriorityQueue。
- 任务2:运行通过不同课程学生的所有分数,得到前N门课程的最高分前N(假设课程数大于N)。这就是我所说的“多级优先级队列”。
示例结果可以是
course A: 99 98 98
course B: 92 90 88
course C: 91 89 87
注释,
course D:
最高分 90 89 88
前 3 名未进入前 3 课程。
可能会出现学生分数不足以填满所有前 N 个最高分的情况。例如:
course E: 85 82
course F: 83
course G: 82 80 78
进一步的要求,实际上,
- 数据来自解析一个超复杂超大的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)
个输出。
在 Go 中,container/heap
包可以用作 PriorityQueue --
https://pkg.go.dev/container/heap#example-package-PriorityQueue
有没有多级优先队列的Go包?如果没有,自己怎么写?
“多级优先队列”,我的意思是:
- 任务一:运行遍历所有学生的分数,找出分数最高的前N名学生。这是典型的 PriorityQueue。
- 任务2:运行通过不同课程学生的所有分数,得到前N门课程的最高分前N(假设课程数大于N)。这就是我所说的“多级优先级队列”。
示例结果可以是
course A: 99 98 98
course B: 92 90 88
course C: 91 89 87
注释,
course D:
最高分90 89 88
前 3 名未进入前 3 课程。可能会出现学生分数不足以填满所有前 N 个最高分的情况。例如:
course E: 85 82 course F: 83 course G: 82 80 78
进一步的要求,实际上,
- 数据来自解析一个超复杂超大的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)
个输出。