【问题标题】:Does R have a priority queue like Java's PriorityQueue?R 是否有像 Java 的 PriorityQueue 这样的优先级队列?
【发布时间】:2023-04-08 01:35:01
【问题描述】:

我正在R 中寻找通用优先级队列。 R 是否有任何通用优先级队列实现(包),例如 Java PriorityQueue 类或 Python heapq

【问题讨论】:

  • en.wikipedia.org/wiki/Priority_queue 用于背景阅读,以防有人想实现它
  • 看起来工作量不大,而且看起来很有趣。太糟糕了,我今天必须去宜家... ;)
  • 我记得用 rredis 做这样的事情只花了一个小时左右的时间。
  • 我已经为此悬赏,看看在过去的 4 年中是否发生过任何事情。这条评论也应该让人们将 cmets 指向我。
  • 嗨@Joel,请在下面查看我的回答。现在 CRAN 上有一个 liqueueR 包可以完成这项工作。

标签: r priority-queue


【解决方案1】:

我继续并实现了一个基本队列作为 R 参考类。详情请见here。正如here 所记录的,它已被扩展以处理优先级队列。

基本和优先级队列实现现在作为 CRAN 上的 liqueueR 包提供,开发版本在 GitHub 上。

【讨论】:

    【解决方案2】:

    您可以使用以下implementation from Rosetta Code,但要注意插入需要 O(n log n)

    PriorityQueue <- function() {
      keys <<- values <<- NULL
      insert <- function(key, value) {
        temp <- c(keys, key)
        ord <- order(temp)
        keys <<- temp[ord]
        values <<- c(values, list(value))[ord]
      }
      pop <- function() {
        head <- values[[1]]
        values <<- values[-1]
        keys <<- keys[-1]
        return(head)
      }
      empty <- function() length(keys) == 0
      list(insert = insert, pop = pop, empty = empty)
    }
    

    【讨论】:

      【解决方案3】:

      您可以很容易地自己创建它,或者使用类(最适合参考类),或者使用带有自定义类型的data.frame,并结合一些对其进行操作的函数(add_to_queue(element, queue_object, priority)get_item(queue_object)) .在引用类的情况下,这些函数将是方法。我更喜欢参考类解决方案,因为它将状态和逻辑都存储在一个地方。

      【讨论】:

        【解决方案4】:

        查看包集合:https://cran.r-project.org/web/packages/collections/index.html

        q <- PriorityQueue()
        q$push("not_urgent")
        q$push("urgent", priority = 2)
        q$push("not_as_urgent", priority = 1)
        q$pop() # urgent
        q$pop() # not_as_urgent
        q$pop() # not_urgent
        

        编辑:更新集合 v0.2.0 的语法

        【讨论】:

          猜你喜欢
          • 2014-03-04
          • 2012-06-15
          • 1970-01-01
          • 1970-01-01
          • 2015-12-05
          • 2011-12-20
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多