可拆分堆栈


22

关于数据结构,它可以维护要经受以下两项操作的一系列项目,这是什么?

  • Push(x):将x添加到序列的末尾,并返回其在序列中位置的标识符
  • 提取(S):给定一组无序的标识符,从序列中删除这些位置中的项目,并按序列顺序返回已删除项目的列表

如果您愿意,可以将其视为堆栈或具有拆分操作的队列,该拆分操作会将其拆分为两个堆栈:extract操作可用于实现pop或dequeue操作,提取的项目序列也可以放入再次返回另一个堆栈或队列。

我已经知道:可以将序列维护为双链表,其中每个标识符只是指向链表节点的指针,并且每个节点还存储一个位置号,该位置号允许快速比较两个不相关元素的位置按顺序。随着数据结构的发展,更新位置编号并不难,因此它们都是最大值正整数,其中n是列表中的当前项目数。使用此数据结构,提取操作的唯一困难部分是按提取的项目的位置编号对它们进行分类。的提取ķ项需要ø ķ O(n)nk使用整数排序汉Thorup的算法从2002年FOCS,例如预期的随机时间,以及推入操作需要一定时间。O(kloglogk)

我不知道的是:是否可以在时间内处理提取并按固定时间推送?有关于这个问题的文献吗?它像整数排序一样难吗?O(k)

动机:这是在Coffman-Graham调度算法中订购商品所需的基本步骤,该算法在图形绘制中也有应用。Coffman-Graham的困难部分是字典拓扑顺序。对于每个不同的度数,可以通过在子图中保持该度数的顶点序列来保持剩余的顶点来完成此操作。然后,从零度顶点的序列中重复删除第一个顶点并将其添加到拓扑顺序中;从先前所属的度数中提取v的邻居,并将其推入序列以获取下一个较小的度数。所以O k vvO(k) 在此数据结构中进行提取操作所需的时间将导致Coffman-Graham算法的线性时间实现。

自从最初提出这个问题以来,我发现了Sethi在1976年发表的一篇论文,该论文允许在线性时间内实现Coffman-Graham算法,并将其包含在我的Wikipedia文章中有关Coffman-Graham算法的文章中,因此最初的动机意义不大。我仍然很好奇答案是什么。


如果插入仅发生在序列的末尾,则可以保留一个双链表和一个项目位置的哈希表。插入:摊销O(1)(只需保留指向最后一项的指针)。提取k个项目:摊销O(k)(对于S的每个元素,获取指针并将其从哈希表中删除,从列表中获取并删除项目并将其添加到提取结果中)。
Marzio De Biasi

3
这不是从列表中提取项目所花费的时间,而是将它们从参数的未排序顺序重新排列为Extract到正确的顺序顺序。
David Eppstein

Answers:


1

S[n]nnDnnnDnDn[n]O(1)

S[n]SSO(1)

因此,消息是,除非某些依赖于整数上限的 “免费”辅助信息可以使整数排序更容易,否则提取与整数排序一样困难。

如果没有怪异的模型,这是否意味着两个问题之间存在联系?这种随机建议的概念是否已知?这有点像MA协议,但是Merlin的消息不允许依赖于输入,因此我们关心Arthur的运行时间。


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Dave

Ω(n)DnkO(k)Dn

这就是我无法完全令人信服的原因。如果只有一组要排序的整数S,则所有内容都是线性时间(只需在O(n + k)中计数排序)即可。但是,如果您尝试使用此数据结构来模拟许多小类别的序列(以至于对分类进行计数是不够的),那么只有这些小类别中的第一个是完全不受约束的:此后,您删除了一些[n]的元素,因此您排序的每个序列都必须与先前的序列不相交。因此似乎很难减少分类工作。
David Eppstein,

O(k)O(n+k)

Ω(n)DnO(k)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.