编程珠玑--旋转算法

旋转算法出自《编程珠玑》第二章题目。

 

《编程珠玑》一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输。使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感。

 

题目:将一个n元一维数组a[n]左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。

 

1. 块交换法

分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面。

 

如:n=8,i=3时,将第一块abc存储为临时变量,第二块defgh前移3个单位,再将abc放入到defgh后面。

 

思考:这种方法最大的缺陷至少需要与两块中较小的一块大小的临时变量。

 

2.杂技算法

分析:将a[0]存储在一个临时变量中,然后将a[i]替换a[0],a[2i]替换a[i]….当一个循环结束的时候,若替换次数小于n,则从a[1]开始替换…,需要经过gcd(n,i)(n和i的最大公约数)次循环后,才能把每一个元素都移到该移的地方。

 

下面是代码实现:


#include<iostream>

using namespace std;

//求最大公约数
//辗转相除法
int gcd(int a, int b)
{
while( a!= 0)
{
if(a>=b) a-=b;
else
{
int t=a;
a=b;
b=t;
}
}
return b;
}

//杂技算法
void Rotate1(char* a,int lenth,int rotateLen)
{
int gcdNum = gcd(lenth,rotateLen);
for(int i=0; i<gcdNum; i++)
{
int temp = a[i];
int first = i;
while(1)
{
int second = (first+rotateLen)% lenth;
if(second == i) break;
a[first] = a[second];
first = second;
}
a[first] = temp;
}
}

int main()
{
char a[9] = "abcdefgh";
Rotate1(a,8,3);
}

 

 

 

 

3. 求逆算法

分析:将a[n]看做是向量BC组成,最终的结果需要时CB,过程如下:将BC各分别取逆B^-1C^-1,再对整个式子取逆,得到CB。

 

举例:将abcdefgh中的abc看做向量B,defgh看做向量C。

 

下面是代码实现:


#include<iostream>

using namespace std;

