iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

前言

今天的主題是一個演算法的設計方式和思維,因此不會提供具體的例題或實作細節,只會探討以這種設計方式所開發的演算法,以幫助大家理解

概念

分治又稱為「各個擊破法」,是將一個大問題分解成許多小問題,分別解決這些小問題,然後將它們的解合併以得到原問題的解。雖然這種思考方式有些像遞迴,因為都涉及將大問題分解成小問題,但分治還包括合併這些小問題的解的步驟。

實作邏輯

之所以稱為「divide & conquer」,是因為實作上,它將整個問題分割成小問題,但在分割之前必須確保所有小問題的性質相同,這就是「divide」。接下來,以遞迴方式解決每個小問題,也就是「conquer」。最後,將每個部分的解合併,通常稱為「combine」,這樣就可以獲得原問題的解答。

實作範例

許多演算法都是基於分治設計的,例如合併排序(merge sort)、快速排序(quick sort)、二分搜尋(binary search),以及解決最大子數列和問題(Maximum Subarray Sum)、快速傅立葉轉換(FFT)、河內塔等。這些都是基於分治的演算法或問題

如何確定有無辦法透過分治解決問題

  • 是否能夠將大問題分解成多個性質相同的子問題
  • 子問題是否可以合併以獲得答案
  • 使用分治是否能夠提高效能,而不會使問題變得更複雜

總結

本文介紹了分治的基本概念和設計思想,並強調分治的關鍵步驟:分解、解決和合併。除此之外,也提供一些基於分治的經典演算法範例。最後,指出確定是否適用分治解決問題的重要因素。希望這篇文章能夠幫助大家更深入理解分治。

預告

這次的主題不提供相關題目練習,因為通常與其他演算法題目相關聯,如果想更深入了解,建議多練習其他相關的題目。


上一篇
Day-20 廣度優先搜尋例題講解
下一篇
Day22 - 貪心(greedy)
系列文
從競賽程式學習資料結構與演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言