n元一维向量向左旋转i个位置

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
    第一篇原创。。
    在《编程珠玑》第2章的开头有三个问题,其中的第2个问题,即问题B是这样的:
    将一个n元一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步内完成该工作,要求仅用几十个额外字节的存储空间、O(n)的时间内完成向量的旋转。
    我首先想到的是:将a数组的前i个元素复制到一个临时数组中,然后将余下的n-i个元素向左移动i个位置,最后将最初的i个元素从临时数组中复制到a中余下的位置。但是,这种方法使用的i个额外的位置消耗了过大的存储空间。
    另外一种的方法是定义一个函数将a向左旋转一个位置(其时间为O(n))然后调用该函数i次,但这种方法又产生了过多的运行时间消耗。
    书中介绍的方法很有意思,原文是这样描述的“这个方法有点像精巧的杂技动作,移动a[0]到临时变量t,然后移动a[i]至a[0],a[2i]至a[i],依次类推(将a中的所有下标对n取模),直至返回到取a[0]中的元素,此时改为从t取值然后终止过程。如果该过程没有移动全部元素,就从a[1]开始再次进行移动,直到所有的元素都已经移动为止。”

    然后就尝试将其还原为代码,这段话不是非常的详细,一开始是用n=12、i=3做实验的,以为是一轮一轮的变换,共i轮,但是n=10、i=3时就不对了,所以肯定是错误了,仔细琢磨这段话,它的结束条件是两个,其一是取到t赋值的那个元素(这段话没有描述清楚的一个很重要的地方),其二是移动了全部的元素。另外一个地方是,比如从a[1]开始再次进行移动则是移动a[i+1]至a[1],a[2i+1]至a[i+1],依次类推。源代码实现为:

#include <iostream>

using namespace std;

void fun(int, int);

int main()

{

  int n,i;

  cout<<"n = "<<endl;

  cin>>n;

  cout<<"i = "<<endl;

  cin>>i;

  fun(n, i);

  return 0;

}

 

void fun(int n, int i)

{

  int j= 0, t, from, to,count;

  int *a = new int[n];

  for (j=0; j<n; j++)

  {

    a[j] = j;

    cout<<a[j]<<" ";

  }

  cout<<endl;

  t = a[0];

  count=0, to=0;

  int position = 0;

 

  do

  {

    from = (to + i)%n;

    if (from==position)

    {

      a[to] = t;

    }

    else

    {

      a[to] = a[from];

    }

    to = from;

    count++;

    if ((to + i -position)%n==0 && count==(n-1))

    {

      break;

    }

    else if ((to + i -position)%n==0 && count != (n-1))

    {

      a[to] = t;

      t = a[++position];

      to = position;

      count++;

    }

  } while (1);

 

  a[to] = t;

 

  for (j=0; j<n; j++)

  {

    cout<<a[j]<<" ";

  }

  cout<<endl;

  delete []a;

}

运行结果举例:

这个思路挺有意思的~
编程珠玑(第2版)》笔记——将一个n一维向量向左旋转i个位置(第2章) 第2章 啊哈!算法 《编程珠玑(第2版)》的第2章,一开始就给出三个问题,其中问题B很有意思:将一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n的中间向量在n步就能够完成该工作,你能否仅使用数十个额外字节的存储空间,正比于n的时间内完成向量旋转。 其实就像问题中提到的,如果不考虑空间,这是个很简单的问题。但考虑到 阅读详情

相关推荐

数组循环左移

一个n一维向量向左旋转(即循环移位)i个位置。例如,当n=8,且i=3时,向量abcdefgh旋转为defghabc。能否使用数十个额外字节的存储空间,在正比于n的时间内完成?

完美算法 --将一个具有n个素的数组向左循环移动i个位置

实验问题:   将一个具有n个素的数组向左循环移动i个位置。  有许多应用程序会调用这个问题的算法,例如在文本编辑器中移动行的操作,磁盘整理时交换两个不同大小的相邻内存块等。所以,这个问题的算法要求有较高的时间和空间性能。    基本要求:   ⑴在原数组中实现循环右移,不另外申请空间;   ⑵时间性能尽可能好;      ⑶分析算法的时间复杂度。  要在不另申请空间的情况下,保证算法的时间性能

极致的专注 无限的热情 5695

数组循环左移问题,将一个N个素的数组向左移i个位置

解法一: 先将数组前i个素存在临时数组,在将余下的n-i个素左移i个位置,最后将临时数组中的素复制到后面i个位置 复杂度: 需移动i+(n-i)+i = i+n 次数组单 需i个额外存储 解法二: 设计一个函数将数组向左移动一个位置,然后在调用函数i次 复杂度: 需移动i*n次数组单 只需1个额外存储 解法三: AB(A代表前i个素,B代表后n-i个素),先将A置换,在将B置...

双手敲键盘 4898

n一维向量向左循环移位i的几种算法

