# 資料結構 Data structure >程式=資料結構+演算法 ## 資料儲存層次的分類(由低到高) 1. 基本資料型態(實質資料型態) 2. 結構型資料型態(虛擬資料型態) 3. 抽象資料型態 ## 抽象資料型態 * 是指定義一些結構型資料型態所具備的數學運算關係,也就是說使用者無需考慮到ADT的製作細節,只要知道如何使用即可 * 指的是將物件的規格及其相關運算的規格,與物件的表示方式及其相關運算的實作方式分隔開來,以提供更便利的形式讓使用者存取資料,而不涉及資料的實際儲存細節或實做細節 >優點: 1. 可以模組化 2. 進行資訊隱藏 # Chapter algorithm ## 分割問題 >給予一個正整數的集合A={a1,a2,...,an},是否可以將其分割成兩個子集合,而此**兩個子集合的個別總和相等** ## 0/1 knapsack >n個東西有其個別價值跟重量,另有一個限重為M的袋子 如何選取某些東西,**使得總重量不超過M,且總價值最高**。 ## 旅行推銷員問題(Traveling Salesman problem, TSP) >尋找一條總距離(總花費)最小的路徑,並滿足:從公司出發,走訪所有城市且不重複,最後回到公司。 ## 頂點覆蓋(Vertex cover) >挑選最小的頂點集合,使得任何一邊的兩個頂點中,至少有一頂點在集合中。 ## Dominating Set >拿一些點,蓋住所有鄰點 ## Using computer to solve problem> 1. 明確定義問題 2. 設計演算法,並估計所需時間 3. 撰寫程式,並加以測試 ## Definition & Criteria of Algorithm ### Defination >An algorithm is a finite set of instruction that accomplishes a particular task. ### Criteria 1. Input 2. Output 3. Definiteness: clear and unambiguous 4. Finiteness: terminate after a finite number of steps 5. Effectivenss: instruction is basic enough to be carried out ## 凸包(Convex hull) >找出最小的凸多邊形,將平面上所有點包在內部。 ## 全世界所有問題可分為: ### Unsolvable problems >e.g. Halting problem ### Solvable problems 1. Intractable problems >e.g.列出一個集合的所有子集合 2. Tractable problems(Polynomial Time) >e.g.排序問題 ## Definition of the time complexity notation * Worst-case: **upper bound**(defined by an **algorithm**) * Average-case * Best-case: **lower bound**(defined by a **proof**) ### Definition of Big-O > f(n) = O(g(n)) if and only if exists two real constant c>0, and an integer constant n0>=1, > such that f(n) <= c * g(n), for all n >= n0 ### Definition of Big-Omega > f(n) = $\omega$(g(n)) if and only if exists real constant c>0, and an integer constant n0>=1, > such that f(n) >= c * g(n), for all n >= n0 ### Defination of Big-theta >f(n) = $\theta$(g(n)) if and only if exists real constants c1, c2 > 0, and an integer constant n0 >= 1, >such that c1 * g(n) <= f(n) <= c2 * g(n), for all n >= n0 <img style="display: block; margin-left: 0; margin-right: auto" height="50%" width="50%" src="https://upload.cc/i1/2019/11/01/s7K6WH.png"> <div style="text-align:left">Big-O函數示意圖</div> <img style="display: block; margin-left: 0; margin-right:auto" height="50%" width="50%" src="https://upload.cc/i1/2019/11/01/v4qECs.png"> <div style="text-align:left">Big-Omega函數示意圖</div> ## Definition of P, NP problem >A decision problem is a problem where the answer is always "YES/NO" * NP = Non-deterministic and polynomial ## Definition of Determinism and Non-determinism ### Deterministic >演算法中每一個步驟需備唯一定義,因此產生的結果也是唯一的。 ### Non-deterministic >允許一些步驟可以有可變動的執行選擇,因此運算結果不唯一,但需要限制在一組可能的結果之內。 # Chapter 1 ## System Life cycle 1. Requirements 2. Analysis: > Bottom-up or Top-down 3. Design: * Data objects: abstract data types * Operations: specification & design of algorithms # Chapter 2 ## 稀疏矩陣(sparse matrix) ### Sparse matrix representation using 3-tuple form(row, column, value) ### Transpose a sparse matrix 1. 跑所有 column 2. 對於每一個可能的 column 值,掃描所有 terms 3. 找出含有相對應的 column 的 terms,依序放進另一個陣列 Time complexity: **O(term * column)** ### Fast transpose a sparse matrix * (比上一個做法多宣告兩個陣列 rowsize 和 rowstart) 1. 跑所有 terms 2. 統計每個 term 是屬於哪個 column,並記錄在 rowsize 裡面 3. 加總 rowsize (prefix sum, 因為要算相同 column 的 terms 在新陣列的起始位置) 4. 再跑一次所有 terms,按column在新陣列的相對應位置依序放入新陣列 Time complexity: **O(term + column)** ## KMP algorithm ### Definition of failure function 如果 p = p0p1p2....pn-1 是一個字串,則: * f(j) = largest k < j, such that p[0 : k]=p[j-k : j], if k>=0 exists * f(j) = -1, otherwise. # Chapter 3 ## Infix to postfix converion 1. Fully parenthesize expression 2. All operators replace their corresponding right parentheses (if to prefix, then turn into left parentheses) 4. Delete all parentheses # Storage Management Buddy System ## 記憶體分配方法 ### 最先合適法(First-Fit) 1. 從可用的空間區段中,找到**第一塊大於n的閒置區段**,將其中一部份分配給使用者。 2. 回收時,將釋放的閒置區段插回**鏈結串列的開頭**。 ### 最佳合適法(Best-Fit) 1. 從可用的空間區段中,找出**一塊大小最接近n的閒置區段**分配給使用者。(會先將區段自小到大排序) 2. 回收時,必須將釋放的閒置區段插入到**合適的位置**上去。 ### 最差合適法(Worst-Fit) 1. 從可用的空間區段中,找出**最大的閒置區段**分配給使用者。(將閒置區段由大到小排序。) 2. 回收時,必須將釋放的閒置區段插入到**合適的位置**上去。 #### 比較圖 | | First-Fit | Best-Fit | Worst-Fit | | -------- | ---------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------- | | 適用時機 | 系統先不管執行時間分配跟回收的情況 | 分配記憶體範圍廣的系統 | 分配記憶體範圍窄的系統 | | 分配方法 | 分配隨機,需先查可用空間區段 | 找出最接近請求的閒置區段,需搜尋連結串列(最費時) | 從記憶體最大的節點中分配,使連結串列中節大小趨向平衡,不須查詢連結串列 | | 回收方法 | 插回串列開頭就好 | 需先搜尋適當位置才能插入 | 需先搜尋適當位置才能插入 | | 優點 | 配置速度快 | 配置後殘餘的空間最小,但不能給其他作業使用 | 配置後殘餘的空間最大,但可給其他作業使用 | ## 邊界標示法(Boundary Tag Method) 在於每個記憶體區段的開頭部份和尾部兩個邊界上分別設有標籤,以標識該區域為占用區段或閒置區段,使得在回收使用者釋放的閒置區段時,易於判別物理位置上與其相鄰的記憶體區域是否為閒置區段,以便將所有位址中連續的閒置記憶體區組合成一個大的閒置區段。*配合最先合適法來管理記憶體,可減少搜尋時間。 ## 夥伴系統(Buddy System) *和邊界標識法類似*。使用者提出申請時,分配一塊大小“適當”的記憶體給使用者;反之,在使用者釋放記憶體時即回收。 * A block of size 2^i is called an i-block and the list containing i-blocks is called the i-list * If a request for a block of size n is made,an i-block is reserved where i is the smallest integer such that n <= 2^i.**會一直向上找直到有空閒區段可以切割。** * If q|2^i+1, then it is the first half of an (i+1)-block and its buddy is at q+2^i.Otherwise, it is the second half of an (i+1)-block and its buddy is at q-2^i. >優點:演算法簡單,速度快\ >缺點:只合併夥伴,容易產生碎片 ## 費氏夥伴系統(Fibonacci Buddy System) * 重點在兩個具有共同父節的相鄰區塊,如何合併成較大的區塊。 * 為了記憶體釋回工作操作順利,設定counter變數,以記錄區塊的分裂關係 >步驟: 使用區塊中最大者,即節點counter = 0 當區塊分裂為二時,以遞迴方式定義counter的值: 左區塊的counter = counter+1。 右區塊的counter = 0 (歸零)。 # Chapter 5 ## Definition of Tree * a distinguished node r(root) * zero or more nonempty (sub)trees T1, T2, ... , Tk, each of whose roots are connected by a directed edge from r ### Terminology of Tree * degree: the number of subtrees of the node(i.e. degree = 節點有幾個子樹), the node with degree 0 is a leaf(葉節點) * parent(父節點): the node that has subtrees is the parent of the roots of the subtrees.(如果某點有子樹,那麼此點為其所有子樹根的父節點) * children(子節點): the root of these subtrees are children of the node(反過來說,這些子樹根為此節的點的子節點) * siblings: the nodes which have same parent. * ancestors(祖先): all the nodes long the path from the root to the node(某個點的祖先為從根節點到此節點路徑上的所有點) ### Representation of trees * list * left child-right sibling * ## Binary tree ### Definition of Binary tree * A binary tree is a finite set of nodes that is either empty or consists of a root and two disjoint binary trees called the left and right subtree.(二元樹為含左右獨立子樹及根的有限點集合或空集合) * 樹不能是空集合,但二元樹可以。 * 二元樹的子樹有左右順序,但樹沒有。 ### Full binary tree vs Complete binary tree * a full binary tree of depth k have 2^k-1 nodes. * a complete binary tree of depth k and n nodes iff its nodes correspond to the nodes numbered from 1 to n in the full binary tree of depth k. * 完美(full)二元樹全部塞滿,完滿(complete)二元樹的每個節點都能對應完美二元樹的編號 ### Binary Tree Traversals * inorder: LVR * preorder: VLR * postorder: LRV ## SAT problem * satisfiability problem: is there an assignment to make an expression true? # Chapter 6 ## Eular's graph(尤拉圖) * degree of a vertex(邊的度數):此點有幾條邊 * 只有每點都有偶數條邊(偶點),才會存在恰好遍歷所有邊一次,且起點終點相同的走法,且此種走法稱為 Eulerian walk。 * 七橋問題不存在 Eulerian walk,因為每個點都有奇數條邊。 ## Definition of a graph * A graph, G=(V,E), consists of two sets, V and E, V is finite and nonempty set of vertices, and E is a set of edges. * The vertices of a graph G can be repersented as V(G), and E(G) means the edges of a graph. * 圖有分有向圖 (directed graphs) 跟無向圖 (undirected graph). * (u,v)跟(v,u)在無向圖是相同的邊,但在有向圖分別是由u開始跟由v開始的邊。 ### Graph restrictions * 圖不能有自環跟重邊。(但中文精確點叫做簡單圖,英文還是叫graph) ### Terminology of graph 以下列我覺得重要的,要的自己寫,我懶。 * Acyclic graph (Directed Acyclic Graph, DAG):a directed graph with no cycle.(有向無環圖)。 * connected graph:an undirected graph if there is a path from every vertex to every vertex.(沒孤點的無向圖稱為連通圖)。 * strongly connected graph:a directed graph if there is a path from every vertex to every vertex.(每個點都存在一條路徑連往其他點的「有向圖」,為強連通圖。) * complete graph: graph in which there is an edge between every pair of vertices.(圖上任兩點均有邊的圖為完全圖) ### Subgraph(子圖) * subgraph of G is a graph G’ such that V(G’)⊆V(G) and E(G’)⊆E(G). ### Strongly Connected Component(SCC, 強連通元件) * A SCC is a maximal subgraph that is strongly connected.(強連通元件) ## Graph representation * Matrix: space complexity:O(vertex^2), good for dense but bad for sparse. * undirected graph is symmetric matrix * List: space:O(vertex+edge) good for sparse. * sequential: 前面陣列位置0~end,為周圍鄰居索引的起始點,後方array[i]至array[i+1]-1為vertex i的鄰居。 * adjacency list:紀錄離開那個點的頂點(out-degree) * Inverse adjacency list: 記錄能到那個點的頂點(in-degree) * Multilist: 這有點難解釋 ## Weighted edge * 有時候邊上面有所謂的「權重」(weight) * 權重可能代表兩點間「距離」(distance),或者某點經由某條邊至另一點的「代價」(cost,暫譯) * 如果要表示權重,我們需要額外的值以記錄它,有權重的圖稱為網路(network) ## Graph operations * 如果要拜訪圖G上所有點V能到的點,那有兩種做法,分別是深度優先搜尋(Depth-first search, DFS)跟廣度優先搜尋(Breadth-first search, BFS) * 此兩種做法都可以支援有向圖跟無向圖 ### DFS ### BFS ## Connected component ## Spanning tree * Any tree consisting solely of edges in G and including all vertices in G is called a spanning tree. ## Biconnected component ## Depth-first spanning tree ## Minimal cost spanning tree * 這我他媽很有爭議,明明minimum spanning tree(MST,最小生成樹)比較多人叫 * 叫最小擴充樹的,我一樣跟你拼命(X * 生成樹上所有邊的權重和,即為此樹的cost * 生成生成樹有三種greedy algorithm,分別是Kruskal, Prim 跟 Borůvka's(Sollin's) algorithm ### Constraints of Minimum spanning tree * 只能用圖上的n-1條邊,且這些邊不能構成環 ### Kruskal algorithm * 此演算法的做法為依序將邊加入生成樹的集合內 * 先將所有邊的cost由小到大排序O((edge)log(edge)),然後檢查所有邊O(edge)是否與之前被選入的邊構成環O(constant) * Time complexity: O((edge)log(edge)) ### Prim algorithm * 此演算法的做法為依序將「點」加入生成樹的集合內 * 先選一個起始點,然後選擇集合內所有點的連到的最小權重邊,檢查此邊的另一點是否在點集合內,若沒有則加入點集合 * Time complexity: O(edge^2) when using adjacency list or matrix * with fibonachi heap or priority queue: O(edge+(vertex)log(vertex)) ### Borůvka's(Sollin's) algorithm * 此演算法於每階段會一次選取多邊 * 剛開始時,所有n個點形成最小生成子樹森林 * 每個階段,對於每一棵最小生成子樹,選擇此子樹上最小權重且索引值最小的邊,有可能與先前的邊重複,無妨 * 直到生成最小生成樹為止 * Time complexity: O((edge)log(vertex)) ## Single source shortest path ### with nonnegative edge(Dijkstra algorithm) ### with negative edge(Bellmen ford) ## All-pairs shortest paths(Floyd wareshll) ## Activity-on-vertex(AOV) network # Chapter matrix chain multiplicaion ###### tags: `CSnote`