# 20191107 南山高中資訊班課程 政治大學 碩一 王柏仁 --- # 今日重點 1. 動態規劃 - Top Down A.K.A 樹狀圖法則複習 - Bottom Up A.K.A 表格法介紹 - 題目練習及討論 2. 樹的基本介紹( Content Credit : [交大資訊之芽](https://www.csie.ntu.edu.tw/~sprout/algo2019/ppt_pdf/week02/) ) - 定義 - 樹種及名詞介紹 - 各種樹種的基本運作 - 題目練習及討論 --- # 動態規劃 - 範例:(背包客問題) 現在有三個物體 **==\{ A, B, C \}==**,**==價值分別為 \{ $60, $100, $120 \},重量分別為 \{ 10g, 20g, 30g \}==**。現在有一個 **==限重 50g 的袋子==**。請問在條件之下,袋子中 **==最大價值為多少==**? ---- # 動態規劃 Top Down A.K.A 樹狀圖法則複習 - 整體來看 ```graphviz digraph hierarchy { nodesep=1.0 node [fontname=Courier,shape=box] edge [color=Blue, style=dashed] 三個東西和50g的空間【0】->兩個東西和50g的空間【0】[label="沒有拿走 A"] 三個東西和50g的空間【0】->兩個東西和40g的空間【60】[label="拿走 A"] 兩個東西和50g的空間【0】->一個東西和30g的空間【100】[label="拿走 B"] 兩個東西和50g的空間【0】->一個東西和50g的空間【0】[label="沒有拿走 B"] 兩個東西和40g的空間【60】->一個東西和20g的空間【160】[label="拿走 B"] 兩個東西和40g的空間【60】->一個東西和40g的空間【60】[label="沒有拿走 B"] 一個東西和30g的空間【100】->沒有東西和30g的空間【100】[label="沒有拿走 C"] 一個東西和30g的空間【100】->沒有東西跟空間【220】[label="拿走 C"] 一個東西和40g的空間【60】->沒有東西和40g的空間【60】[label="沒有拿走 C"] 一個東西和40g的空間【60】->沒有東西和10g的空間【180】[label="拿走 C"] 一個東西和50g的空間【0】->沒有東西和20g的空間【120】[label="拿走 C"] 一個東西和50g的空間【0】->沒有東西和50g的空間【0】[label="沒有拿走 C"] 一個東西和20g的空間【160】->沒有東西且空間不夠【不成立】[label="拿走 C"] 一個東西和20g的空間【160】->沒有東西和20g的空間【160】[label="沒有拿走 C"] } ``` ---- # 動態規劃 Top Down A.K.A 樹狀圖法則複習 - 第一步 ```graphviz digraph hierarchy { nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 三個東西和50g的空間【0】->兩個東西和50g的空間【0】[label="沒有拿走 A"] 三個東西和50g的空間【0】->兩個東西和40g的空間【60】[label="拿走 A"] } ``` ---- # 動態規劃 Top Down A.K.A 樹狀圖法則複習 - 第二步 ```graphviz digraph hierarchy { nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 兩個東西和50g的空間【0】->一個東西和30g的空間【100】[label="拿走 B"] 兩個東西和50g的空間【0】->一個東西和50g的空間【0】[label="沒有拿走 B"] 兩個東西和40g的空間【60】->一個東西和20g的空間【160】[label="拿走 B"] 兩個東西和40g的空間【60】->一個東西和40g的空間【60】[label="沒有拿走 B"] } ``` ---- # 動態規劃 Top Down A.K.A 樹狀圖法則複習 - 第三步 ```graphviz digraph hierarchy { nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 一個東西和30g的空間【100】->沒有東西和30g的空間【100】[label="沒有拿走 C"] 一個東西和30g的空間【100】->沒有東西跟空間【220】[label="拿走 C"] 一個東西和40g的空間【60】->沒有東西和40g的空間【60】[label="沒有拿走 C"] 一個東西和40g的空間【60】->沒有東西和10g的空間【180】[label="拿走 C"] } ``` ```graphviz digraph hierarchy { nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 一個東西和50g的空間【0】->沒有東西和20g的空間【120】[label="拿走 C"] 一個東西和50g的空間【0】->沒有東西和50g的空間【0】[label="沒有拿走 C"] 一個東西和20g的空間【160】->沒有東西且空間不夠【不成立】[label="拿走 C"] 一個東西和20g的空間【160】->沒有東西和20g的空間【160】[label="沒有拿走 C"] } ``` ---- # 動態規劃 Bottom Up A.K.A 表格法介紹 - 整體來看 | 物體/重量/價值 |0|10|20|30|40|50| |:-----------------------------:|:--------------:|:------------:|:-------------:|:--------:|:---------:|:---------:| | A / 10g / $60 |0|60|60|60|60|60| | B / 20g / $100 |0|60|100|160|160|160| | C / 30g / $120 |0|60|100|160|180|220| ---- # 動態規劃 Bottom Up A.K.A 表格法介紹 - 第一步(Bottom Up 第一列) | 物體/重量/價值 |0|10|20|30|40|50| |:-----------------------------:|:--------------:|:------------:|:-------------:|:--------:|:---------:|:---------:| | A / 10g / $60 |0|60|60|60|60|60| **==我們只有一個 A 物體,因此不論袋子是否裝滿,都是 Value 60==** ---- # 動態規劃 Bottom Up A.K.A 表格法介紹 - 第二步(Bottom Up 第二列) | 物體/重量/價值 |0|10|20|30|40|50| |:-----------------------------:|:--------------:|:------------:|:-------------:|:--------:|:---------:|:---------:| | A / 10g / $60 |0|60|60|60|60|60| | ==B / 20g / $100==|==0==|==60==|==100==|==160==|==160==|==160==| 基本概念: **==T[i][j]= max(T[i – 1][j], V[i]+T[i – 1][j – W[i]])==** ---- # 動態規劃 Bottom Up A.K.A 表格法介紹 - 第三步(Bottom Up 第三列) | 物體/重量/價值 |0|10|20|30|40|50| |:-----------------------------:|:--------------:|:------------:|:-------------:|:--------:|:---------:|:---------:| | B / 20g / $100 |0|60|100|160|160|160| | ==C / 30g / $120== |==0==|==60==|==100==|==160==|==180==|==220==| 基本概念: **==T[i][j]= max(T[i – 1][j], V[i]+T[i – 1][j – W[i]])==** ---- # 動態規劃 題目練習及討論 - [東東爬階梯](https://zerojudge.tw/ShowProblem?problemid=d212) - [DELIVERY DEBACLE](https://zerojudge.tw/ShowProblem?problemid=d054) - [擺花](https://zerojudge.tw/ShowProblem?problemid=a697) - [傳球遊戲](https://zerojudge.tw/ShowProblem?problemid=d105) ---- # 動態規劃 - 相關範例(外國資訊練習教學網站):[連結](https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/) - 如何建表格:[連結](https://www.youtube.com/watch?v=8LusJS5-AGo) --- # 樹的基本介紹 定義 **==沒有環的連通圖==** ![](https://i.imgur.com/Q8YIRxC.png) ---- # 樹的基本介紹 樹種及名詞介紹 ![](https://i.imgur.com/2H9gKoG.png =800x400) ---- # 樹的基本介紹 樹種及名詞介紹 - 節點(node) - 邊(edge) - 根節點(root) - 葉節點(leaf) - 層(level) - 深度(depth) ---- # 樹的基本介紹 樹種及名詞介紹 - 父節點(parent) - 子結點(child) - 祖先(ancestor) - 子代(descendant) - 子樹(subtree) ---- # 樹的基本介紹 樹種及名詞介紹 - **==二元樹==** - **==Binary Search Tree==** - **==Heap Tree==** - **==平衡樹==** - AVL Tree - 紅黑樹 - [其他樹種及應用(未來有機會會補充)](https://docs.google.com/document/d/1wZ8qZI8KG0FWkLTlGmy4vB7tgKD_IG1fOsc-GV302Ug/edit#heading=h.11lxn6bs6vmp) ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 - 每個節點最多只有兩個子節點 - 第 k 層最多有 2**k 個節點 - 一棵深度為k的二元樹最多有 2**(k+1)-1 個節點 - 遍歷:前序、中序、後序 ![](https://i.imgur.com/zsCwU4V.png =300x90) ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 ![](https://i.imgur.com/8aEqtNL.png =400x100) - 遍歷:前序 ```graphviz digraph hierarchy { rankdir = LR nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 訪問根節點 -> 訪問左子樹 -> 訪問右子樹 } ``` 上圖的走訪順序為:ABDECFG ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 ![](https://i.imgur.com/8aEqtNL.png =400x100) - 遍歷:中序 ```graphviz digraph hierarchy { rankdir = LR nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 訪問左子樹 -> 訪問根節點 -> 訪問右子樹 } ``` 上圖的走訪順序為:DBEAFCG ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 ![](https://i.imgur.com/8aEqtNL.png =400x100) - 遍歷:後序 ```graphviz digraph hierarchy { rankdir = LR nodesep=1.0 node [fontname=Courier,shape=box,fontsize=20] edge [color=Blue, style=dashed] 訪問左子樹 -> 訪問右子樹 -> 訪問根節點 } ``` 上圖的走訪順序為:DEBFGCA ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 - 又分為 Full(Perfect) Binary Tree 和 Complete binary tree |樹種|Full Binary|Complete binary| |:-------:|:-----:|:------:| |圖示|![](https://i.imgur.com/kdTK9zz.png =300x100)|![](https://i.imgur.com/6dzfT6i.png =300x100)| ---- # 樹的基本介紹 各種樹種的基本運作 - 二元樹 - 針對 Complete binary tree 介紹 - 除了最後一層,每一層都是填滿的 - 最後一層的元素盡量往左靠 - 編號為 k 的兩個孩子編號分別為 2k 和 2k+1 - 編號為 k 的父親編號為 [k/2] - 一個有 n 個元素的 complete binary tree 的深度約為 log(n) ---- # 樹的基本介紹 各種樹種的基本運作 - Binary Search Tree 之重點 - 任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值,反之亦然。 - 任意節點的左、右子樹也是二元搜尋樹 - 編號為 k 的父親編號為 [k/2] - 沒有鍵值相等的節點 ---- # 樹的基本介紹 各種樹種的基本運作 - Binary Search Tree 之資料管理 [[其他清楚教學](http://alrightchiu.github.io/SecondRound/binary-search-tree-sortpai-xu-deleteshan-chu-zi-liao.html)] {%pdf https://www.csie.ntu.edu.tw/~sprout/algo2019/ppt_pdf/week02/tree_inclass.pdf %} ---- # 樹的基本介紹 各種樹種的基本運作 - Heap Tree - 一棵complete binary tree,又分為 Max Heap 和 Min Heap - **==父節點的權重不小於子節點的權重==** ![](https://i.imgur.com/PpDUrZy.png =500x175) ---- # 樹的基本介紹 各種樹種的基本運作 - Heap Tree - 資料運作 [[其他清楚教學](http://alrightchiu.github.io/SecondRound/comparison-sort-heap-sortdui-ji-pai-xu-fa.html)] {%pdf https://www.csie.ntu.edu.tw/~sprout/algo2019/ppt_pdf/week04/heap.pdf %} ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 - 又稱為自平衡二元搜尋樹 (Self-Balancing Binary Search Tree),目的是為了避免極端測資 - 以下僅先介紹 **==AVL 樹==**,之後慢慢帶入[紅黑樹](https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91)、[伸展樹](https://zh.wikipedia.org/wiki/%E4%BC%B8%E5%B1%95%E6%A0%91)...等樹種 (有興趣可先閱讀,之後可一起討論!) ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 之 **==AVL 樹==** 介紹:(Content Credit : [Link](https://www.notes-hz.com/blog?id=128)) - BST 的改良版 - 在節點中加入平衡因子,通常是節點的兩棵子樹高度差。 **==當平衡因子為 -1、0、1 時 , 樹是「平衡」的==** - 當這棵樹因為插入或刪除操作失衡時,AVL 樹利用「**==樹旋轉==**」的操作來回復平衡狀態。 ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 之 **==AVL 樹==** 介紹: - 平衡因子(BF)計算 - 左子樹的高度 - 右子樹的高度 - 當大於2時,則需要進行旋轉,**==共有四種旋轉方式:LL、RR、LR、RL==** ![](https://i.imgur.com/iu4atlr.png =500x150) ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 之 **==AVL 樹==** 介紹: - 旋轉條件: _**==若有一加入的新節點為N,若一距離N最近且平衡因子為+-2的父節點P存在,則四種調整方式的適用時機如下==**_ ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 之 **==AVL 樹==** 介紹: - 旋轉條件:( 依序為 **==LL / RR / LR / RL==** ) - 當加入的節點N在節點P的左邊的左邊 - 當加入的節點N在節點P的右邊的右邊 - 當加入的節點N在節點P的左邊的右邊 - 當加入的節點N在節點P的右邊的左邊 ---- # 樹的基本介紹 各種樹種的基本運作 - 平衡樹 之 **==AVL 樹==** 介紹:(Content Credit : [Link](https://www.notes-hz.com/blog?id=128)) - 旋轉條件:( 依序為 **==LL / RR / LR / RL==** ) <iframe src="https://onedrive.live.com/embed?cid=F704F1841E606902&resid=F704F1841E606902%2117564&authkey=APKKe-t1bJqptJM&em=2" width="750" height="300" frameborder="0" scrolling="no"></iframe> ---- # 樹的基本介紹 題目練習及討論(課堂討論;回家練習) * [北一女:Heap 學習單](http://web.fg.tp.edu.tw/~tfgcsblog/blog/wp-content/uploads/2016/07/05_Heap%E5%AD%B8%E7%BF%92%E5%96%AE.pdf) * Zerojudge: * [通關密語](https://zerojudge.tw/ShowProblem?problemid=d432) * [合併果子](https://zerojudge.tw/ShowProblem?problemid=b151) * [黑暗部落](https://zerojudge.tw/ShowProblem?problemid=d808) * [垃圾信件](https://zerojudge.tw/ShowProblem?problemid=d449) * [Binary Search Tree (BST)](https://zerojudge.tw/ShowProblem?problemid=d526) --- END ---
{"metaMigratedAt":"2023-06-15T01:22:32.172Z","metaMigratedFrom":"Content","title":"20191107","breaks":true,"contributors":"[{\"id\":\"a2b5458d-5f35-44ce-9c75-379dbfa1fbe3\",\"add\":11760,\"del\":2880}]"}
    988 views
   owned this note