C++ 算法競賽寶典2019.7.2

第一章:分治算法——分而治之

? 把一個復雜的問題分成2個或多個相似或相同的子問題,再把子問題分成更多的小的子問題......直到最后小問題可以簡單的求解冕碟,原問題的解即子問題的解的合并拦惋。基于這個原理的高效算法有:快速鸣哀,歸并排序架忌,傅立葉變換。

? 比如:你要折斷一個木頭這個木頭由10個小木頭組成我衬,那么你會怎么做叹放? 答:分成5個,再分成1個? ?

? ? ? ? ? ? (8+9)*6=挠羔? 運算步驟



? 折半查找法

? 問題1:在一排(10000以內(nèi))已按編號大小排好序的圖書中井仰,快速按編號查找到某本書所在的位置(數(shù)組2,4破加,6)

? ? ? ? ? ? ? 輸入格式:輸入要查找的數(shù)

? ? ? ? ? ? ? 輸出格式:一個數(shù)俱恶,否則輸出-1

? ? ? ? ? ? 輸入樣例: 4

? ? ? ? ? ? 輸出樣例:1

? 作業(yè)1:在數(shù)組 (15,24范舀,33合是,42,65锭环,71)

? ? ? ? ? ? 輸入樣例:33

? ? ? ? ? ? 輸出樣例:2



? 遞歸二分法原理

? a[]——> 1 2 3 4 5

? ? X? ? ? ? ? I? ? K? ? J

? J>I? ? X與a[k]有三種情況

? ? 1. x=a[k] 已經(jīng)發(fā)現(xiàn)聪全,退出查找

? ? 2.x<a[k]? 在前半部分查找,i不變辅辩,j=> k-1

? ? 3.x>a[k]? 在后半部分查找难礼,j不變,i=> k+1


代碼:

#include<iostream>

#include<assert.h>

using namespace std;

int Search(int ar[], int low, int high, int key)

{

? ? if(low > high)//查找不到

? ? ? ? return -1;

? ? int mid = (low+high)/2;

? ? if(key == ar[mid])//查找到

? ? ? ? return mid;

? ? else if(key < ar[mid])

? ? ? ? return Search(ar,low,mid-1,key);

? ? else

? ? ? ? return Search(ar,mid+1,high,key);

}

int main()

{

? ? int ar[3] = {2玫锋,4蛾茉,6};

? ? int n = sizeof(ar)/sizeof(int);

? ? int key;

? ? cout<<"請輸入要查找的key值:>";

? ? cin>>key;

? ? cout<<"pos :> "<<Search(ar,0,n-1,key)<<endl;

}


2019.07.03? C++ 算法第二天

?

圖片發(fā)自簡書App

第二部分? 算法

? 遞歸算法:

? ? ? ? 遞歸函數(shù)即自調(diào)用函數(shù),在函數(shù)內(nèi)部直接的或者間接地調(diào)用自己撩鹿。在求解某些具有隨意性的復雜問題時經(jīng)常使用遞歸谦炬,如要求編寫一個函數(shù),將輸入的任意長度的字符串反向輸出节沦。普通做法是將字符串放入數(shù)組中然后將數(shù)組元素反向輸出即可吧寺,然而這里的要求是輸入是任意長度的窜管,總不能開辟一個很大的空間保存字符串吧?這時候遞歸就起作用了稚机。遞歸采用了分治的思想,將整體分割成部分获搏,從最小的基本部分入手赖条,逐一解決,其中部分通常和整體具有相同的結(jié)構(gòu)常熙,這樣部分可以繼續(xù)分割纬乍,直到最后分割成基本部分。

遞歸函數(shù)必須定義一個終止條件裸卫,即什么情況下終止遞歸仿贬,終止繼續(xù)調(diào)用自己,如果沒有終止條件墓贿,那么函數(shù)將一直調(diào)用自己茧泪,知道程序棧耗盡,這時候等于是寫了一個Bug!

總結(jié)遞歸的特點:

(1) 使用遞歸時聋袋,一定要有明確的終止條件队伟!

(2) 遞歸算法解題通常代碼比較簡潔,但不是很容易讀懂幽勒。

(3) 遞歸的調(diào)用需要建立大量的函數(shù)的副本嗜侮,尤其是函數(shù)的參數(shù),每一層遞歸調(diào)用時參數(shù)都是單獨的占據(jù)內(nèi)存空間啥容,他們的地址是不同的锈颗,因此遞歸會消耗大量的時間和內(nèi)存。而非遞歸函數(shù)雖然效率高咪惠,但相對比較難編程击吱。

(4) 遞歸函數(shù)分為調(diào)用和回退階段,遞歸的回退順序是它調(diào)用順序的逆序硝逢。



1.例子:一個人趕著鴨子去每個村莊賣姨拥,每經(jīng)過一個村子賣去所趕鴨子的一半又一只。這樣他經(jīng)過了七個村子后還剩兩只鴨子渠鸽,問他出發(fā)時總共趕了多少只鴨子叫乌?經(jīng)過每個村子賣出多少只鴨子?

