分治演算法的學習筆記

2021-08-26 15:30:25 字數 1322 閱讀 8495

分治演算法應用一:漢諾塔問題

問題描述:

漢諾塔問題**於乙個古老的傳說,世界剛被建立的時候,有一座鑽石寶塔,上面有64個金碟,所有碟子按照從大到小的順序從塔底堆到塔頂,從世界創世開始,牧師們一直在努力將塔a的碟子借助b移到c上,每次只能移動乙個,而且不能讓小的放在大的下面

原理:對漢諾塔問題的求解簡化為以下步驟

將塔a上n-1個盤子借助塔c先移到塔b上

將塔a剩下的乙個盤子移到塔c上

將n-1個碟子從b借助a移動到塔c上

**描述:

void han(int n,char a,char b,char c)

}分治演算法應用二:排序問題

問題描述:給出一系列的隨機數並對其按照從大到小或者從小到大的順序進行排列

二分排序是指利用二分法的思想對插入排序進行改進的一種插入排序演算法,不同於二叉排序,可以利用陣列的

特點快速定位指定索引的元素。

一組資料中的第乙個與其他所有資料比較將整個資料分為兩個部分,左邊的小於這個數右邊的大於這個數。再分別對這兩部分進行快速排序,遞迴進行直到排序完成。

int binarysearch(int *arr,int len,int num)//二分法查詢  

return -1;  }

void partition(int *a,int low, int high)//快速排序法進行排序  

int first=low;  

int last=high;  

int key=a[first];  

while(first  a[first]=a[last];  

}  a[first]=key;  

partition(a,low,first-1);  

partition(a,first+1,high);  

}  分治演算法應用偽幣問題

給你乙個裝有1 6個硬幣的袋子。1 6個硬幣中有乙個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。

void maxmin2(int a,int i,int j,int *max,int *min)

if (j-1==i)

mid=(i+j)/2;

求i~mid之間的最大最小值分別為max1,min1;

求mid+1~j之間的最大最小值分別為max2,min2;

比較max1和max2,大的就是最大值;

比較min1和min2,小的就是最小值; }

分治演算法筆記

區間查詢 三個重要函式 find lower bound upper bound 區間二分重要模型 最大子段和二分後,尋找左區間 右區間和橫跨mid三種情況的最大值 一維最近點對 拓展 二維最近點對 分治找最大值 快速冪從來不用分治寫,但是老師在這裡講了 拓展 高精度,矩陣快速冪 歸併排序 拓展 求...

學習筆記 樹分治

樹分治用於解決有關路徑的問題。樹分治分為點分治和邊分治 其實還有一種叫 鏈分治 是樹的路徑剖分思想的更高階的體現,一般鏈分治的題目都可以用路徑剖分解決 點分治就是每次找到重心,然後把重心去掉,對分成的每兩棵樹之間分別統計路徑資訊 以重心的每個相鄰點為根,遍歷整棵子樹即可得到這個根到每個結點的統計資訊...

學習筆記 CDQ分治

分治,考慮前一半對後一半的影響。和一般分治不太相同的思想是,一般分治不分誰對誰的影響,跨mid的都要統計。全域性變數統計 而cdq貌似要落腳到前一半對後一半的影響上,也就是貢獻在後一半統計,由前一半產生。大概使用情況 1.三維偏序 2.優化dp 3.這個裡面有。注意處理三維情況的巧妙性。heoi20...