基于排序子集排序完整集

Posted

技术标签:

【中文标题】基于排序子集排序完整集【英文标题】:Sort full set based off sorted subset 【发布时间】:2016-02-03 14:25:54 【问题描述】:

假设我有一个以前排序的列表:ABCDEF。用户可以过滤掉其中一些项目以得到一个子集,例如:BCEF。在子集中,然后允许用户重新排序这些项目。例如,他们将 B 移动到 E 之后,现在子集是:CEBF。然后他们关闭过滤器。我希望原始列表反映重新排序的子集。所以完整列表现在应该如下所示:ACDEBF

我在这里寻找什么分类技术?其他可能相关的信息:

    在子集阶段,用户一次只能移动一项 过滤器可以创建一个包含任意数量项目的子集;它可能是完整列表,也可能只是两个项目(从技术上讲,它可能会下降到 0,但 0 和 1 的情况变得微不足道,因为用户无法重新排序子集) 原始列表中不在子集中的项目应尽可能保留它们的位置。

【问题讨论】:

【参考方案1】:

这里有一个解决方案:

sorted_fullset = ["a","b","c","d","e","f"]
sorted_subset = ["a","b","e"]

def shuffle_set_by_subset(sorted_fullset,sorted_subset,shuffled_subset):
  shuffle = dict((item,idx) for idx,item in enumerate(sorted_subset))
  shuffled_fullset = sorted_fullset[:]
  for idx,item in enumerate(sorted_fullset):
    if item in sorted_subset:
      place_in_sorted_subset = shuffle[item]
      shuffled_fullset[idx] = shuffled_subset[place_in_sorted_subset]
  return shuffled_fullset

print shuffle_set_by_subset(sorted_fullset,sorted_subset,["e","b","a"])
print shuffle_set_by_subset(sorted_fullset,sorted_subset,["a","e","b"])

结果:

['e', 'b', 'c', 'd', 'a', 'f']
['a', 'e', 'c', 'd', 'b', 'f']

【讨论】:

【参考方案2】:

给定一个预先排序的列表,每当创建子集时,请记下子集中项目相对于原始集的位置。 (例如使用另一个数组来跟踪位置)。

然后确保在重新排列项目时,索引保持不变(如果使用单独的数组,则默认情况下是这样)。

最后将重新排列的项目复制回索引数组所指示的位置。

例如:A = a,b,c,d,e,f。 B_ITEMS = b,d,e。 B_POSITIONS = 2,4,5

假设 B 中的项目重新排列如下: B_ITEMS = d,e,b

将 B_ITEMS 中的项目复制到 B_POSITIONS 指示的位置。

A = a,d,c,e,b,f

【讨论】:

谢谢。我有效地做到了,但没有明确使用额外的数组。我有原始数组 A=a,b,c,d,e,f 和原始子集 B=b,d,e。子集求助于 C=d,e,b。然后我设置了两个指针,一个在原始数组 pA 上,一个在重新处理的子集 pC 上。然后我根据以下规则开始向下递增 A 设置项:如果 pA 指向的项目不在 C 中,则将其留在原处并提前 pA。如果 pA 项在 C 中,则插入 pC 指向的项并递增 pA 和 pC。 无法完全了解您,但很高兴您解决了问题。指针可能很棘手。还要测试重复的字母!

以上是关于基于排序子集排序完整集的主要内容,如果未能解决你的问题,请参考以下文章

快速排序

1月第6题:通俗讲解 "快速排序" 算法?

javascript 快速排序方法

递归与分治-合并排序快速排序以及循环赛问题

快速排序(QuickSort)的Javascript实现

按值排序python集列表