zoukankan      html  css  js  c++  java
  • 编程珠玑旋转算法

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

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

    题目:将一个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/
    版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

    参考文档:

    编程珠玑(第二版)

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    [OS] 信号量(Semaphore)
    [OS] 进程互斥
    [剑指Offer] 52.正则表达式匹配
    [剑指Offer] 51.构建乘积数组
    [剑指Offer] 50.数组中重复的数字
    [剑指Offer] 49.把字符串转换成整数
    [剑指Offer] 48.不用加减乘除做加法
    [剑指Offer] 47.求1+2+3+...+n
    PHP知识库图谱汇总(完善中)
    修改thinkphp路由模式,去掉Home
  • 原文地址:https://www.cnblogs.com/yjf512/p/1878146.html
Copyright © 2011-2022 走看看