亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現一維向量旋轉算法

2020-01-26 15:24:43
字體:
來源:轉載
供稿:網友

在《編程珠璣》一書的第二章提到了n元一維向量旋轉算法(又稱數組循環移位算法)的五種思路,并且比較了它們在時間和空間性能上的區別和優劣。本文將就這一算法做較為深入的分析。具體如下所示:

一、問題描述

將一個n元一維向量向左旋轉i個位置。例如,假設n=8,i=3,向量abcdefgh旋轉為向量defghabc。簡單的代碼使用一個n元的中間向量在n步內可完成該工作。你能否僅使用幾十個額外字節的內存空間,在正比于n的時間內完成向量的旋轉?

二、解決方案

思路一:將向量x中的前i個元素復制到一個臨時數組中,接著將余下的n-i個元素左移i個位置,然后再將前i個元素從臨時數組中復制到x中余下的位置。

性能:這種方法使用了i個額外的位置,如果i很大則產生了過大的存儲空間的消耗。

C++代碼實現如下:

/*************************************************************************   > File Name: vector_rotate.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<string> using namespace std;  int main() {   string s = "abcdefghijklmn";   cout << "The origin is: " << s << endl;   // 左移個數   int i;   cin >> i;   if(i > s.size())   {     i = i%s.size();   }   // 將前i個元素臨時保存   string tmp(s, 0, i);   // 將剩余的左移i個位置   for(int  j=i; j<s.size(); ++j)   {     s[j-i] = s[j];   }   s = s.substr(0, s.size()-i) + tmp;   cout << "The result is: "<< s << endl;   return 0; } 

思路二:定義一個函數將x向左旋轉一個位置(其時間正比于n),然后調用該函數i次。

性能:這種方法雖然空間復雜度為O(1),但產生了過多的運行時間消耗。

C++代碼實現如下:

/*************************************************************************   > File Name: vector_rotate_1.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<string> using namespace std;  void rotateOnce(string &s) {   char tmp = s[0];   int i;   for(i=1; i<s.size(); ++i)   {     s[i-1] = s[i];   }   s[i-1] = tmp; }  int main() {   string s = "abcdefghijklmn";   cout << "The origin is: " << s << endl;   // 左移個數   int i;   cin >> i;   if(i > s.size())   {     i = i%s.size();   }   // 調用函數i次   while(i--)   {     rotateOnce(s);   }   cout << "The result is: "<< s << endl;   return 0; } 


思路三:移動x[0]到臨時變量t中,然后移動x[i]到x[0]中,x[2i]到x[i],依次類推,直到我們又回到x[0]的位置提取元素,此時改為從臨時變量t中提取元素,然后結束該過程(當下標大于n時對n取模或者減去n)。如果該過程沒有移動全部的元素,就從x[1]開始再次進行移動,總共移動i和n的最大公約數次。

性能:這種方法非常精巧,像書中所說的一樣堪稱巧妙的雜技表演??臻g復雜度為O(1),時間復雜度為線性時間,滿足問題的性能要求,但還不是最佳。

C++代碼實現如下:

/*************************************************************************   > File Name: vector_rotate_2.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<string> using namespace std;  // 歐幾里德(輾轉相除)算法求最大公約數 int gcd(int i, int j) {   while(1)   {     if(i > j)     {       i = i%j;       if(i == 0)       {         return j;       }     }     if(j > i)     {       j = j%i;       if(j == 0)       {         return i;       }     }   } }  int main() {   string s = "abcdefghijklmn";   cout << "The origin is: "<< s << endl;   // 左移個數   int i;   cin >> i;   if(i > s.size())   {     i = i%s.size();   }   // 移動   char tmp;   int times = gcd(s.size(), i);   for(int j=0; j<times; ++j)   {     tmp = s[j];     int pre = j; // 記錄上一次的位置     while(1)     {       int t = pre+i;       if(t >= s.size())         t = t-s.size();       if(t == j) // 直到tmp原來的位置j為止         break;       s[pre] = s[t];       pre = t;     }     s[pre] = tmp;   }   cout << "The result is: "<< s << endl;   return 0; } 

思路四:旋轉向量x實際上就是交換向量ab的兩段,得到向量ba,這里a代表x的前i個元素。假設a比b短。將b分割成bl和br,使br的長度和a的長度一樣。交換a和br,將ablbr轉換成brbla。因為序列a已在它的最終位置了,所以我們可以集中精力交換b的兩個部分了。由于這個新問題和原先的問題是一樣的,所以我們以遞歸的方式進行解決。這種方法可以得到優雅的程序,但是需要巧妙的代碼,并且要進行一些思考才能看出它的效率足夠高。

//實現代碼(略) 

思路五:(最佳)將這個問題看做是把數組ab轉換成ba,同時假定我們擁有一個函數可以將數組中特定部分的元素逆序。從ab開始,首先對a求逆,得到arb,然后對b求逆,得到arbr。最后整體求逆,得到(arbr)r,也就是ba。

reverse(0, i-1)  /*cbadefgh*/reverse(i, n-1) /*cbahgfed*/reverse(0, n-1) /*defghabc*/

