关于数据结构,它可以维护要经受以下两项操作的一系列项目,这是什么?
- Push(x):将x添加到序列的末尾,并返回其在序列中位置的标识符
- 提取(S):给定一组无序的标识符,从序列中删除这些位置中的项目,并按序列顺序返回已删除项目的列表
如果您愿意,可以将其视为堆栈或具有拆分操作的队列,该拆分操作会将其拆分为两个堆栈:extract操作可用于实现pop或dequeue操作,提取的项目序列也可以放入再次返回另一个堆栈或队列。
我已经知道:可以将序列维护为双链表,其中每个标识符只是指向链表节点的指针,并且每个节点还存储一个位置号,该位置号允许快速比较两个不相关元素的位置按顺序。随着数据结构的发展,更新位置编号并不难,因此它们都是最大值正整数,其中n是列表中的当前项目数。使用此数据结构,提取操作的唯一困难部分是按提取的项目的位置编号对它们进行分类。的提取ķ项需要ø (ķ √使用整数排序汉Thorup的算法从2002年FOCS,例如预期的随机时间,以及推入操作需要一定时间。
我不知道的是:是否可以在时间内处理提取并按固定时间推送?有关于这个问题的文献吗?它像整数排序一样难吗?
动机:这是在Coffman-Graham调度算法中订购商品所需的基本步骤,该算法在图形绘制中也有应用。Coffman-Graham的困难部分是字典拓扑顺序。对于每个不同的度数,可以通过在子图中保持该度数的顶点序列来保持剩余的顶点来完成此操作。然后,从零度顶点的序列中重复删除第一个顶点并将其添加到拓扑顺序中;从先前所属的度数中提取v的邻居,并将其推入序列以获取下一个较小的度数。所以O (k ) 在此数据结构中进行提取操作所需的时间将导致Coffman-Graham算法的线性时间实现。
自从最初提出这个问题以来,我发现了Sethi在1976年发表的一篇论文,该论文允许在线性时间内实现Coffman-Graham算法,并将其包含在我的Wikipedia文章中有关Coffman-Graham算法的文章中,因此最初的动机意义不大。我仍然很好奇答案是什么。