void Revert(char* str,int start,int end)
{
while(start<end)
{
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}

void Rotate1(char* a,int start,int end)
{
Revert(a,0,2);
Revert(a,3,7);
Revert(a,0,7);
}

int main()
{
char a[9] = "abcdefgh";
Rotate1(a,0,7);
}

 

 

思考题:写一个算法实现字符串反转,将abc.sina.com反转为com.sina.abc。

 

分析:使用求逆算法,将abc,sina,com作为子串进行反转,再将整个字符串进行反转

 

作者:Nick Ye(yjf512)
出处:(http://www.cnblogs.com/yjf512/
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

 

参考文档:

编程珠玑(第二版)

时间: 2024-09-17 21:59:51

编程珠玑--旋转算法的相关文章

《编程珠玑(第2版•修订版)》—第2章2.1节三个问题

第2章 啊哈!算法 编程珠玑(第2版•修订版) 研究算法给实际编程的程序员带来许多好处.算法课教给学生完成重要任务的方法和解决新问题的技术.在后续的章节中将会看到,先进的算法工具有时候对软件系统影响很大--减少开发时间,同时使执行速度更快. 算法与其他那些深奥的思想一样重要,但在更一般的编程层面上具有更重要的影响.在<啊哈!灵机一动>一书中(本章的标题就借鉴了它),Martin Gardner①描述了深得我心的一个思想:"看起来很困难的问题也可以有一个简单的.意想不到的答案.&quo

C++实现一维向量旋转算法_C 语言

在<编程珠玑>一书的第二章提到了n元一维向量旋转算法(又称数组循环移位算法)的五种思路,并且比较了它们在时间和空间性能上的区别和优劣.本文将就这一算法做较为深入的分析.具体如下所示: 一.问题描述 将一个n元一维向量向左旋转i个位置.例如,假设n=8,i=3,向量abcdefgh旋转为向量defghabc.简单的代码使用一个n元的中间向量在n步内可完成该工作.你能否仅使用几十个额外字节的内存空间,在正比于n的时间内完成向量的旋转? 二.解决方案 思路一:将向量x中的前i个元素复制到一个临时数组

编程珠玑--粗略估算

粗略估算是<编程珠玑>中第七章提到的内容.   这篇文章将"粗略估算"看做是一项工程技术,是程序员必备的一项技能之一. 本人非常同意这个观点.粗略估算是一种把复杂的事情简单化的能力.我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力.如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间--如果你能拥有这样的能力,该有多么美好啊.所以难怪乎像微软.Google这样的大公司老喜欢出"请计

编程珠玑--位图法排序

题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复.求如何将这n个正整数升序排列. 约束:最多有1MB的内存空间可用,有充足的磁盘存储空间.   分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码.而包含正整数的文件约为10^7个int大小.这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法.因此衍生出下面两种方法:   方法1

《编程珠玑(续)(修订版)》目录—导读

内容提要 编程珠玑(续)(修订版) 本书是计算机科学方面的经典名著<编程珠玑>的姊妹篇,讲述了对于程序员有共性的知识.本书延续了<编程珠玑>的特色,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路.书中涵盖了程序员操纵程序的技术.程序员取舍的技巧.输入和输出设计以及算法示例,这些内容结合成一个有机的整体,如一串串珠玑展示给程序员.本书对各个层次的程序员都具有很高的阅读价值. 版权声明 编程珠

编程珠玑之生成0至n-1之间的k个不同随机序列的扩展问题 --2014人人网笔试题目

  <编程珠玑>中习题1.4的题目是:"如果认真考虑了习题3,你将会面对生成小于n且没有重复的k个整数的问题.最简单的方法就是使用前k个正整数.这个极端的数据集合将不会明显的改变位图方法的运行时间,但是可能会歪曲系统排序的运行时间.如何生成位于0至n - 1之间的k个不同的随机顺序的随机整数?尽量使你的程序简短高效."  解决这个问题可以使用以空间换时间的方式,基本的思想是 利用洗牌的原理,将n个数(0至n-1)按次序排好,依次让每个数和一个随机挑选出的位子进行互换,这样肯

《编程珠玑(第2版•修订版)》—第1章1.1节一次友好的对话

第一部分 基础 编程珠玑(第2版•修订版) 这一部分的5章回顾程序设计的基础知识.第1章介绍一个问题的历史,我们把仔细的问题定义和直接的程序设计技术结合起来,得到优美的解决方案.这一章揭示了本书的中心思想:对实例研究的深入思考不仅很有趣,而且可以获得实际的益处. 第2章讨论3个问题,其中重点强调了如何由算法的融会贯通获得简单而高效的代码.第3章总结数据结构在软件设计中所起到的关键作用. 第4章介绍一个编写正确代码的工具--程序验证.在第9章.第11章和第14章中生成复杂(且快速)的函数时,大量使

《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组

第2章 关联数组编程珠玑(续)(修订版)人类学家说,语言深刻地影响了世界观.一般把这个观察结果称为"Whorf假说"① ,也经常把它总结为"语言塑造了人的思想". 跟大多数程序员一样,我使用的Algol系列的语言塑造了我的计算思维.对于像我这样的程序员来说,PL/1.C和Pascal看起来都很相似,我们不难把这样的代码翻译成COBOL或Fortran的代码.用这些语言能轻易地表达我们旧的.习以为常的思维模式. 另外一些语言则挑战了我们对于计算的看法.我们感到惊奇的是

《编程珠玑(第2版•修订版)》目录—导读

作者简介编程珠玑(第2版•修订版)Jon Bentley 世界著名计算机科学家,被誉为影响算法发展的十位大师之一.他先后任职于卡内基-梅隆大学(1976~1982).贝尔实验室(1982~2001)和Avaya实验室(2001年至今).在卡内基-梅隆大学担任教授期间,他培养了包括Tcl语言设计者John Ousterhout.Java语言设计者James Gosling.<算法导论>作者之一Charles Leiserson在内的许多计算机科学大家.2004年荣获Dr. Dobb's程序设计卓