1、最简单的算法借助于一个n的中间向量在n步时间内完成 时间复杂度:O(n) 空间复杂度O(n) 1 void shift_easy(int arr[], int _arr[], int n, int i){ 2 int j = 0; 3 4 while(i < n){ 5 _arr[j++] = arr[i++]; 6 ...

weixin_30345055的博客 185

[转]编程珠玑--旋转算法

题目:将一个n一维数组a[n]左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。 1. 块交换法: 分析:将n一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面。 如:n=8,i=3时,将第一块abc存储为临时变量,第二块defgh前移3个单位,再将abc放入到defgh后...

weixin_34407348的博客 134

第二章 啊哈!算法 (向量旋转

一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量旋转? “旋转操作对应于交换相邻的不同大小的内存块:每当拖动文件中的一块文字到其他地方时,就要求程序交换两块内存中的内容。在许多应用场合下,运行时间和存储空间的约束会很严格。

Hello World 2904

编程珠玑2章B问题--n一维向量向左旋转i个位置

问题:将一个n一维向量向左旋转i个位置,要求使用一个n的中间向量在n步内完成该工作,仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量旋转。 思路: 想法1:移动x[0]到临时变量t,然后移动x[i]至x[0],x[2i]至x[i],以此类推(将x中的所有下标对n取模),直至返回到取x[0]中的素,此时改为从t取值然后终止过程。以此类推,直至把x[0]至x[i-1]个变量移动。

qijian111的专栏 858

编程珠玑(1):将一个n一维向量向左旋转i个位置。例如当n=8且i=3时,向量abcdefgh 旋转为defghabc

问题:    将一个n一维向量向左旋转i个位置。例如当n=8且i=3时,向量abcdefgh旋转为defghabc。 如果存储空间很宽松的条件下可以用以下的方法解决:   首先,申请一个n长度的空间,然后把i前的素拷贝到临时空间中,再把余下的n-i个素左移i个位置,最后将最初的i个素从临时空间中拷贝到x中余下的位置上即可。

yuehuazhang的专栏 666

问题:将一个n一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。

问题:将一个n一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。   解决办法: 1.求模置换     移动x[0]到临时变量i,然后移动x[i]至x[0],x[2i]至[i],依次类推,将x中的所有下标对n取模,直至返回到取x[0]中的素,此时改为从t取值然后终止过程。 //求公约数 unsigned int Gcd(unsigned

b711183612的专栏 578

一个n一维向量向左旋转i个位置。例如,当n = 8且i = 3时,向量abcdefgh旋转为defghabc

void Swap(char *a, char *b) {     char temp = *a;     *a = *b;     *b = temp; } void Reverse(char *str, int left, int right) {     if(str == NULL || left >= right)     {

坚持 627

从0到1:C语言实现一维向量旋转操作

如何实现指定个数的一维向量的左旋操作?又如何实现指定个数且指定旋转方向的旋转操作?

猫晨的技术小屋 1141

编程珠玑之第二章questionB: n一维向量旋转问题

问题描述: B.将一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc. 简单的代码使用一个n的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成该向量旋转? 问题解析: 1、以正比于n的时间(相当于n步内)完成该操作,那么就是每个素的移动都差不多一步到位,如将第4位的d一步移动到第1位处,

JohnnyHu90的专栏 1662

杂技算法Java实现

一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量旋转?(《编程珠玑》第二章) “移动x[0]到临时变量t,然后移动x[i]至x[0],x[2i]至x[i],依此类推(将x中的所有下标对n取模),直至返回到取x[0]中的

θ..θ的专栏 580

编程珠玑】将一个n向量旋转i个位置

一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n的中间向量在n步就能够完成该工作,你能否仅使用数十个额外字节的存储空间,正比于n的时间内完成向量旋转。   【解法分析】 将问题看作是把数组ab转换为ba,同时假定我们拥有一个函数可以将数组中特定部分的素求逆。从ab开始,首先对a求逆,得到arb,然后

雪狼魂的专栏 1111

n一维向量旋转问题

问题描述:将一个n一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc. 简单的代码使用一个n的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成该向量旋转? 问题解析:1、以正比于n的时间(相当于n步内)完成该操作,那么就是每个素的移动都差不多一步到位,如将第4位的d一步移动到第1位处,其他素也也一样。2...

Sinhaeng_Hhjian 554

一个n一维向量向左翻转i个位置的算法(二)

<br />def reverseArr2[T](n:Int, arr:Array[T])={ def inverseVector[S](start:Int, end: Int,arr:Array[S])={ val pair = (end - start)/2 val sum = start + end - 1 var j = start for (i <- 1 to pair){ val t = arr(j) arr(j) = arr(sum -

messi_18的专栏 598

“《编程珠玑》(第2版)第2章”:B题(向量旋转

  B题是这样子的:   将一个n一维向量向左旋转(即循环移位)i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量旋转?   以下题目的解答部分参考自一博文及该书参考答案。   分析:    “abcdefgh”严格来说并不是...

209
上一篇: [收集]二叉树和多叉树的非递归算法
下一篇: [收集]计算程序的运行时间
华秋实
博客等级 码龄19年 340粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值