演算法
通常實作題的3、4題都會運用到資料結構或者是演算法,而且通常不會只是運用到單一的資料結構或演算法,所以,看到題目的時候,可以先盤點一下學過的方法,看有沒有適合的解決方法。
重要演算法
這裡介紹貪婪法則、分治法及動態規劃,簡單的說,貪婪法則就是先看局部(眼前)的解答,從局部解答開始一步一步找,會找到整體最佳解。分治法跟貪婪法則有點像,也是將問題分解成小問題,只是,局部最佳解的組合不一定是整體最佳解,從合併過程中去尋找整體最佳解。動態規劃是基於分治法,只是透過記憶過去算過的答案,節省重複計算的時間。
- 貪婪法則 (greedy method)
- 【筆記】Greedy 貪心法則
- 貪婪(Greedy)演算法 (黃建庭老師)
- 會稱為貪婪法則,就是因為只注意局部(眼前)的最佳解,可能看不到整體最佳解,所以,只適用於,局部(眼前)最佳解的組合會是整體最佳解的問題
- 前提
- 之前所選擇的解答不會影響後面所選擇的解答
- 不斷的選擇局部的最佳解,全部選取結束後就獲得整體的最佳解
- Step1)定義貪婪準則
- Step2)不斷重複貪婪準則,直到解決問題為止
- 不斷的使用貪婪準則,,找出每個小問題的最佳解,直到解決問題為止。
- 當我們要將所有撲克牌排順序時,要怎麼排?
- 從尋找最小值(梅花1)開始嗎?
- 以撲克牌為例,我們知道梅花1最小,所以,只要注意是不是梅花1。但是,通常數字排序時不知道最小值,所以,要一一比較才能找出最小值。找到之後,再從其他的去找下一個最小值,這是selection sort的原理。
- Greedy Algorithm
- Greedy Choice Property
- Optimal Substructure
- c575 基地台 (基礎演算法1)
- APCS 2017年3月第4題
- 要找到基地台最小直徑,如果透過窮舉法列出基地台可能位置的所有組合,會很複雜
- 先分解(簡化)問題,反過來想,是否可以從最小直徑(也就是1),能涵蓋多少點,用這樣去計算所需要的基地台
- 逐步增加直徑,一直到正好是所給定的基地台數量,就能找到最小直徑
- 當最小直徑與最大可能直徑差異很大的時候,直徑從1開始逐步增加直徑,就會很慢,所以,借用二元搜尋的概念來降低尋找的次數
- c471 物品堆疊 (Stacking) (基礎演算法1)
- APCS 2017年10月第4題
- 要找到堆疊整體最佳解,如果透過窮舉法列出所有組合,再去求最低成本,會花太多時間
- 先**分解(簡化)問題,**透過相鄰兩者的移動成本比較,進行排序,排序後,就能找到整體最佳解答
- 分治法 (Divide-and-Conquer)
- 當我們要將所有撲克牌排順序時,要怎麼排?
- 從尋找最小值(梅花1)開始嗎?
- 這是selection sort的原理,也是貪婪法則的基本原理,但是,用在排序時,會花很多時間去排序,並不適合。
- 如果分成兩張一堆,每一堆先排序,兩兩相比很容易,接下來,因為每一堆都已經排序,合併時速度就很快
- 主要步驟
- 反序數量
- f315 低地距離 (本週的實作題)
- 動態規劃 (dynamic programming)
觀念題
實作題