arr
在 给定目标索引数组的情况下,如何对给定数组 进行 排序ind
?
例如:
var arr = ["A", "B", "C", "D", "E", "F"];
var ind = [ 4, 0, 5, 2, 1, 3 ];
rearrange(arr, ind);
console.log(arr); // => ["B", "E", "D", "F", "A", "C"]
arr = ["A", "B", "C", "D"];
ind = [ 2, 3, 1, 0 ];
rearrange(arr, ind);
console.log(arr); // => ["D", "C", "A", "B"]
我尝试了以下算法,但在上面的第二个示例中失败了。
function swap(arr, i, k) {
var temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
function rearrange(arr, ind) {
for (var i = 0, len = arr.length; i < len; i++) {
if (ind[i] !== i) {
swap(arr, i, ind[i]);
swap(ind, i, ind[i]);
}
}
}
您如何在O(n)时间和O(1)额外空间中解决此问题?
您能否提供证明您的算法有效的证据?
注意:
这个问题看起来与此类似,但是这里ind
允许变异。
该算法失败,因为它在列表的索引上只有一个循环。
您的算法中发生的事情是这样的:
i=0 -> ["A", "B", "C", "D"] , [ 2, 3, 1, 0 ]
i=1 -> ["C", "B", "A", "D"] , [ 1, 3, 2, 0 ]
i=2 -> ["C", "D", "A", "B"] , [ 1, 0, 2, 3 ]
i=3 -> ["C", "D", "A", "B"] , [ 1, 0, 2, 3 ]
请注意,第一次交换1
是如何进行的,0
除非您与交换,否则将不会再次访问它0
,在此示例中不会发生这种情况。
您的算法错过的是一个内部循环,该内部循环贯穿索引的子循环。尝试更换if
用while
在rearrange
:
function rearrange(arr, ind) {
for (var i = 0, len = arr.length; i < len; i++) {
while (ind[i] !== i) {
swap(arr, i, ind[i]);
swap(ind, i, ind[i]);
}
}
}
关于复杂性的注意事项
:尽管这是一个双循环,但复杂度不会改变,因为在每次交换时,一个元素都被正确放置,并且每个元素最多读取两次(一次循环,一次通过for循环)。
证明注意事项
:在这里,我不会对此算法做完整的证明,但是我可以提供线索。如果ind
是一个排列,则所有元素都属于封闭的排列子循环。该while
循环确保你遍历整个周期的for
循环确保你检查每一个可能的周期。
问题内容: 我正在尝试排序(减少)整数数组,但要跟踪原始索引。 我的意思是,例如,如果我有这个数组: 使用Arrays.sort(b,Collections.reverseOrder())之后变成(我使用Arrays.sort,因为在此示例中b的长度仅为5,但是在我的问题中b的长度可能是1 <b.length <70 但我想以某种方式拥有原始索引,我的意思是知道 我不知道我的问题是否明确,请向我询
想改进这个问题吗?更新问题,让它只通过编辑这篇文章来关注一个问题。 给出了一个由N个整数组成的零索引数组A。此数组的平衡指数是任意整数P,因此0≤ P 例如,考虑以下由N = 8个元素组成的数组A: P = 1是这个数组的平衡指数,因为: P=3是该数组的平衡指数,因为: P = 7也是一个均衡指数,因为: 并且没有索引大于7的元素。 P = 8 不是均衡指数,因为它不满足条件 0 ≤ P 现在我
假设我有一个字典数组: 我如何排序,使它是降序,按“id”排序? 但我知道这是错误的,也不是有效的。
问题内容: 我一直在使用sort()函数,但它混合了相对顺序。 这就是我的代码的样子。 Swift API表示: 排序算法不稳定。不稳定排序可能会更改比较相等的元素的相对顺序。 如何更改此值,以使相对顺序保持与以前相同? 问题答案: 从这里获取:https : //medium.com/@cocotutch/a-swift-sorting- problem-e0ebfc4e46d4
问题内容: 我在列表列表或元组列表中都有一些数据,如下所示: 我想按子集中的第二个元素排序。这意味着,由,其中排序2是是从。常见的做法是什么?我应该将元组或列表存储在列表中吗? 问题答案: 要么: