从全局排序顺序中排序N个不同列表的算法

时间:2018-06-07 22:04:29

标签: algorithm sorting

我有N个项目列表

例如:

  • A, B, C, D
  • 1, 2, 3
  • V, W, X, Y, Z

将它们展平为一个长列表,用户根据自己的喜好选择订购

例如:

1, C, X, 3, B, A, Y, Z, 2, W, D, V

我需要重新订购我的N个原始列表,以便它们的相对排序顺序与用户排序中的顺序匹配

例如:

  • C, B, A, D
  • 1, 3, 2
  • X, Y, Z, W, V

简单的暴力方法是创建N个新的空容器,循环用户的订购,并在遇到时将每个项目添加到相关容器中。

有更优雅的方法吗?

2 个答案:

答案 0 :(得分:1)

除非可以对数据的排序做出假设,否则可能没有更优雅的方法。

您必须在某个时刻创建N个新容器中的每一个。

您还必须在某些时候将必要的元素添加到这N个容器中。

这两件事是无法避免的。你的方法既有这两种,也没有更多,因此被证明是最小的。

一个小小的警告是,块数组副本比迭代副本稍快一些,因此如果您知道相同的大块,那么您可以为这些块制作稍快的副本。但通常,为了获取该信息,您必须首先访问并分析数据。因此,您应该访问并插入,而不是访问和分析。

答案 1 :(得分:1)

您必须在开头存储元素来自哪个容器的知识,或者在列表中存储元素到位置的映射并将其用于排序。 (或者节省内存并进行大量搜索。)

如果您要重新排列所有列表,那么存储每个元素来自哪个容器的知识并按照您的建议继续进行更有效。如果您只想重新排列某些列表(或重新排列将来的列表),那么将元素映射存储到列表中的位置并基于此排序可能更有意义。您可以使用通过该查找的比较函数或使用Schwartzian transform来执行此操作。

你有没有想过如何处理重复的元素?