标题:计算时间复杂度最优化
只看楼主
lj2260
Rank: 2
等 级:论坛游民
帖 子:32
专家分:62
注 册:2010-9-12
结帖率:50%
已结贴  问题点数:10 回复次数:1 
计算时间复杂度最优化
已知一个长度为n的数组和一个正整数k,并且最多只能使用一个用于交换的附加空间单元,试设计算法得到原数组循环右移k次的结果,要求他的时间复杂度为 n(即与k无关)
搜索更多相关主题的帖子: 时间 最优化 
2010-09-24 14:29
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
得分:10 
一种比较简便的方法就是利用一个类似于德摩根定律的方法,对于数组A,将它分为两截,分别为B和C,如果分别对B和C进行逆序操作,然后再对整个数组进行逆序操作,则就可达到左移k个位置的目的。
假设原数组序列为0123456,要求变换成的数组序列为4560123,即循环左移了4位。比较之后,不难看出,其中有两段的顺序是不变的:0123和456,可把这两段看成两个整体。左移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:
1.   逆序排列0123:0123456 → 3210456;
2.   逆序排列456:3210456 → 3210654;
3.   全部逆序:3210654 → 4560123。
这个过程可以被简单地证明。
并且时间复杂度为O(N)。
程序代码:
void Reverse(int *Arr, int Begin, int End)  

 {  
     while(Begin < End)  //    以中心为对称点,分别交换对偶位置上的数  
     {  
         int Temp = Arr[Begin];  
         Arr[Begin] = Arr[End];  
         Arr[End] = Temp;  
         Begin++;  
         End--;  
     }  

 }  
void Shift(int *Arr, int N, int k)  

 {  
     Reverse(Arr, 0, k - 1);  
     Reverse(Arr, k, N - 1);  
     Reverse(Arr, 0, N - 1);  

 } 



Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-24 22:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-321224-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081607 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved