商品描述
為什麼要學好「資料結構」與「演算法」呢?學習「資料結構」和「演算法」有以下幾個重要的原因:提高程式效率:資料結構和演算法是程序設計和編程的核心技能之一,能讓程式運行得更快、更有效率。解決問題:學習資料結構和演算法能夠幫助你理解如何解決不同類型的問題,從而提高編程能力和解決問題的能力。提高程式品質:了解不同的資料結構和演算法,可以使你更好地設計和編寫高品質的程式,減少程式出錯的可能性。面試加分:在技術面試中,面試官通常會問到資料結構和演算法相關的問題。如果你能熟練掌握這些知識,可以增加你通過面試的機會。總之,學習資料結構和演算法是非常重要的,可以幫助你成為一名更優秀的程序設計師,並且在工作中有更好的表現。為何練習Leetcode可以提升技術面試表現?LeetCode平台收集了大量科技公司的技術面試題目(Google、Facebook等)許多求職者使用LeetCode作為準備面試的工具,進行大量練習。這種練習的行為被稱為「刷題」。且同時面試會考的Leetcode題目幾乎都是建立在資料結構和演算法的理論上!模擬真實面試情境LeetCode的題目往往與科技、軟體公司實際面試時所出現的技術題非常相似。因此,刷題可以讓求職者更好地模擬真實面試情境,了解實際面試中可能會遇到的題目類型和難度,有助於提前準備。可以熟練資料結構理論(面試白板題常考)程式學習其實跟數學很像,除了學完資料結構和演算法理論之外,也需要搭配題目實作。練習Leetcode才能融會貫通所學的理論,讓面試的時候可以更熟練的回答技術問答。培養面試解題能力LeetCode的題目難度涵蓋了從簡單到困難的各個級別,通過不斷練習可以培養求職者解題的能力,包括理解問題、分析問題、設計算法、編寫代碼、測試和除錯等方面(面試官很看重你如何分析問題還有怎麼去理解問題!)。增強面試臨場自信通過解決Leetcode上的問題,您可以提高自己的技能水平和信心,如同考試寫考古題一樣,從而更加自信地應對面試。這種信心可以幫助您在面試中表現得更好,從而提高獲得工作的機會。課程緣起大家都知道資料結構和演算法是面試的根本,也是決定你職涯薪水的重要技能和是否能進入大公司外商的關鍵。目前市售的書籍描述都過於複雜,把簡單的觀念複雜化,以及教的內容過於深入,導致學生一開始認為資料結構和演算法很困難就放棄了。在目前的科技業環境,面試白板題將決定你的面試成果,許多自學的人通常不會有本科系知識,因此自學想追上其他軟體工程師的人非常適合利用這門課程穩固基礎,可以從頭開始進行有系統的學習,而面試求職、求學更是需要這門課快速複習、刷題解題,在短期內提高面試求職的成功率!課程核心特色圖像和動畫式教學,讓演算法更容易被理解看似抽象複雜的演算法其實富有邏輯性,本課程利用動畫圖像拆解每個演算法流程,並詳盡敘述每一個流程發生的前因後果,讓複雜抽象的資料結構變得非常簡單!教你從完全不懂資料結構到成功解出Leetcode題目這門課不用擔心零基礎,我們會帶你學習基本資料結構與演算法,詳盡地教你每一個觀念與細節,讓你有能力獨立解出Leetcode面試題目!Leetcode練習題題詳解,一步步分析解題邏輯還有知識點!每一題帶到的Leetcode練習題,我們都會一步步帶各位拆解題目,分析題目,並統整此題學到的知識點還有小技巧,濃縮成帶得走的知識,而非單純背題目!我們會站在初學者容易遇到的問題與理解困難點出發,一行一行詳細解釋程式碼,不漏掉任何標點符號,絕不跳步驟,因為坊間有太多教學,都是認為學生是超人,就一直跳步驟,導致最後學生跟不上而放棄。有架構的課程設計,循序漸近一次搞懂所有重要資料結構和演算法本課程將建立資料結構基礎,再循序漸進學習艱難的演算法,也實際搭配使用Leetcode面試題去做實戰訓練,增加熟練度和印象。每個步驟清楚演繹,讓你熟悉在面試時的技術問答,提升面試成功機率!課程內容設計(本課程為基礎課程)資料結構與演算法部分本課程的規劃由淺入深,並且環環相扣,逐一地建立資料結構與演算法的邏輯概念。本課程會包含12種重要的資料結構,從基本的時間複雜度分析程式效率,到進階的樹狀資料結構。在每一個章節,都會搭配Leetcode題目作爲實戰練習,針對學完的理論基礎,用實作的方式融會貫通,同時也讓同學可以直接感受面試題目的難度,加深學習成效,幫助同學能夠更輕鬆的拿取軟體工程師offer!實戰Leetcode練習部分我們會挑選與課程相關的內容題目和常見的面試題目來練習。在練習的同時,也會帶領同學的思路來一步步拆解並分析題目,讓同學能夠快速理解題目意思,找出題目邏輯,最後也會手把手的寫程式解題,並詳細說明每一行的程式功能,讓同學都能跟上每一步的思路!課程單元規劃說明和學習目標第一章:基本資料結構演算法觀念時間複雜度(BigO)時間複雜度是一個算法執行所需時間的度量,通常用大O符號表示,例如O(n)、O(logn)等。時間複雜度與算法所使用的資料結構有很大的關係,不同的資料結構會對同一個算法的時間複雜度產生不同的影響。此外,資料結構的操作也會影響算法的時間複雜度。例如,插入、刪除、查找等操作所需時間的不同,會對算法的效率產生影響。因此,在設計資料結構時,需要考慮不同操作的時間複雜度,以便在不同場景下使用最適合的資料結構。【學習目標】理解資料結構和演算法的基本概念和定義,以及它們在實際問題中的應用。掌握「時間複雜度」的基本概念和使用方法,能夠分析和評估算法的時間複雜度。包括最壞、最好和平均情況的時間複雜度。能夠對算法的運行時間和空間複雜度進行分析和評估,從而選擇最佳算法。能理解不同算法之間的比較,能夠選擇適合的算法解決不同類型的問題。【未來工作應用地方】程式編寫上:能夠分析和評估算法的時間複雜度和空間複雜度,從而能夠選擇最佳的算法來解決問題,提高工作效率。程式遇到效能問題時:能夠更好地應用資料結構和演算法的概念和定義,從而提升工作上程式碼的效能問題。單元1:為什麼要學資料結構和演算法?為什麼要刷題?單元2:什麼是資料結構和演算法單元3:如何分析演算法:時間複雜度(BigO)觀念和計算單元4:如何分析演算法:時間複雜度圖表和空間複雜度觀念和計算單元5:刷題(Leetcode)必備觀念單元6:(補充)Leetcode基本操作介面介紹講解第二章:陣列(Array)陣列(Array)是一種資料結構,它由相同類型的元素集合組成,這些元素在內存中連續存儲。陣列通常用於存儲一組數據,並且可以按照一定的索引方式訪問這些數據。這一章節將深入介紹陣列在程式設計中的基本概念、包括如何定義陣列、陣列的元素以及如何訪問陣列中的元素等。接著我們會介紹如何使用陣列來解決Leetcode實際問題。例如,如何在陣列中搜尋元素、如何將元素插入到陣列中以及如何刪除陣列中的元素等【學習目標】掌握如何創建和訪問陣列,以及如何使用陣列來解決Leetcode實際問題。理解陣列的時間和空間複雜度,並能夠選擇最適合的演算法來解決問題。理解陣列的刪除插入搜尋的程式操作,並能夠熟練的來處理複雜資料。【未來工作應用地方】陣列被廣泛應用於數據庫管理系統中,例如在存儲和檢索大量數據時使用陣列可以提高效率。遊戲開發方面:陣列被廣泛用於遊戲開發中,例如存儲遊戲中的角色、敵人和物品等信息,以及實現遊戲中的碰撞檢測和運動模擬等。自然語言處理:陣列被廣泛用於自然語言處理中,例如存儲文本數據和語言模型等。單元1:陣列(Array)圖解基本概念和常用技巧&時間複雜度單元2:python實作基本操作Array(新增、刪除、查找、建立等)單元3:陣列Leetcode題目實戰練習第三章:雜湊(Hash)雜湊(Hash)是一種常見的資料結構,用來將大量的資料映射到一個固定範圍的小區間內,以便於快速查找、插入或刪除資料。它通過將關鍵字映射到一個固定範圍的整數值,然後將整數值作為索引來查找資料。【學習目標】理解雜湊函數的定義與概念。知道如何設計一個適合的雜湊函數。了解雜湊表的結構及其優缺點。掌握雜湊碰撞的處理方法。知道如何選擇適當的雜湊函數和解決碰撞的方法,以提高雜湊表的效率。會實作雜湊函數,並且能夠解出對應Leetcode題目【未來工作應用地方】資料庫設計:在資料庫中,雜湊函數被用來加速查詢操作。每當一筆資料被新增到資料庫中時,一個雜湊值會被計算並與該資料相關聯。當查詢資料時,只需要計算目標資料的雜湊值,就可以快速找到相應的資料。搜尋引擎:當搜尋引擎在網路上收集資料時,它們需要一個快速的方式來搜尋和存儲這些資料。雜湊函數可以用來加速這個過程,並幫助搜尋引擎更快地找到相應的資料。單元1:HashTable雜湊表簡介&mapping映射簡介單元2:什麼是hashtable(雜湊表)和HashFunction(雜湊函數)單元3:HashFunction(雜湊函數)運作簡介單元4:HashTable的碰撞和解決方法單元5:HashTable的時間複雜度以及在python中的形式單元6:HashTable雜湊表的優缺點單元7:HashTable程式碼實作(python)單元8:Leetcode題目實戰練習(1)-217.ContainsDuplicate單元9:Leetcode題目實戰練習(2)-442.FindAllDuplicatesinanArray單元10:Leetcode題目實戰練習(3)-1512.NumberofGoodPairs單元11:Leetcode題目實戰練習(4)-242.ValidAnagram單元12:Leetcode題目實戰練習(5)-1.TwoSum第四章:堆疊(stack)堆疊(Stack)是一種常見的資料結構,它具有「後進先出」(Last-In-First-Out,LIFO)的特性,即最後放入的元素會最先被取出,而最先放入的元素會最後被取出。本章中,我們將了解堆疊的實現方式,包括使用陣列和鏈結串列。此外,我們將研究如何使用堆疊來解決實際問題,例如括號匹配問題、迷宮問題等等。【學習目標】學會堆疊的定義和基本操作。學會使用陣列資料結構建立堆疊(stack)。學會使用鏈結串列資料結構建立堆疊(stack)。解決堆疊的Leetcode問題:括號匹配問題、迷宮問題等。【未來工作應用地方】在軟體設計中:堆疊可以被用於函式呼叫、遞迴、回溯等場景中。在圖像處理工作中:堆疊可以被用於圖像處理算法中的像素處理和圖像增強。堆疊在程式語言和軟體工程等領域中是非常基礎且重要的資料結構,學習和掌握其應用和運用,有助於提高程式設計的能力和效率。單元1:堆疊(stack)圖解核心概念單元2:堆疊的重要操作&堆疊時間複雜度單元3:python實作建立堆疊單元4:用鏈結串列建立堆疊(建議學習完鏈結串列單元再來觀看)單元5:Leetcode題目實戰練習(1)-20.ValidParentheses單元6:Leetcode題目實戰練習(2)-150.EvaluateReversePolishNotation第五章:佇列(Queue)佇列(Queue)是一種具有先進先出(First-In-First-Out,FIFO)特性的資料結構,就像排隊買東西一樣,先到先服務,後到後服務。佇列最常用的操作是在佇列的後端(Back)新增元素,並在佇列的前端(Front)刪除元素。【學習目標】了解佇列的定義和特性。學習如何實現基本佇列操作,例如:資料插入佇列(enqueue)、從佇列中刪除元素(dequeue)、判斷佇列是否為空。學習特殊佇列:環狀佇列等。學習如何設計使用佇列的演算法,例如廣度優先搜索算法。【未來工作應用地方】資料處理:佇列在資料處理方面擁有廣泛的應用,例如數據緩存、消息佇列、管道等。在這些應用中,佇列可以用於調度任務、緩解網路傳輸過程中的瓶頸問題、儲存大量的數據等。排隊系統:在現代社會中,排隊系統已經成為了必不可少的一部分。例如,銀行、超市、餐廳、公共交通等等場所都需要使用佇列來管理人流和物流。因此,佇列算法在這些場所中發揮著非常重要的作用。單元1:佇列(queue)圖解核心概念和操作&時間複雜度單元2:HashTable、stack、queue和array的比較單元3:python實作建立佇列單元4:Leetcode題目實戰練習(1)-933.NumberofRecentCalls第六章:鏈結串列(LinkedList)鏈結串列是一種常見的資料結構,用來儲存一連串的節點(node)。每個節點包含了資料本身以及指向下一個節點的指標(pointer)。因此,所有節點串在一起就形成了一個鏈結串列。鏈結串列可以在任何位置進行增加、刪除操作,且不需要像陣列一樣需要移動其他元素,因此在某些情況下,使用鏈結串列會更加高效。【學習目標】了解什麼是鏈結串列,以及它如何與其他資料結構區分掌握如何建立、操作和刪除鏈結串列,包括添加、插入、查找和刪除節點。理解不同類型的鏈結串列,例如單向、雙向和環形鏈結串列,並能夠在適當的情況下使用它們。理解鏈結串列的時間和空間複雜度,並了解如何分析它們以確定算法的效率。掌握如何使用鏈結串列解決常見的問題,例如反轉鏈結串列、合併兩個鏈結串列和找到鏈結串列的中間節點等。【未來工作應用地方】當你在開發軟體時,經常會需要處理大量的資料,而這些資料需要以特定的方式存儲和管理,例如用戶資料、交易記錄等等。這些資料通常會使用鏈結串列等資料結構來管理和存儲,這樣會比用陣列來的更有效地管理和存取資料。單元1:鏈結串列(LinkedList)圖解概念介紹單元2:鏈結串列和與陣列的差異&時間複雜度單元3:建立鏈結串列的節點類別&python實作單元4:python實作:遍歷鏈結串列單元5:python實作:在鏈結串列中查找節點資料單元6:python實作:在鏈結串列中插入一個新的節點。單元7:python實作:從鏈結串列中刪除一個節點單元8:雙向鏈結串列和環狀鏈結串列概念單元9:Leetcode題目實戰練習(1)-203.RemoveLinkedListElements單元10:Leetcode題目實戰練習(2)-876.MiddleoftheLinkedList單元11:Leetcode題目實戰練習(3)-141.LinkedListCycle單元12:Leetcode題目實戰練習(4)-206.ReverseLinkedList單元13:Leetcode題目實戰練習(5)-21.MergeTwoSortedList第七章:迴圈(Loop)和遞迴(Recursion)迴圈是一個線性的控制結構,通過條件判斷控制程式重複執行一段程式碼,達到節省代碼和提高效率的目的。常見的迴圈有for、while、do-while等。遞迴是一個自己調用自己的函數,每次調用都會產生一個新的函數。遞迴在程式設計中通常用於解決可以分解為同類子問題的問題,達到簡化代碼和提高可讀性的目的。遞迴必須設定終止條件,否則將陷入無限遞迴。【學習目標】學習迴圈的進階概念和使用方法:例如,如何使用嵌套迴圈來處理複雜的問題。能夠使用遞迴來解決常見的算法問題,如費氏數列、階乘和二分查找等。本節也將介紹如何比較迴圈和遞迴的時間複雜度和空間複雜度,並分析遞迴和迴圈的優缺點。以及效能上的差別,因為在不同的情況下,它們的效率和優點是不同的。【未來工作應用地方】在AI資料處理和機器學習中:迴圈和遞迴也是常見的技術。例如,在處理大量資料時,需要使用迴圈來遍歷資料,進行統計和分析。而在機器學習中,遞迴神經網路是一種重要的模型。在軟體系統管理中:迴圈和遞迴也被廣泛使用。例如,設置軟體自動化程序時,需要使用迴圈來完成同樣的任務。而在維護和診斷複雜系統時,使用遞迴算法可以讓問題得到更清晰的解決。單元1:遞迴(Recursion)圖解重要概念&階乘遞迴概念單元2:遞迴(recursion)和堆疊(stack)的關係單元3:迭代(Iteration)圖解重要概念&遞迴和迭代的比較單元4:python實作迴圈和遞迴(以費氏數列為例)單元5:二分查找遞迴概念單元6:Leetcode題目實戰練習(1)-344.ReverseString樹(Tree)樹(Tree)是一種常見的資料結構,它以分層的方式組織和儲存資訊。樹由一個稱為根節點的頂端節點開始,然後分為多個子節點,每個子節點又可以有自己的子節點,以此類推【學習目標】1.了解樹的重要概念和術語:根節點,父子節點,高度深度,還有層數等等,2.以及了解樹的不同種類和差異性。3.學習如何用陣列和鏈節串列實作建立樹【未來工作應用地方】樹是很重要的資料結構,凡舉電腦檔案結構,或是很多的後端資料庫都是使用樹來當作資料結構,所以了解樹後,可以更了解資料庫的運作,更容易設計出有效率的資料庫結構。單元1:樹(Tree)圖解概念介紹單元2:樹的重要概念與術語:父子節點、高度深度等單元3:樹(tree)的種類和差異性單元4:python實作建立樹單元5:用鏈結串列和陣列來建立樹的差別單元6:Leetcode題目實戰練習(1)(此題建議二元樹章節學習完再看)-590.N-aryTreePostorderTraversal作業1:樹(Tree)作業第八章:二元樹(BinaryTree)二元樹(BinaryTree)是一種資料結構,它由節點(node)和邊(edge)組成,每個節點最多只能有兩個子節點,且節點的排列形式是具有層級結構的。【學習目標】瞭解二元樹的概念及其結構掌握二元樹的遍歷算法(先序、中序、後序、層序)學習二元樹在Leetcode上的基本題型(面試很常考,很重要!)【未來工作應用地方】資料庫索引結構:資料庫中的索引可以使用二元樹實現,以便在查詢資料時快速定位到對應的資料位置。搜索引擎:搜索引擎使用樹狀結構來組織和管理網頁資料,以便在搜尋時快速定位到對應的網頁。機器學習:許多機器學習算法使用樹狀結構來進行資料分類和回歸。遊戲開發:許多遊戲中需要使用樹狀結構來管理遊戲對象的關係和屬性,例如角色之間的父子關係、技能樹等。單元1:二元樹(BinaryTree)圖解概念介紹&python實作二元樹單元2:BFS(廣度優先走訪)和層序走訪(Level-orderTraversal)觀念&python實作單元3:DFS(深度優先走訪)觀念&python實作單元4:二元樹的前、中、後序走訪&python實作單元5:Leetcode題目實戰練習(1)-102.BinaryTreeLevelOrderTraversal單元6:Leetcode題目實戰練習(2)-107.BinaryTreeLevelOrderTraversalII單元7:Leetcode題目實戰練習(3)-637.AverageofLevelsinBinary單元8:Leetcode題目實戰練習(4)-104.MaximumDepthofBinaryTree單元9:Leetcode題目實戰練習(5)-144.BinaryTreePreorderTraversal單元10:Leetcode題目實戰練習(6)-226.InvertBinaryTree作業2:二元樹第九章:二元搜尋樹(BinarySearchTree)二元搜尋樹(BinarySearchTree)是一種常見的二元樹(BinaryTree),其中每個節點最多只有兩個子節點。二元搜尋樹有一個重要的性質:對於每個節點,其左子樹上所有節點的值都小於該節點的值,而右子樹上所有節點的值都大於該節點的值。這個性質使得二元搜尋樹非常適合用來實現「關鍵字查詢」等操作,例如快速地查找某個數據是否存在於數據集合中,以及查找數據集合中最大、最小值等。二元搜尋樹還可以通過中序遍歷(In-orderTraversal)來實現對於數據集合的排序操作。二元搜尋樹(BinarySearchTree)也是樹的一種,但是規則更嚴謹,但是卻也是非常重要的資料結構,我們會在這邊重新的和先前的樹還有二元樹做一次比對,統整差異化,讓各位不會搞混!【學習目標】了解二元搜尋樹的基本概念和性質,包括節點、根節點、左子樹、右子樹、二元搜尋樹的排序規則等。掌握二元搜尋樹的建立和遍歷方法,包括中序遍歷、前序遍歷和後序遍歷。知道如何在二元搜尋樹中進行查找、插入和刪除操作,以及相應的算法思路和實現方法。瞭解二元搜尋樹的時間複雜度分析,掌握如何進行性能優化。知道二元搜尋樹的應用場景,如查詢、排序、記憶體管理等。【未來工作應用地方】可以利用二元搜尋樹來實現各種查找、排序等功能,因此在資料庫、網路搜索、系統優化等方面都有應用。例如,在搜尋引擎中,可以利用二元搜尋樹儲存關鍵字並加速查找;在資料庫中,可以利用二元搜尋樹來實現快速查詢和排序等操作。此外,在軟體開發、編譯器設計、圖形學等領域中也常常使用二元搜尋樹。單元1:二元搜尋樹(BinarySearchTree)圖解概念介紹&時間複雜度單元2:二元搜尋樹(binarysearchtree)的建立和新增資料單元3:二元搜尋樹(Binarysearchtree)搜尋資料&python實作單元4:二元搜尋樹DFS深度優先走訪(前、中、後序)&python實作單元5:二元搜尋樹BFS廣度優先走訪&python實作單元6:Leetcode題目實戰練習(1)-938.RangeSumofBST教學方式我們會主要以老師一行一行的寫程式來帶領大家學習,並用使用投影片來說明基本觀念,並且在較複雜的邏輯觀念部分,會以投影片動畫輔助各位了解其中原理!手把手一行一行的寫程式帶領,零基礎也不怕聽不懂:投影片圖解並一步步說明觀念,把抽象觀念圖象化:關於講師Chris大家好,我是Chris,目前任職於軟體新創公司,畢業於國立大學資訊工程學系,曾在資訊競賽拿下全國第二與佳作等成績,並在大學期間參與過許多研究計畫、自行和廠商接案架設電商網站等,累積許多SideProject。我也對資料結構與演算法有非常大的興趣,打過程式競賽、寫了數百題的Leetcode,並以python實作不少專案,包括大數據分析,機器學習,以及語音辨識領域。在進修過程中慢慢領悟一套學習心法,能理解想進入資訊領域的新手面臨的障礙,並能跳脫工程師思維,不把硬梆梆的內容丟給大家,而是用人人聽得懂的方式教會你寫程式,讓各位能夠成功轉職踏入工程師的大家庭!講師作品HackMD(資料結構技術技術筆記):https://hackmd.io/@chrischen0102IT邦技術文章:https://ithelp.ithome.com.tw/users/20116453/profileGithub:https://github.com/maxchen0102榮譽全國大專院校資訊工程競賽智慧駕駛組以智慧駕駛專注度輔助系統-獲得全國第二全國大專院校智慧創新競賽-全國佳作多項軟體開發專案經驗(皆以python為主)多次與業界合作開發科技產品經驗(皆以python為主)協助企業架設電商網站多年軟體開發實務經驗(皆以python為主)回覆與作業設計作業設計部分:我們會有選擇題與是非題和數學計算題的作業設計,聚焦於資料結構和演算法的基礎觀念,幫助各位釐清觀念,還有抓到細節上的盲點!平均每天都會回答同學問題!平均每個禮拜都會批改一次作業!課前貼心提醒各位不用擔心有任何問題不清楚,或解題有困難,歡迎隨時到課程留言區留言發問,老師會不定時來解決各位遇到的問題!