【问题标题】:Sorting application difficulty排序申请难度
【发布时间】:2013-03-01 10:29:40
【问题描述】:

目前我正在阅读一本关于算法的书,并发现了排序的这种用法。

重建原始顺序 - 在我们为某些应用程序排列一组项目之后,我们如何恢复它们的原始排列?为项目的数据记录添加一个额外的字段,以便第 i 条记录将此字段设置为 i。每当您移动记录时,请携带此字段,然后在您想要返回初始订单时对其进行排序。

我一直在努力理解它的含义。而我失败得很惨。有人帮忙吗?

【问题讨论】:

  • 它只是告诉在某处保留原始位置的痕迹,以免丢失此信息。

标签: algorithm sorting


【解决方案1】:

假设您有随机顺序的项目列表:

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)

所以我们可以通过附加字段轻松恢复初始顺序排序

【讨论】:

    【解决方案2】:

    假设您有一个数组中的数据,因为它是我可以用来举例说明的最简单的结构。

    因此,您的节点(即数组的元素)可能如下所示:

     (some data type) data
    

    算法建议你添加一个整数字段,所以它看起来像这样:

     (some data type) data,
     int              position
    

    然后,您使用实际索引填充位置。类似这样的伪代码:

    for current: 0 to lastElement
      array[current].position = current
    

    (不是用我知道的任何语言写的,但应该是可读的)

    这样做之后,你可以随意调整它(重新排序)。

    当您想恢复原始排序时,您只需按position 字段排序即可。

    【讨论】:

    • 随时!谢谢你的好话。
    【解决方案3】:

    嗯,基本上它是说您需要某种东西来跟踪原始顺序(被排列破坏)。一种选择是简单地反转排列(查看 Steve Jessop 的信息性答案here)。

    另一种反转排列的选项需要更少的处理步骤,但需要更多的内存。更具体地说,输入集中的每个节点都会有一个额外的 ID 字段,并且此输入集中的所有元素都基于此字段进行排序。应用排列后,很明显 ID 不再按排序顺序。如果您想反转排列,您所要做的就是根据该字段再次对列表进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多