發表文章

目前顯示的是有「DSA」標籤的文章

[DSA] Binary Search 以及 BST

**Binary Search** (二分搜尋) 和**BST** (二叉搜尋樹, Binary Search Tree): --- **Binary Search (二分搜尋)** **定義:**  - 二分搜尋是一種在已排序的數組或列表中查找特定值的算法。 **基本步驟:** 1. 找到中間元素。 2. 如果中間元素與目標值匹配,則返回其索引。 3. 如果中間元素小於目標值,則在右半部分(中間之後)重複上述步驟。 4. 如果中間元素大於目標值,則在左半部分(中間之前)重複上述步驟。 **時間複雜度:**  - 最差情況和平均情況下的時間複雜度為 \(O(\log n)\),其中 n 是列表或數組的大小。 --- **BST (Binary Search Tree, 二叉搜尋樹)** **定義:**  - 二叉搜尋樹是一種節點的二叉樹結構,其中每個節點都有一個可比較的鍵(和相關的值),並且滿足以下性質:   - 左子樹中的所有鍵都小於節點的鍵。   - 右子樹中的所有鍵都大於節點的鍵。 **基本操作:** 1. **插入 (Insert)**: 在 BST 中插入一個新鍵。 2. **查找 (Search)**: 檢查 BST 中是否存在特定的鍵。 3. **刪除 (Delete)**: 從 BST 中刪除指定的鍵。 4. **中序遍歷 (In-order Traversal)**: 遍歷 BST 的方法之一,結果是按鍵的升序訪問所有節點。 **時間複雜度:** - 在平衡的 BST 中,插入、查找和刪除的時間複雜度均為 \(O(\log n)\)。但在最差情況下(例如當樹成為一個“鏈”時),這些操作的時間複雜度為 \(O(n)\)。 **註:** - 為了確保 BST 的高效性,常常使用平衡技術,如 AVL 樹或紅黑樹,來確保樹保持大致平衡,從而保持操作的 \(O(\log n)\) 時間複雜度。 --- 總結:雖然 Binary Search 和 BST 都與“二分”這一概念相關,但前者是一種在已排序的數組中查找元素的算法,而後者是一種數據結構,用於保存和檢索鍵值對。

[DSA] 排序Sort 方式整理

排序算法是計算機科學中最基礎且最重要的主題之一。以下是一些常見的排序方法,以及它們的簡要描述: 1. **冒泡排序 (Bubble Sort)**    - 方法:重複地遍歷數組,每次比較兩個相鄰的元素,如果它們的順序錯誤就交換它們。    - 時間複雜度:最差、平均和最好情況下都是 O(n^2)。 2. **選擇排序 (Selection Sort)**    - 方法:在未排序的部分中找到最小(或最大)的元素,然後將其放到排序部分的開頭。    - 時間複雜度:最差、平均和最好情況下都是 O(n^2)。 3. **插入排序 (Insertion Sort)**    - 方法:從第一個元素開始,重複地取出一個元素並將其插入到前面已排序的部分的正確位置中。    - 時間複雜度:最差情況下是 O(n^2),但對於部分排序的數組,其性能可以達到近似 O(n)。 4. **快速排序 (Quick Sort)**    - 方法:選擇一個'基準'元素,並將數組分為小於基準和大於基準的兩部分,然後遞迴地對這兩部分進行排序。    - 時間複雜度:平均和最好情況下是 O(n log n),但最差情況下是 O(n^2)。 5. **合併排序 (Merge Sort)**    - 方法:將數組分成兩半,遞迴地對每一半進行排序,然後合併這兩部分。    - 時間複雜度:在最差、平均和最好情況下都是 O(n log n)。 6. **堆排序 (Heap Sort)**    - 方法:使用數組創建一個最大堆 (max heap) 或最小堆 (min heap),然後一次取出堆的最大(或最小)元素,直到堆為空。    - 時間複雜度:在最差、平均和最好情況下都是 O(n log n)。 7. **希爾排序 (Shell Sort)**    - 方法:是插入排序的一個變體,其中元素首先被分成多個子列表,這些子列表使用插入排序進行排序,隨著算法的進行,子列表的大小逐漸減小。    - 時間複雜度:因子列表的選擇...

[DSA] 深度優先搜索 (Deep First Search, DFS) 和廣度優先搜索 (Breadth-First Search, BFS)

