二维排序问题 - 交替排序顺序升序/降序以减少波动 - 微不足道?

计算科学 参考请求 排序
2021-12-12 06:58:55

我有一个解决方案来寻找你们中的一些人可能会帮助我解决的问题。

为元素列表。每个元素都有两个固有属性/属性(),每个都可以表示为实数。每个元素的两个属性的值是完全不相关的。重新排序,这样对于列表中的连续元素,属性的值的差异保持相对较小——即,我们希望避免从一个元素到下一个元素的值大幅跳跃。LabLab

对列表进行排序来最小化属性 a 的波动但是,由于的值将在最小值和最大值之间随机波动。排序,那么到处都是。aabbba

相反,我们选择基于属性创建多个组/箱,按顺序排列这些箱,然后按属性对这些箱中的元素进行排序。这样,属性波动可以不大于 bin 范围的两倍(最坏情况:从一个 bin 遍历到下一个 bin 时),并且在一个 bin 内遍历时不大于 bin 范围的一倍。属性的波动也相对较小,因为在箱内,值按排序。结果看起来像这样(属性为蓝色,为橙色):ababbab

在此处输入图像描述

仍然存在很大的波动——从大约其最大值到大约其最小值(上面的“锯齿波”)。为了改进这一点,我们在随后的 bin 之间交替排序,以创建一种“三角波”。这确保了属性 b 的波动在列表中的任何地方都很小:b

在此处输入图像描述

的波动,我想确定工程师提出这种排序策略是多么微不足道——尤其是在箱内以交替方式排序为此,我正在寻找可能遇到这种排序策略的问题或应用程序(或者可能是整个学科?)。ab

虽然我偶尔会发现一篇关于有人试图实施此特定订单的帖子(例如https://codereview.stackexchange.com/questions/88710/alternating-sort-order-within-a-sorted-group),但事实证明它令人惊讶很难找到任何具体的例子来说明为什么要这样做。

有什么想到的吗?最终,我的目标是找到展示这类问题和解决方案的(文本)书籍。朝那个方向的任何事情都将不胜感激。

2个回答

我没有提供任何参考资料,但你的方法对算法设计的从业者来说肯定有某种意义。

如果您意识到可以将您的对排列为二维位置中的点,则该解决方案更容易理解。然后,您的“垃圾箱”只是垂直条带,您从一个条带底部向上穿过点,然后在下一个条带自上而下穿过这些点;然后重复接下来的两组试纸。(a,b)

一旦你完成了那个飞跃,你就会意识到这可能不是最好的策略:它取决于条带的宽度,如果你有点在条带的左右边缘之间交替,那么这种排序不会是最优的。但是对于这类问题有一些很好理解的解决方案:具体来说,更好的策略是引入“空间填充曲线”并根据它们在空间填充曲线上的位置对点进行排序。

根据上述 Wolfgang 的建议,我在Gerhard Reinelt的 1994 年专着 The Traveling Salesman (Berlin: Springer 1994) 中找到了上述解决方案它被称为“条带”启发式算法,可以作为一种廉价的方法来为大型旅行商问题找到合理的解决方案。

Reinelt 将条带启发式描述如下:“问题区域被切割成垂直条带。然后按如下方式构建游览。我们从第一个条带中垂直坐标最低的点开始,继续到条带 1 的下一个更高的节点以此类推,直到第一个条带的所有点都被收集完,然后将条带1中纵坐标最高的点连接到条带2中纵坐标最高的节点,向下扫描条带2,剩下的条带都被_

Reinelt 中描述的条带相当于我最初的问题陈述中的垃圾箱。条带 1 向上遍历,条带 2 向下遍历,相当于交替排序。