Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 根据另一个列表定义的顺序对列表进行排序_Sorting_Subset - Fatal编程技术网

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

Sorting 根据另一个列表定义的顺序对列表进行排序,sorting,subset,Sorting,Subset,如何对列表A中的元素进行排序,以便它们遵循另一个(超集)列表B的顺序?假设没有重复 例如,A可能包含[8 2 5 1],而B可能包含[5 6 9 8 7 4 1 2 3],因此我想将A排序为[5 8 1 2] 我对高效且具有良好运行时复杂性的方法感兴趣。如果B是a的超集,我只需将a转储到哈希表中,扫描B并创建一个新列表,在其中插入哈希表中包含的B中的每个元素。使用O(a)额外内存和O(b)运行时 如果B是a的超集,我只需将a转储到哈希表中,扫描B并创建一个新列表,在其中插入哈希表中包含的B中的每

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

例如,A可能包含[8 2 5 1],而B可能包含[5 6 9 8 7 4 1 2 3],因此我想将A排序为[5 8 1 2]


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

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

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

以下是一些想法:

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

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

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

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

      这基本上是大卫的第二选择。这基本上是大卫的第二选择。