Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

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
Algorithm 合并两个部分(联合超定)排序信息集_Algorithm_Sorting_Merge_Partial Ordering - Fatal编程技术网

Algorithm 合并两个部分(联合超定)排序信息集

Algorithm 合并两个部分(联合超定)排序信息集,algorithm,sorting,merge,partial-ordering,Algorithm,Sorting,Merge,Partial Ordering,我有一个网格数据的web应用程序。用户可以对列重新排序,服务器可以更改存在的列。我想将用户的列顺序保存在cookie中,并在页面加载时恢复它 更正式地说,我有两个唯一ID(字符串)数组,分别称为user\u columns和server\u columns。我想重新排序server\u列,以便我尊重user\u列中的所有排序信息,并尽可能多地从server\u列中排序。我该怎么做?“尽可能多”的合理正式定义是什么 我目前的分析是: 问题的一个方面很简单:如果服务器删除了一些列,则从user\u列

我有一个网格数据的web应用程序。用户可以对列重新排序,服务器可以更改存在的列。我想将用户的列顺序保存在cookie中,并在页面加载时恢复它

更正式地说,我有两个唯一ID(字符串)数组,分别称为
user\u columns
server\u columns
。我想重新排序
server\u列
,以便我尊重
user\u列
中的所有排序信息,并尽可能多地从
server\u列
中排序。我该怎么做?“尽可能多”的合理正式定义是什么

我目前的分析是:

问题的一个方面很简单:如果服务器删除了一些列,则从
user\u列
中删除相应的条目。关于不再存在的列的排序的任何信息都没有意义。然后问题就变成了合并两组潜在冲突的排序信息

这与投票理论中的一系列问题相对应:给定一组选票,每个选票都包含候选人之间的部分顺序,产生候选人的完整顺序,这在某种意义上反映了选票

这使我想到,我可能会得到一个可行的解决方案,例如,根据
用户列
服务器列
将or应用于一组经过充分操纵的选票。出于用户体验的原因,通过最后(在右边)插入新列来打破关系对我来说似乎是个好主意

这听起来像是在正确的轨道上吗


请注意,我们可以考虑三种比较:A和B都在<代码> USER列中,其中一个是,或者没有。前者和后者很容易解决(分别参考
用户列
服务器列
);中间的一个,以及它与后者的交互是棘手的部分。

< P>一个可能合理的定义是最小化相对于服务器顺序的倒数,受约束的限制,即两个命令的共同列的限制相等。我不知道一个算法来最小化这个目标。

假设我们有C列,编号从1到C。我们有两个列序列,U=u1,u2。。。un和S=s1,s2。。。山猫。我们想找到S的一个置换P,使得P对U没有倒数,对S有最小倒数

我们可以证明存在这样一个最优p,它是U的交错∩ S和S\U。通过“交错”,我的意思是P对U没有倒数∩ S或S\U

我们可以应用于寻找最佳交织:设A=(ai)=U∩ S和B=(bj)=S\U。设f(i,j)为A的前缀a1…i和B的前缀b1…j的最佳交错的逆w.r.t.S的数目。该思想与DP算法非常相似。我们有复发

f(0,j) = 0 for all j >= 0
f(i,0) = f(i-1, 0) + sum(k=1 to i-1, [1 if A[i] appears before A[k] in S])
f(i,j) = min(f(i-1, j) + sum(k=1 to i-1, [1 if A[i] appears before A[k] in S])
                       + sum(k=1 to j, [1 if A[i] appears before B[k] in S]),
             f(i, j-1) + sum(k=1 to i, [1 if B[j] appears before A[k] in S])
                       + sum(k=1 to j-1, [1 if B[j] appears before B[k] in S]))
我在这里使用符号
[1 if X]
表示值
1
,如果X为真,如果X为假

矩阵
f
可以在时间O(|A | ^2*|B | ^2)内构建。最小成本(反转次数w.r.t.S)为f(| A |,| B |)

我们也可以使用DP矩阵重建最佳排列:我们从后向前构建它。我们从元组(i,j)=(| A |,| B |)开始,在每一步,根据DP转换中两个选项中的哪一个最小,我们知道是否需要将A[i]或B[j]放在排列的前面。然后我们继续(i-1,j)或(i,j-1),这取决于我们选择哪个

,请原谅我缺乏JS技能。

这与:

<强>定理< /强>:考虑序列S=S₁, …, sₙ 某些有序集(例如整数)的。如果i sⱼ, 然后交换sᵢ 和sⱼ 减少反转数,即,设S'=S₁, …, sᵢ₋₁, sⱼ, sᵢ₊₁, …, sⱼ₋₁, sᵢ, sⱼ₊₁, …, sₙ; 那么S'的倒数比S少

直观地说:如果两个元素的顺序不正确,并且您交换了它们,那么您就更接近于拥有一个排序列表了

证明:注意在S和S'中具有不同相对顺序的元素只有(Sᵢ, sⱼ), (s)ᵢ, sₖ) 及ⱼ, sₖ) 对于i 要么是sₖ < sⱼ < sᵢ 或sⱼ < sₖ < sᵢ 或sⱼ < sᵢ < sₖ (我们假设S的元素是唯一的)

在第一种情况下,(s)ᵢ, sₖ) 是S和(S)中的倒装ⱼ, sₖ) 在第二种情况下,(Sᵢ, sₖ) 及ⱼ, sₖ) 是S中的倒数,但不是S中的倒数。在第三种情况下,(Sⱼ, sₖ) 是S和(S)中的倒装ᵢ, sₖ). 这些都是反转的变化

在每种情况下,S'中的倒数要么与S中的倒数相同,要么更小ᵢ, sⱼ) 从S到S'得到了修正,我们得到了期望的结果。■

因此,如果我们有一个₁, Bᵢ, …, Bⱼ, A.₂ 一个接一个∈ S\U和每个b∈ U∩ S和a₁ > A.₂ 我们交换一个₁ 和₂, 得到₂, Bᵢ, …, Bⱼ, A.₁, 反转计数较低。因为这种交换只重新排列S\U的元素,而不是U的元素∩ S、 在U上具有零逆的任何解∩ S和(在此基础上)S\U上的最小反转数必须进行所有此类掉期


因此:S\U的元素必须按顺序出现,因此解决方案是U的交错∩ S和S\U.

可能相关:您想用什么语言来实现这一点?@ivarpois:javascript请澄清这个问题。服务器是否也可以重新排序列,或者只是更改列集?因为在前一种情况下,您为什么要提到投票理论?如果只有一方有投票权,则无需进行投票