⑴ 遞歸,快速排序,D&C
遞歸是一種編程技術,其核心是兩個關鍵要素:基線條件與遞歸條件。基線條件是遞歸的終止點,確保遞歸不會無限進行。遞歸條件則是遞歸函數調用自身,持續執行的過程,直至達到基線條件。遞歸的調用棧,類似程序在執行子函數時的臨時存儲空間,用於記錄當前調用位置,便於函數返回後繼續執行。
棧是一種數據結構,與數組和鏈表相似,遵循後進先出原則,如同貼便簽。在遞歸調用中,棧用於管理函數的執行環境,確保每一步的調用和返回都能正確進行。
分而治之(D&C)是一種解決問題的高效策略,它將復雜問題分解為更小、更簡單的子問題,並遞歸地解決這些子問題,最終將結果合並以得到完整解決方案。這一方法在演算法設計中具有廣泛應用。
以快速排序為例,這是一種基於分而治之的排序演算法。快速排序的關鍵步驟包括識別數組的基準元素,分割數組以將小於基準的元素放在左側,大於或等於基準的元素放在右側,然後對這兩部分遞歸應用相同的過程,直至數組有序。
快速排序的基線條件是數組為空或僅包含一個元素,此時無需排序。通過選擇一個基準元素,數組被分割成兩個子數組。不斷遞歸地在這些子數組中應用相同排序過程,直到所有子數組都滿足基線條件,排序完成。
為了直觀理解快速排序的過程,可以使用可視化工具或繪制圖像,展示數組分割和排序的動態過程。例如,初始數組為[33,10,15,7],基準選擇為33。通過比較和交換,將數組分割為[10,15,7]和[]。接著,對子數組[10,15,7]中的10進行類似處理,最終數組變為有序狀態。
編寫快速排序演算法的代碼時,需要特別注意基準元素的選擇、數組分割邏輯以及遞歸終止條件的實現,以確保演算法的效率和正確性。
⑵ 數學次方快速計算方法
數學次方快速計算的方法有:
1. 快速冪演算法:將指數n進行二進制拆分,然後通過不斷平方和乘法的方式進行運算。例如,計算a^11時,可以將11拆分為1011(二進制),則a^11 = a^(2^3) * a^(2^1) * a^(2^0) = a^8 * a^2 *a^1。這樣就可以通過3次乘法和3次平方運算得到a^11,大大提高了計算效率。
2. 矩陣快速冪演算法:將底數a轉化為一個矩陣,然後通過矩陣乘法的方式進行運算。例如,計算a^11時,可以將a轉化為一個2*2的矩陣,然後通過矩陣乘法運算得到a^11對應的矩陣。這樣就可以通過幾次矩陣乘法得到結果,大大提高了計算效率。
3. 循環:對於一些簡單的冪運算,我們可以用一個簡單的循環來計算結果。我們將底數相乘n次。但這種方法對於較大的指數來說效率低下。
4. 遞歸:遞歸方法在實際中可能會導致棧溢出或者計算重復,但思路比較簡單。我們可以將一個大問題化為兩個相同的小問題,遞歸求解小問題。例如:fastPow(x, n) = x * fastPow(x, n / 2) 如果n是偶數;如果n是奇數:fastPow(x, n) = fastPow(x, n / 2) * fastPow(x, n / 2) * x。以上就是一些常見的次方快速計算方法。
⑶ 次方的快速演算法
次方有兩種快速演算法:
第一種是直接用乘法計算,例:3⁴=3×3×3×3=81。
第二種則是用次方階級下的數相乘,例:3⁴=9×9=81
次方最基本的定義是:設a為某數,n為正整數,a的n次方表示為aⁿ,表示n個a連乘所得之結果,如2⁴=2×2×2×2=16。次方的定義還可以擴展到0次方和負數次方等等。
負數次方
由5的0次方繼續除以5就可以得出5的負數次方。
例如: 5的0次方是1 (任何非零數的0次方都等於1。)
5的-1次方是0.2 1÷ 5 =0.2
5的-2次方是0.04 0.2÷5 =0.04
因為5的-1次方是0.2 ,所以5的-2次方也可以表示為0.2×0.2=0.04
5的-3次方則是0.2×0.2×0.2=0.008
由此可見,一個非零數的-n次方=這個數的倒數的n次方。
(3)快速相關演算法擴展閱讀:
0的次方
0的任何正數次方都是0,例:0⁵=0×0×0×0×0=0
0的0次方無意義。
一個數的0次方
任何非零數的0次方都等於1。原因如下:
通常代表3次方
5的3次方是125,即5×5×5=125
5的2次方是25,即5×5=25
5的1次方是5,即5×1=5
由此可見,n≧0時,將5的(n+1)次方變為5的n次方需除以一個5,所以可定義5的0次方為:
5 ÷ 5 = 1。
⑷ 澶у﹀叚縐嶇▼搴忓憳瀹炵敤綆楁硶鎺ㄨ崘
紼嬪簭鍛樺疄鐢ㄧ畻娉曟湁鐢ㄦ帹鑽
綆楁硶涓: 蹇閫熸帓搴忕畻娉
蹇閫熸帓搴忔槸鐢變笢灝悸烽湇灝旀墍鍙戝睍鐨勪竴縐嶆帓搴忕畻娉曘傚湪騫沖潎鐘跺喌涓嬶紝鎺掑簭 n 涓欏圭洰瑕丱(nlog n)嬈℃瘮杈冦傚湪鏈鍧忕姸鍐典笅鍒欓渶瑕丱(n2)嬈℃瘮杈冿紝浣嗚繖縐嶇姸鍐靛苟涓嶅父瑙併備簨瀹炰笂錛屽揩閫熸帓搴忛氬父鏄庢樉姣斿叾浠朞(n log n) 綆楁硶鏇村揩錛屽洜涓哄畠鐨勫唴閮ㄥ驚鐜 (inner loop)鍙浠ュ湪澶ч儴鍒嗙殑鏋舵瀯涓婂緢鏈夋晥鐜囧湴琚瀹炵幇鍑烘潵銆
蹇閫熸帓搴忎嬌鐢ㄥ垎娌繪硶絳栫暐鏉ユ妸涓涓涓茶(list)鍒嗕負涓や釜瀛愪覆琛(sub-lists)銆
綆楁硶浜: 鍫嗘帓搴忕畻娉
鍫嗘帓搴(Heapsort)鏄鎸囧埄鐢ㄥ爢榪欑嶆暟鎹緇撴瀯鎵璁捐$殑涓縐嶆帓搴忕畻娉曘傚爢縐鏄涓涓榪戜技瀹屽叏浜屽弶鏍戠殑緇撴瀯錛屽苟鍚屾椂婊¤凍鍫嗙Н鐨勬ц川:鍗沖瓙緇撶偣鐨勯敭鍊兼垨緔㈠紩鎬繪槸灝忎簬(鎴栬呭ぇ浜)瀹冪殑鐖惰妭鐐廣
鍫嗘帓搴忕殑騫沖潎鏃墮棿澶嶆潅搴︿負O(nlogn)
綆楁硶涓: 褰掑苟鎺掑簭
褰掑苟鎺掑簭(Merge sort錛屽彴婀捐瘧浣:鍚堝苟鎺掑簭)鏄寤虹珛鍦ㄥ綊婢′綔涓婄殑涓縐嶆湁鏁堢殑鎺掑簭綆楁硶銆傝ョ畻娉曟槸閲囩敤鍒嗘不娉(Divide andConquer)鐨勪竴涓闈炲父鍏稿瀷鐨勫簲鐢ㄣ
綆楁硶鍥:浜屽垎鏌ユ壘綆楁硶
浜屽垎鏌ユ壘綆楁硶鏄涓縐嶅湪鏈夊簭鏁扮粍涓鏌ユ壘鏌愪竴鐗瑰畾鍏冪礌鐨勬悳緔㈢畻娉曘傛悳緔犺繃紼嬩粠鏁扮粍鐨勪腑闂村厓緔犲紑濮嬶紝濡傛灉涓闂村厓緔犳eソ鏄瑕佹煡鎵劇殑鍏冪礌錛屽垯鎼滅礌榪囩▼緇撴潫:濡傛灉鏌愪竴鐗 瀹氬厓緔犲ぇ騫叉垨鑰呭皬騫蹭腑闂村厓緔狅紝鍒欏湪鏁扮粍澶т簬鎴栧皬騫蹭腑闂村厓緔犵殑閭d竴鍗婁腑鏌ユ壘錛岃屼笖璺熷紑濮嬩竴鏍蜂粠涓闂村厓緔犲紑濮嬫瘮杈冦傚傛灉鍦ㄦ煇涓姝ラゆ暟緇勪負絀猴紝鍒欎唬琛ㄦ壘涓嶅埌銆傝繖 縐嶆悳緔㈢畻娉曟瘡涓嬈℃瘮杈冮兘浣挎悳緔㈣寖鍥寸緝灝忎竴鍗娿傛姌鍗婃悳緔㈡瘡嬈℃妸鎼滅儲鍖哄煙鍑忓皯涓鍗婏紝鏃墮棿澶嶆潅搴︿負O(logn) 銆
綆楁硶浜: BFPRT(綰挎ф煡鎵劇畻娉)
BFPRT綆楁硶瑙e喅鐨勯棶棰樺嶮鍒嗙粡鍏革紝鍗充粠鏌恘涓鍏冪礌鐨勫簭鍒椾腑閫夊嚭絎琸澶(絎琸灝)鐨勫厓緔狅紝閫氳繃宸у欑殑鍒嗘瀽錛孊FPRT鍙浠ヤ繚璇佸湪鏈鍧忔儏鍐典笅浠嶄負綰挎ф椂闂村嶆潅搴︺傝ョ畻 娉曠殑鎬濇兂涓庡揩閫熸帓搴忔濇兂鐩鎬技錛屽綋鐒訛紝涓轟嬌寰楃畻娉曞湪鏈鍧忔儏鍐典笅錛屼緷鐒惰兘杈懼埌o(n)鐨勬椂闂村嶆潅搴︼紝浜斾綅綆楁硶浣滆呭仛浜嗙簿濡欑殑澶勭悊銆
綆楁硶鍏: BFS(騫垮害浼樺厛鎼滅儲)
騫垮害浼樺厛鎼滅儲綆楁硶(Breadth-First-Search)錛屾槸涓縐嶅浘褰㈡悳緔㈢畻娉曘傜畝鍗曠殑璇碆FS鏄浠庢牴鑺傜偣寮濮嬶紝媧葷潃鏍(鍥)鐨勫藉害閬嶅巻鏍(鍥)鐨勮妭鐐廣傚傛灉鎵鏈夎妭鐐瑰潎琚璁塊棶錛屽垯綆楁硶涓姝銆侭FS鍚屾牱灞炰簬鐩茬洰鎼滅儲銆備竴鑸鐢ㄩ槦鍒楁暟鎹緇撴瀯鏉ヨ緟鍔╁疄鐜癇FS綆楁硶銆