Algorithm 如何提高算法的效率?
我必须交换数组中的数字“d”次,这样才能完成数组的左旋转d'是数组的旋转次数。假设数组是1->2->3->4->5,如果d=1,那么在左旋转一圈后,数组将是2->3->4->5->1 我已使用以下代码执行上述操作:Algorithm 如何提高算法的效率?,algorithm,recursion,swap,Algorithm,Recursion,Swap,我必须交换数组中的数字“d”次,这样才能完成数组的左旋转d'是数组的旋转次数。假设数组是1->2->3->4->5,如果d=1,那么在左旋转一圈后,数组将是2->3->4->5->1 我已使用以下代码执行上述操作: for (int rotation = 0; rotation < d; rotation++) { for (int i = 1; i < a.length; i++) { int bucket = a[i - 1]; a[i
for (int rotation = 0; rotation < d; rotation++) {
for (int i = 1; i < a.length; i++) {
int bucket = a[i - 1];
a[i - 1] = a[i];
a[i] = bucket;
}
}
for(int-rotation=0;rotation
但该算法的效率太高,可能是O(n^d)最坏情况。如何提高算法的效率,尤其是在最坏的情况下
我正在寻找这个算法的递归方法。我想到了:
public static void swapIt(int[] array, int rotations){
for(int i=1; i<array.length; i++){
int bucket = array[i-1];
array[i-1] = array[i];
array[i] = bucket;
}
rotations--;
if(rotations>0){
swapIt(array,rotations);
}
else{
for(int i=0; i<array.length; i++){
System.out.print(array[i]+" ");
}
}
}
公共静态void swapIt(int[]数组,int旋转){
对于(int i=1;i0){
swapIt(阵列、旋转);
}
否则{
对于(inti=0;iKomplexity),在我看来,您的算法的复杂性类似于O(n*d)
我的方法不是旋转d次,而是旋转d次
可以通过以下方式计算元素的目标:
因此,与其a[i-1]=a[i];
您可以这样做:
a[(i + a.length - d) % a.length] = a[i];
术语(i+a.length-d)%a.length
处理您总是在间隔中获得值:0…a.length-1
说明:
i+a.length-d
始终为正(只要d为n,则需要减少d.d=d%a.length
以确保(i+a.length-d)%a.length
在所需的区间0…a.length-1
。结果是一样的,因为按a.length旋转就像什么都不做。要加上@mrsmith42的答案,您可能应该检查d
是否在范围1内。该算法有递归方法吗?@CoderSam:我不推荐d递归解决方案。递归“总是”会带来性能损失(保留每个递归步骤的上下文…)。但当然,您可以采用您的算法并使外部循环成为递归。您可以始终将循环重构为原因递归;-)您可以始终使用循环数组,并始终迭代最多length
项