目前我正在阅读一本关于算法的书,并发现了这种排序的用法。
重建原始订单 - 在我们为某些应用程序置换它们之后,我们如何恢复一组项目的原始布局?在项目的数据记录中添加一个额外的字段,以便第i个记录将此字段设置为i。无论何时移动记录,都要随身携带此字段,然后在需要初始订单时对其进行排序。
我一直在努力理解这是什么意思。我悲惨地失败了。请帮忙吗?
答案 0 :(得分:5)
假设您有随机顺序的项目列表:
itemC, itemB, itemA, itemD
你把它们分类了:
itemA, itemB, itemC, itemD
并且您没有足够的内存将它们存储在单独的位置,因此原始序列将丢失。此外,原始顺序是随机的,恢复它会有问题/不可能。
本文提供了解决此问题的方法。
在项目的数据记录中添加一个额外字段,以便第i条记录将此字段设置为i
因此,我们为每个项目添加了一个额外的字段:
(itemC,1), (itemB,2), (itemA,3), (itemD, 4)
排序后我们有:
(itemA,3), (itemB,2), (itemC,1), (itemD, 4)
因此,我们可以通过附加字段轻松恢复初始订单排序
答案 1 :(得分:3)
假设您拥有数组中的数据,因为它是我可以用来举例说明的最简单的结构。
因此,您的节点(即数组的元素)可能如下所示:
(some data type) data
该算法建议您添加一个整数字段,如下所示:
(some data type) data,
int position
然后,用实际指数填充头寸。像这样的伪代码:
for current: 0 to lastElement
array[current].position = current
(这不是用我所知的任何语言写的,但它应该是可读的)
这样做之后,你可以随心所欲地随意洗牌(诉诸它)。
如果要恢复原始排序,只需按position
字段排序即可。
答案 2 :(得分:1)
嗯,基本上它说你需要某种东西来跟踪原始顺序(由排列破坏)。一种选择就是简单地颠倒排列(查看Steve Jessop的反应here)。
反转置换的另一个选择是需要更少的处理步骤,但需要更多的内存。更具体地说,输入集中的每个节点都有一个额外的ID字段,并且此输入集中的所有元素都根据此字段进行排序。应用排列后,很明显ID不再按排序顺序排列。如果您希望反转排列,您只需根据此字段再次对列表进行排序。