程式設計珠璣 旋轉交換技巧

2021-09-06 05:43:58 字數 840 閱讀 1647

1.問題描述

將乙個n元一維向量向左旋轉i個位置。例如,當n=8且i=3時,向量abcdefgh旋轉為defghabc。簡單的**使用乙個n元的中間向量在n步就能夠完成該工作,你能否僅使用數十個額外位元組的儲存空間,正比於n的時間內完成向量旋轉?

2.解決思路

旋轉向量x其實就是交換向量ab的兩段,得到向量ba。這裡a代表x中的前i個元素。假設a比b短,將b分為bl和br,使得br具有與a相同的長度。交換a和br,也就是將ablbr 。序列a此時已處於其最終的位置,因此現在就集中到交換b的兩部分。由於新問題與原來的問題具有相同的形式,我們可以遞迴地解決之。

程式設計珠璣提供了更簡單使用的方法,我們將問題看做是把陣列ab轉換成ba,同時假定我們擁有乙個函式可以將陣列中特定部分的元素求逆。從ab開始,首先對a求逆,得到arb,然後對b求逆,得到arbr。最後整體求逆,得到(arbr)r。此時恰好是ba。

doug mcllroy給出了乙個十元陣列向上旋轉5個位置的翻手例子,初始時掌心對著我們的臉,左手在右手上面。

翻轉**在時間和空間上都很高效,而且**非常簡潔,很難出錯

3.**實現

int

a[max];

void swap(int *p, int *q)

void reverse(int i, int

j)

} void revrot(int s, int

n)

程式設計珠璣 旋轉字串

問題描述 請將乙個具有n個元素的一維向量向左旋轉i個位置。例如,假設n 8,i 3,那麼向量abcdefgh旋轉之後得到向量defghabc。簡單編碼使用乙個具有n個元素的中間向量分n步即可完成此作業。你可以僅使用幾十位元組的微小記憶體,花費與n成比例的時間來旋轉該向量嗎?解決思路 方案一 將向量x...

程式設計珠璣 續(程式設計珠璣 修訂版)

經久不衰的電腦科學名著 集深邃思想 實戰技術與趣味軼事於一冊 領略電腦科學之美 程式設計珠璣 續 作譯者介紹 譯者 錢麗豔 劉田叢書名 圖靈程式設計叢書 出版社 人民郵電出版社 isbn 9787115251510出版日期 2011 年5月 程式設計珠璣 續 是電腦科學方面的經典名著 程式設計珠璣 ...

程式設計珠璣 心得

第一部分 基礎 第1章 開篇 1.1 一次友好的對話 1.2 準確的問題描述 1.3 程式設計 1.4 實現概要 1.5 原理 1.6 習題 1.7 深入閱讀 第2章 啊哈!演算法 2.1 三個問題 2.2 無處不在的二分搜尋 2.3 基本操作的威力 2.4 排序 2.5 原理 2.6 習題 2.7...