实现更高效的队列

时间:2016-02-15 13:31:29

标签: scala data-structures queue

我有两个队列函数,用enqueue / dequeue转换队列,但保持原始队列不变,并创建一个新的队列,删除或添加元素。

type Queue[A] = List[A]

    def enqueue[A](e: A, queue: Queue[A]): Queue[A] = queue match {
    case Nil => List(e)
    case head :: tail => head :: enqueue(e, tail)
    } 

    def dequeue[A](queue: Queue[A]): Option[(A, Queue[A])] = queue match {
    case Nil => None()
    case head :: tail => Some((head, tail))
    }

但是,这是一个O(n)运行时间,因为它遍历整个列表。

我想创建一种更有效的入队/出队方式。我认为创建两个代表队列的列表。比如前面,前面有元素,后面,后面的元素可以反过来。然后函数enqueue / dequeue会调用它们来代替它们。

我想看看我是否走在正确的轨道上,还是有更有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

来自标准库Queue的来源:

Queue个对象实现允许的数据结构:

  • 以先进先出(FIFO)方式插入和检索元素。
  • Queue被实现为一对List,其中一个包含'''''''''元素和另一个' out'''元件。
  • 元素已添加到''''''列出并从'''''名单。如果' out'''''''''''''''' '''''列出'' in.reverse''''''''通过'' Nil'。
  • 将项目添加到队列中的成本始终为O(1)。删除项目的成本为O(1),但需要使用数据透视的情况除外,在这种情况下,会产生O(n)的成本,其中n是队列中的元素数。
  • 发生这种情况时,保证n删除O(1)费用的操作。删除项目的平均值为O(1)