根据另一个列表定义的顺序对列表进行排序

时间:2010-08-12 11:08:38

标签: sorting subset

如何对列表 A 的元素进行排序,以便它们遵循另一个(超集)列表 B 的顺序?假设没有重复。

E.g。 A 可能包含[8 2 5 1]而 B 可能包含[5 6 9 8 7 4 1 2 3],所以我想排序 A 成为[5 8 1 2]

我对如何有效地执行此操作以及良好的运行时复杂性感兴趣。

2 个答案:

答案 0 :(得分:3)

如果 B A 的超集,我只需将 A 转储到哈希表中,扫描 B < / strong>并创建一个新列表,我在其中插入哈希表中包含的 B 中的每个元素。使用O(a)额外内存和O(b)运行时。

答案 1 :(得分:2)

以下是一些想法:

(在给定的时间复杂度中, n A 的大小而 m B 的大小>。时间复杂性没有简化。)

  • 对于 B 中的每个元素,执行 A 的线性搜索,以查看该元素是否存在。如果是这样,请将其与 A 中尚未放入位置的第一个元素交换。 时间复杂度:O(nm)
  • 与上述相同,但首先将 A 的内容放入有效的查找结构中以避免线性搜索。 时间复杂度:O(n + m)假设O(1)查找
  • 排序 B 。然后,对于 A 中的每个元素,使用二进制搜索在 B 中查找其索引(保证存在)。将此索引记录在与 A 相同大小的辅助数组中。使用该索引数组作为对 A 进行排序的比较器的输入。 时间复杂度:O((m log m)+(n log n)+(n log n))