首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求时间复杂度为O(n)的算法设计题(很怪的题)解决方案

2012-02-06 
求时间复杂度为O(n)的算法设计题(很怪的题)题目:用一个一维数组(大小为n)存储一系列的整型数字,要求将该数

求时间复杂度为O(n)的算法设计题(很怪的题)
题目:用一个一维数组(大小为n)存储一系列的整型数字,要求将该数组向右移动k位,只用一个辅助量,算法的时间复杂度(元素移动或者交换次数)为O(n)。
=========================================
我想了一种方法,就是跳跃性的移动,如下:
n   =12,k=3;
10-> 3,3-> 6,6-> 9,9-> 12,......
这样每一个元素恰好移动一次,但是很显然,有元素被覆盖了,这种
设计方法是不行的。
==========================================
希望大家能给出一种求解方法。谢谢


[解决办法]
lz所说的右移k位应该是指循环右移,然后这就是一个经典问题了,自然也有经典的解法,这里假定Reverse是用于反转一个数组的函数,他的声明可能是这样
void Reverse(int data[], int cnt);

Reverse可以在O(n)内完成,那么原问题的解为(其中data存放了那一系列数字,总共cnt个)

void Func()
{
Reverse(data, cnt);
Reverse(data, k);
Reverse(data + k, cnt - k);
}

很显然,总的复杂度依旧是O(n)
[解决办法]
把1到n-k倒序,把n-k+1到n倒序
把1到n倒序
[解决办法]
建议楼主看看《编程珠玑》,这个题目就很easy了,其实方法正如fflush(stdin)和yaunx(杨)所说的,算法的正确性依赖于一条定理。

热点排行