《编程珠玑(第2版)》笔记——将一个n元一维向量向左旋转i个位置(第2章)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

第2章 啊哈!算法


《编程珠玑(第2版)》的第2章,一开始就给出三个问题,其中问题B很有意思:将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步就能够完成该工作,你能否仅使用数十个额外字节的存储空间,正比于n的时间内完成向量旋转。

其实就像问题中提到的,如果不考虑空间,这是个很简单的问题。但考虑到空间的时候,能否灵巧地解决该问题?


书中给出了2个比较精巧的方法:

1.求模置换的方法:

其实我们知道有个节约空间的方案:每次向左旋转一个位置(其时间正比于n),总共需要旋转i次。这个方案会消耗过多的运行时间。而求模置换的方法则是尽量让每个数一次移动到位。总体的思想是:以i为除数对n求模,将向量遍历完并一次移动到位。看下面两个例:

示例数组: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

(1)n=12且i=5:

n=12且i=5

(2)n=12且i=3:

n=12且i=3

上述两图展示了两种不同的情况,示例(1)的n=12和i=5最大公约数是1,因此不断求模能够无重复完整遍历数组;而示例(2)中n=12且i=3,有最大公约数3,因此移动3个位置就会出现重复,因此需要移动到下一位再次求模共3次:

//求公约数
unsigned int Gcd(unsigned int a, unsigned int b)
{
	unsigned int temp;
	while (b != 0
向量旋转算法(Java实现) 向量旋转问题:给定一个 n维向量, 求 将它向左循环移动i位后的向量。比如:[1,2,3,4,5]向左循环移动3位后,变成[4,5,1,2,3]。为了简单起见,向量采用数组表示。              本文讨论的内容参见《编程珠玑I》(第二)的第二。在那里,讨论了向量旋转的四种算法:              1.基于数组移动的思路: 这个是比较简单的,即将要移动的i个 阅读详情

相关推荐

旋转字符串;编程珠玑第二;rotate a one-dimensional vector;循环移位数组;编程之美

一:问题描述: 编程珠玑第二的第二个问题是字符串(或者理解为向量旋转问题,具体描述如下: rotate a one-dimensional vector of n elements left by i positions. eg: with n = 8; i = 3, the vector abcdefgh is rotated to defghabc. 这个问题在编程之美中也出现了,问题描述: 设计一个算法,把一个含有N个素的数组循环右移K位,要求间复杂度为O(N),只允许使用两个附加

疯狂算法~ 4005

编程珠玑》第12算法的简单C语言实现

void genknuth(int m, int n) { for (int i = 0; i < n; i++) { if (rand() % (n - i) < m) { cout << i << endl; m--; } } } void gensets(int m, int n) { std::set<int&g...

qu1993的博客 255

编程珠玑源代码

编程珠玑第二的源代码,里面主要是以C语言和C++为主

翻手算法

看过编程珠玑的一定对里面用来解决“字符循环左移”的翻手算法印象深刻,这个算法非常容易实现,效率还贼给力! 先说一下题意:如现在有一串字符:ABCDEFG,让前两个字符循环左移到整个个字符串的右边,结果即:CDEFGAB 在具体讲这种算法之前,先来看看线性代数里的转置。(AB)T等于什么?等于BTAT。那么(ATBT)T等于什么?等于(BT)T(AT)T,即BA。 啊哈!我

KeepThinking_的专栏 2993

循环字符串问题中的翻手算法

最近再看《编程珠玑》,

玄云飘风的博客 638

编程珠玑课后习题答案 第一

另一种做法是采用两趟算法,首先使用 5000 000 / 8 = 625 000 个字的存储空间来排序 0 ~ 4 999 999 之间的整数,然后在第二趟排序 5 000 000 ~ 9 999 999 的整数。电话号码的最后两位数字非常接近于随机,因此是非常理想的散列函数,而最前面的两位数字则很不理想——为什么?利用习题 5 的答案,我们可以使用 10 000 000 / 2 个字节在 1 趟内完成对整个文件的排序,或使用 10 000 000 / 2k 个字节在 k 趟内完成对整个文件的排序。

雾隐雾现的至渝博客 878

编程珠玑】【第二】问题B

问题B:将一个n一维向量向左旋转i个位置。例如,当n = 8i = 3向量abcdefgh旋转defghabc。 方法一、使用一个字节的额外空间开销。 采用每次向左移一位的方法,循环i次。当然也可以使用向右移动的方法,循环length - i次。以向左移动为例,共需要移动i趟,首先把str[0]赋值给临变量temp,剩余的字符向左移动一位,即str[k]=str[k+1],移动完成...

weixin_30542079的博客 267

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

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

猫晨的技术小屋 1141

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

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

雪狼魂的专栏 1111

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

第一篇原创。。     在《编程珠玑》第2的开头有三个问题,其中的第2个问题,即问题B是这样的:     将一个n一维向量向左旋转i个位置,例如,当n=8i=3向量abcdefgh旋转defghabc。简单的代码使用一个n的中间向量在n步内完成该工作,要求仅用几十个额外字节的存储空间、O(n)间内完成向量旋转。     我首先想到的是:将a数组的前i个素复制到一个

华秋实的专栏 1823

n一维向量旋转问题(编程珠玑--第2--问题B )

在《编程珠玑 第二》第2中作者给出了3个问题,其中问题B是说:能否在仅使用数十个额外字节的存储空间的情况下,在正比于n的间内,将一个n一维向量x向左旋转i个位置。例如:当n=8i=3向量abcdefgh旋转defghabc。 在该问题中,作者随后给出了几种解决思路,并分析了各种方法的优缺点。 思路一:使用的一个数组,将要移动的向量x的前i个素复制到这个临数组中,然后将剩

Sky的专栏 921

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

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

yuehuazhang的专栏 666

一维向量旋转算法

编程珠玑》第二提到了n一维向量旋转算法(又称数组循环移位算法)的五种思路,并比较了它们在间和空间性能上的区别和优劣。 一,问题描述 将一个n一维向量向左旋转i个位置。例如,假设n=8,i=3向量abcdefgh旋转向量defghabc。简单的代码使用一个n的中间向量在n步内可完成该工作。你能否仅使用几十个额外字节的内存空间,在正比于n的间内...

dbbaq24022的专栏 254

编程珠玑2B问题--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

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

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

209

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

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

JohnnyHu90的专栏 1662

编程珠玑:n一维向量左旋移i个位置

问题描述:将一个n一维向量左旋移i歌个位置。例如:当n=8i=3向量abcdefgh旋转defghabc。使用一个n的中间向量在n步内完成该工作。能否仅用数十字节的额外存储空间,在正比于n的间内完成该旋移?解答思路:向量的旋移,其实就是数组的移动。像a[] = {1,2,3},左旋移一位后就变成了a[] = {2,3,1}。 该问题可以通过以下方式解决: 首先将n的前i个素复制到一

sinat_31508159的博客 686
上一篇: 优化——UIScrollView通过内容延迟加载以达到平滑滑动。
下一篇: KVC(Key-value coding)机制
gavinming
博客等级 码龄18年 31粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值