【问题标题】:Sort a list according to order defined by another list根据另一个列表定义的顺序对列表进行排序
【发布时间】:2010-08-12 11:08:38
【问题描述】:

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

例如A 可能包含 [8 2 5 1] 而 B 可能包含 [5 6 9 8 7 4 1 2 3],所以我想排序 A 变成 [5 8 1 2]

我对高效且具有良好运行时复杂性的方法感兴趣。

【问题讨论】:

    标签: sorting subset


    【解决方案1】:

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

    【讨论】:

    • 这基本上是大卫的第二个选择。
    【解决方案2】:

    这里有一些想法:

    (在给定的时间复杂度中,nA 的大小,mB 的大小>. 时间复杂度没有简化。)

    • 对于 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))

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2018-01-03
      • 2022-11-16
      • 2018-09-15
      • 1970-01-01
      • 2023-04-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多