我有两个队列函数,用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会调用它们来代替它们。
我想看看我是否走在正确的轨道上,还是有更有效的方法来实现这一目标?
答案 0 :(得分:1)
来自标准库Queue的来源:
Queue
个对象实现允许的数据结构:
Queue
被实现为一对List
,其中一个包含'''''''''元素和另一个' out'''元件。O(1)
。删除项目的成本为O(1)
,但需要使用数据透视的情况除外,在这种情况下,会产生O(n)
的成本,其中n
是队列中的元素数。 n
删除O(1)
费用的操作。删除项目的平均值为O(1)
。