題目分析:經(jīng)過7個村子后他還剩2只鴨子徽缚,而每經(jīng)過一個村子賣出所趕鴨子的一半多一只憨奸,所以在經(jīng)過第七個村子前他所趕的鴨子數(shù)為(2+1)*2=6只,經(jīng)過第7個村子時賣出6/2+1=4只凿试。設經(jīng)過7個村子之后排宰,即在經(jīng)過第8個村子之前似芝,village=7,duck=2,即f(7)=2。f(6)=(f(7)+1)*2板甘,賣出f(6)/2+1只党瓮。以此類推,可得出他出發(fā)時的鴨子數(shù)以及經(jīng)過每個村子賣出鴨子數(shù)盐类。

算法分析:

數(shù)學公式

圖片發(fā)自簡書App

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f(x)表示經(jīng)過x村子后剩余的鴨子數(shù)寞奸,出發(fā)前的總數(shù)count=((f(1)+1)*2)。

算法實現(xiàn):

for? (village = 0; village<7; village++)//經(jīng)過7個村莊

count = (duck + 1) * 2;//每經(jīng)過一個村莊之前剩余的鴨子數(shù)量

duck = count;//將值傳給dcuck,獲得最終鴨子數(shù)在跳,實現(xiàn)遞歸

當village=7時是遞歸出口

完整代碼:


#include<iostream>

using namespace std;

int main()

{

int village;//村莊

int duck = 2;//經(jīng)過7個村子之后的鴨子剩余數(shù)

int count = 0;//鴨子總數(shù)

cout << "經(jīng)過第7個村莊后枪萄,鴨子剩余" << duck << "只" << endl;

for (village = 0; village<7; village++)//經(jīng)過7個村莊

{

count = (duck + 1) * 2;//每經(jīng)過一個村莊之前剩余的鴨子數(shù)量

duck = count;//將值傳給duck,獲得最終鴨子數(shù),實現(xiàn)遞歸

/*剩余的鴨子數(shù)+1才是賣出之前總鴨子數(shù)的一半猫妙,例如:

經(jīng)過第7個村莊后剩余2只鴨子瓷翻,那么經(jīng)過第7個村莊之前的總鴨子數(shù)為:duck=(2+1)*2

在第7個村莊賣出count/2+1只鴨子,剩余duck-((count+1)/2+1)只

*/

cout << "經(jīng)過第" << 7 - village << "個村莊時賣出" << (count + 1) / 2 + 1 << "只割坠,"

<< "剩余" << duck - ((count + 1) / 2 + 1) << "只" << endl;

}

cout << "出發(fā)前的鴨子總數(shù)為" << count << "只" << endl;

//返回鴨子總數(shù)

return count;

}





? ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐帚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韭脊,更是在濱河造成了極大的恐慌童谒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沪羔,死亡現(xiàn)場離奇詭異饥伊,居然都是意外死亡,警方通過查閱死者的電腦和手機蔫饰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門琅豆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篓吁,你說我怎么就攤上這事茫因。” “怎么了杖剪?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵冻押,是天一觀的道長。 經(jīng)常有香客問我盛嘿,道長洛巢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任次兆,我火速辦了婚禮稿茉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己漓库,他們只是感情好恃慧,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渺蒿,像睡著了一般痢士。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘸嘶,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天良瞧,我揣著相機與錄音,去河邊找鬼训唱。 笑死,一個胖子當著我的面吹牛挚冤,可吹牛的內(nèi)容都是我干的况增。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼训挡,長吁一口氣:“原來是場噩夢啊……” “哼澳骤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澜薄,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤为肮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肤京,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颊艳,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年忘分,在試婚紗的時候發(fā)現(xiàn)自己被綠了棋枕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妒峦,死狀恐怖重斑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肯骇,我是刑警寧澤窥浪,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站笛丙,受9級特大地震影響漾脂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜若债,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一符相、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦啊终、人聲如沸镜豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟脂。三九已至,卻和暖如春例衍,著一層夾襖步出監(jiān)牢的瞬間昔期,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工佛玄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硼一,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓梦抢,卻偏偏與公主長得像般贼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奥吩,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 二分查找法哼蛆,很經(jīng)典的折半查找算法,想當然覺得很簡單霞赫,算法效率log(2)N腮介。今天跟它干上了,呵呵端衰。真是實踐出真知叠洗,...
    David_IT閱讀 1,802評論 0 0
  • // 順序查找 int SequentialSearch(vector & v, int k) { for (in...
    劉帆_d384閱讀 550評論 0 0
  • 1、 對以下一組數(shù)據(jù)進行降序排序(冒泡排序)靴迫√栉叮“24,80玉锌,35名挥,8,9主守,54禀倔,76,45参淫,5救湖,63” int ...
    面條168閱讀 663評論 0 3
  • 社會可能有很多階層,但你卻是你自己的主人涎才。如同漂浮在星空的旅行者鞋既,隨手采擷的的便是無盡的璀璨珍寶力九。無需慌張。在知識...
    心之界閱讀 174評論 0 0
  • 2019.3.7 感恩上師蓮師三寶慈悲加持和護佑邑闺,一切吉祥跌前! 感恩淘寶購物平臺給大家生活提供方便! 感恩女兒自覺的...
    鵲曾閱讀 83評論 0 0