手机小米商城电子发票:数据结构问题,急

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 15:16:22
请设计一个事件复杂度为O(n),空间复杂度不超过O(2)的算法,该算法讲数组A[0:n-1]中所有元素一次循环右移k个位置。
具体程序如下:
void rightshift(int A[],int n,int k)
//将A[0:n-1]中元素依次右移k个位置
{
int p,q,m,pre_tem,tem;
p=0; //开始位置
m=0; //记数器
q=p; //q初值
pre_tem=A[p];
while(m<n)
{
do
{
q=(q+k)%n; //q移向下一个位置
//交换pre_tem与A[q]
tem=pre_tem;
pre_tem=A[q];
A[q]=tem;
m++;
}while(p!=q);
if(m<n)
{
++p; //当q回到p时,p向前移动一个位置
q=p; //q的初值为P
pre_tem=A[p];
}
}
}

我的问题是,在上面的程序中从哪里可以体现出题中所要求的空间复杂度为O(2)以及时间复杂度为O(n)?
我的书上有对这道题的解释,书上面说“空间复杂度为O(2),可知对每个元素在循环时只移动(或交换)一次,申请的元素空间变量个数不能多于2。”我的问题又来了,什么样的语句代表着申请元素空间(请用上面代码中的语句解释)?
如果我没有表达清楚,请说明,谢谢帮助

声明了变量就意味着要使用内存空间。程序中声明了 pre_tem 和 tem 两个变量,即额外使用了两个单位的存储空间。p、q、m 是索引数值,不在考虑之中。