深度優先搜索 (DFS) 和廣度優先搜索 (BFS) 的介紹,包括英文專有名詞: **深度優先搜索 (Depth-First Search, DFS)** DFS 是一種用於遍歷或搜索樹 (tree) 或圖 (graph) 的算法。它從一個起點開始,然後深入到每一個分支,直到該分支終點。 **基本步驟:** 1. 從起始節點 (starting node) 開始。 2. 移動到某個相鄰的未被訪問的節點 (adjacent unvisited node)。 3. 繼續深入直到目前的節點沒有未被訪問的相鄰節點。 4. 回退 (backtrack) 到上一個節點,並嘗試訪問其他未被訪問的節點。 5. 重複上述過程直到探索完畢。 **常見問題:** 1. **迷宮問題 (Maze problem):** 從迷宮的一個入口到出口的路徑。 2. **連通性 (Connectivity):** 判斷兩個節點是否連通。 3. **拓撲排序 (Topological Sorting):** 對一個有向無環圖 (Directed Acyclic Graph, DAG) 進行排序。 4. **判斷圖中是否有環 (Cycle Detection)。** 5. **尋找有向圖或無向圖的強連通分量 (Strongly Connected Components)。** **時間複雜度 (Time Complexity):** - 在無權重圖 (unweighted graph) 中,DFS 的時間複雜度是 **O(V + E)**,其中 V 是節點的數量 (number of vertices),E 是邊的數量 (number of edges)。 - 如果使用鄰接矩陣 (adjacency matrix) 表示圖,DFS 的時間複雜度是 **O(V^2)**。 - 如果使用鄰接列表 (adjacency list) 表示圖,DFS 的時間複雜度是 **O(V + E)**。 --- **廣度優先搜索 (Breadth-First Search, BFS)** BFS 也是一種用於遍歷或搜索樹或圖的算法。它從一個起點開始,然後逐層探索。 **基本步驟:** 1. 從起始節點開始。 2. 訪問所有相鄰的未被訪問的節點。 3. 對於所有這些相鄰節點,再進一步訪問它們的未被訪問的相鄰節點。 4. 重複...

[DSA] 動態規劃 (Dynamic Programming)

 當然可以,讓我為您介紹動態規劃 (Dynamic Programming)。 **動態規劃 (Dynamic Programming)** 是一種解決問題的方法,通常用於尋找最佳解或計算問題的總解數。它主要適用於那些具有重疊子問題和最佳子結構的問題。 動態規劃的主要概念如下: 1. **重疊子問題 (Overlapping Subproblems)**    這意味著問題可以分解為更小、更簡單的子問題進行求解。重要的是,這些子問題不是獨立的,也就是說,同一子問題可能會被多次計算。 2. **最佳子結構 (Optimal Substructure)**    一個問題的最佳解可以從其子問題的最佳解中構建得到。 **動態規劃的兩種主要技術:** 1. **記憶化 (Memoization)**    這是一種頂向下的方法。使用遞歸形式解決問題,但每當計算一個子問題的解,我們就會將其存儲下來,這樣當下次需要相同的解時,我們可以直接從存儲中獲得,而不需要再次計算。 2. **表格法 (Tabulation)**    這是一種自底向上的方法。我們首先計算所有可能的子問題,然後根據這些子問題的解構建原始問題的解。這種方法通常使用一個或多個表格來存儲子問題的解。 **動態規劃的例子:** **費波納契數列 (Fibonacci Sequence)** 是一個經典的動態規劃問題。使用遞歸方法計算費波納契數列的一個項非常沒有效率,因為它會重複計算很多相同的子問題。使用動態規劃(通過記憶化或表格法)可以大大提高效率。 **結論:** 動態規劃是一個非常強大的算法框架,尤其是當我們需要解決具有重疊子問題和最佳子結構的問題時。通過有效地存儲子問題的解,我們可以避免不必要的計算,從而大大提高算法的效率。 其他Dynamic Programming介紹文: Dynamic Programming Explanation with Fibonacci 用費波那契數列來入手動態規劃 [演算法] 動態規劃 (Dynamic Programming) 使用 Kotlin 示範

Google Search

推薦內容橫式

本月熱門文章

台灣人波蘭旅遊小撇步

ODM PM 業務 常見名詞整理

QNAP NAS 安裝openHAB 來實現智慧家庭

利用Linkedin 一步一步建立英文履歷

轉錄矽谷阿雅 談準備scrum master

北京故宮首訪,一窺清宮秘史 大玉兒 & 甄嬛

[旅遊][菲律賓] 宿霧Cebu及薄荷島Bohol 五天旅遊心得

如何在QNAP NAS 上使用 NVIDIA DIGITS ?