性能:求逆序的方法在時間和空間上都很高效,而且代碼非常簡短,很難出錯。

C++代碼實現如下:

/*************************************************************************   > File Name: vector_rotate.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<string> using namespace std;  void reverse(string &s, int begin, int end) {   while(begin < end)   {     char tmp = s[begin];     s[begin] = s[end];     s[end] = tmp;     ++begin;     --end;   } }  int main() {   string s = "abcdefghijklmn";   cout << "The origin is: "<< s << endl;      int i;   cin >> i;   if(i > s.size())   {     i = i%s.size();   }    reverse(s, 0, i-1);   reverse(s, i, s.size()-1);   reverse(s, 0, s.size()-1);    cout << "The result is: "<< s << endl;   return 0; } 

三、擴展延伸

如何將向量abc旋轉變成cba?

和前面的問題類似,此向量旋轉對應著非相鄰內存塊的交換模型。解法很相似,即利用恒等式:cba = (arbrcr)r

注意:在面試或筆試時,如若出現向量旋轉(內存塊交換)問題,建議最好使用思路五答題,不僅高效而且簡潔

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线观看你懂的| 精品久久久久久久久久国产| 色偷偷噜噜噜亚洲男人| 欧美日韩视频免费播放| 98精品国产自产在线观看| 2019中文字幕全在线观看| 91精品视频专区| 亚洲a∨日韩av高清在线观看| 亚洲欧洲日本专区| 深夜福利日韩在线看| 国外视频精品毛片| 精品动漫一区二区| 国产香蕉97碰碰久久人人| 精品视频在线播放| 中文字幕av一区中文字幕天堂| 亚洲性线免费观看视频成熟| 国产欧美日韩高清| 久久99久久久久久久噜噜| 美乳少妇欧美精品| 伊人成人开心激情综合网| 日韩综合视频在线观看| 亚洲激情在线观看视频免费| 国产激情视频一区| 国产精品久久久一区| 丝袜一区二区三区| 精品久久久国产精品999| 久久亚洲精品小早川怜子66| 一区二区三区精品99久久| 精品美女永久免费视频| 国产精品国内视频| 日韩激情av在线免费观看| 午夜精品理论片| 欧美激情按摩在线| 欧美在线视频网站| 亚洲欧美自拍一区| 成人黄色免费网站在线观看| 日韩中文字幕网| 久久99久久久久久久噜噜| 日韩亚洲国产中文字幕| 美女久久久久久久| 亚洲理论在线a中文字幕| 色无极影院亚洲| 国产视频精品一区二区三区| 第一福利永久视频精品| 一区二区亚洲精品国产| 欧美一级大片在线免费观看| 久久久久久久999| 成人性生交大片免费看小说| 亚洲欧美精品伊人久久| 一区二区三区无码高清视频| 日韩www在线| 69精品小视频| 欧美黄网免费在线观看| 日韩美女在线播放| 亚洲精品国产综合区久久久久久久| 国产精品视频久久久| 一区二区成人精品| 久久精品99久久香蕉国产色戒| 欧美另类在线播放| 欧美在线视频观看| 亚洲欧美日韩精品久久亚洲区| 97热在线精品视频在线观看| 国产丝袜一区视频在线观看| 日韩av第一页| 精品亚洲永久免费精品| 欧美日韩精品中文字幕| 欧美激情精品久久久久久免费印度| 日韩久久精品成人| 久久精品中文字幕电影| 久久国产精彩视频| 亚洲电影免费观看高清完整版| 日韩成人在线视频网站| 欧美激情videos| 亚洲跨种族黑人xxx| 韩国三级电影久久久久久| 欧美精品在线极品| 欧美日韩精品二区| 久久久精品日本| 久久亚洲精品一区二区| 欧美精品aaa| 伊人久久五月天| 亚洲专区在线视频| 亚洲a区在线视频| 国产在线一区二区三区| 欧美性猛交xxxx乱大交| 日韩高清av一区二区三区| 精品久久久久久中文字幕| 国产精品人成电影在线观看| 国产日韩在线亚洲字幕中文| 欧美影院久久久| 久久亚洲精品成人| 久久欧美在线电影| 98视频在线噜噜噜国产| 久久成人精品一区二区三区| 日韩欧美在线播放| 国产精品美女免费| 欧美香蕉大胸在线视频观看| 精品国产视频在线| 日韩毛片在线看| 日韩欧美aaa| 亚洲老司机av| 成人啪啪免费看| 91美女片黄在线观| 久久久精品国产| 欧美在线性爱视频| 亚洲视频欧美视频| 精品国偷自产在线视频| 91天堂在线观看| 人人爽久久涩噜噜噜网站| 午夜欧美不卡精品aaaaa| 国产精品人成电影| 久久精品国亚洲| 成人久久18免费网站图片| 精品欧美国产一区二区三区| 日韩亚洲成人av在线| 亚洲精品欧美一区二区三区| 久久久久久这里只有精品| 亚洲精品福利在线观看| 色妞欧美日韩在线| 国产精品高潮呻吟视频| 国产精品夫妻激情| 久久久久久久国产精品视频| 麻豆乱码国产一区二区三区| 国内精品小视频在线观看| 国产ts人妖一区二区三区| 一区国产精品视频| 91国产精品91| 亚洲欧美精品一区| 久久精品亚洲精品| 一本久久综合亚洲鲁鲁| 国产视频在线一区二区| 亚洲高清在线观看| 亚洲精品电影久久久| 亚洲国产精彩中文乱码av在线播放| 国语对白做受69| 亚洲色图第三页| 最近2019中文字幕第三页视频| 国产精品国模在线| 欧美一区亚洲一区| 欧美性感美女h网站在线观看免费| 中文日韩在线观看| 欧美午夜精品在线| 麻豆乱码国产一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 欧美成人精品一区二区三区| 欧美日韩一二三四五区| 日韩中文字幕在线精品| 亚洲天堂日韩电影| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲日韩第一页| 精品国产91乱高清在线观看| 欧美一区二区影院| 中文一区二区视频| 亚洲天堂色网站| 午夜精品蜜臀一区二区三区免费| 91久久精品视频| 国产精品久久久久久久9999| 777国产偷窥盗摄精品视频| 国产精品毛片a∨一区二区三区|国| 中文字幕日韩欧美在线视频| 久久久噜噜噜久久中文字免| 精品一区电影国产| 亚洲欧美制服综合另类| 欧美一级片一区|