【问题标题】:Priority queue in Racket?球拍中的优先队列?
【发布时间】:2018-05-26 09:37:45
【问题描述】:

我正在 Racket 中寻找满足以下定义的优先级队列,尤其是粗体部分(来自维基百科):

优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但其中每个元素都有一个与之关联的“优先级”。在优先级队列中,优先级高的元素先于优先级低的元素提供服务。 如果两个元素具有相同的优先级,则按照它们在队列中的顺序提供服务。

我理解(并且确实想要)的是,它们是按照添加到队列中的顺序提供服务的。

我已经尝试过 Racket 的 data/heap,但如果优先级相同,这不会保持正确的顺序。

测试代码:

#lang racket

(require data/heap)

(define h (make-heap
           (λ (p1 p2)
             (<= (car p1) (car p2)))))

(define (add! p) (heap-add! h p))

(add! '(1 a))
(add! '(2 b))
(add! '(3 c))
(add! '(3 d))
(add! '(3 e))
(add! '(3 f))
(add! '(3 g))
(add! '(3 h))
(add! '(3 i))

(for ([p (in-heap h)])
     (display p))

输出:

(1 a)(2 b)(3 h)(3 g)(3 f)(3 e)(3 d)(3 c)(3 i)

我需要以下输出:

(1 a)(2 b)(3 c)(3 d)(3 e)(3 f)(3 g)(3 h)(3 i)

【问题讨论】:

标签: racket


【解决方案1】:

使用标准堆。保留一个计数器 i,每次插入都会递增。将元素 x 插入到优先队列中,将(列表 i x)插入堆中。您的订单谓词现在可以使用 i 打破关系。

【讨论】:

猜你喜欢
  • 2021-12-21
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多