數據結構與算法-2

2021-01-12 井底倁蛙

目錄

(1)為什麼學習算法

(2)時間複雜度

(3)數組、鍊表

(4)堆棧、(優先級)隊列

(5)map、set

(6)樹、圖

(7)遞歸、分治、回溯
(8)貪心算法
(9)BFS、DFS

(10)剪枝

(11)二分查找

(12)Trie樹

(13)位運算

(14)動態規劃

(15)併查集

(16)LRU Cache

(17)布隆過濾器



遞歸
定義:通過函數體來進行的循環,沒有終止條件的遞歸是死遞歸。
舉例:從前有座山,山裡有座廟,廟裡有個老和尚講故事。講的是從前有座山,山裡有座廟.....(階乘、Fibonacci數列)。



分治
定義:map reduce的思想,把大的問題分解(Divide)成一個個小問題。把小問題的解(Conquer)一個個的合併(Combine)起來,分治是藉助遞歸去解決的。
舉例:大文件在有限的資源下進行操作、二分法、快速排序、合併排序。

回溯
定義:回溯算法實際是一個類似枚舉的搜索過程,在搜索中發現原先選擇並不優或達不到目標,就返回一步嘗試別的選擇。走不通(剪枝)就退回再走的技術稱為回溯法。藉助遞歸去解決,類似DFS。

面試題
1、計算x^n,pow(x,n)
思路:直接調用庫函數求解,O(1)
暴力求解,O(n)
分治的思想,藉助遞歸實現。x^n->x^n/2->x^n/4...->x^1,O(log n)
使用位運算進行計算,O(n)
URL:https://leetcode.com/problems/powx-n/description/

2、求一個數組中出現次數最多的數,要求count(x) > n/2
思路:暴力求解,O(n^2),外層循環進行枚舉,內存循環進行統計。每次的最後和n/2比較
引入map的方式,把數進行計數。O(n),會引入一個map的開銷
進行排序後,相同的數字就會在一塊了。因為是個數超過一半,那麼數組排序後該元素必定佔據數組的中間位置,O(log n)
分治思想,第一次先把數組分解為2個,看left和right哪個元素的count(x)最大就返回哪個,然後繼續拆分直到只剩下一個元素了
URL:https://leetcode.com/problems/majority-element/


貪心算法
定義:貪心算法又被稱為貪婪算法。在對問題求解時,總是做出在當前看來是最好的選擇。
適用場景:問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。
貪心算法對每個子問題的解決方案都做出選擇,不能進行回退。動態規劃會保存以前的運算結果,並根據以前結果對當前進行選擇,有回退功能。

面試題

1、買賣股票的最佳時機
思路:深度遍歷優先,每天是買還是賣。O(2^n)
貪心算法,每天都進行買賣(假設無手續費),把利益拿到手裡。O(n)
動態規劃,O(n)

URL:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/


BFS
定義:廣度優先搜索適合用在樹(圖/狀態集)中尋找特定節點。一層層遞進的方式地毯式搜索,在搜索圖和狀態集的時候需要引入集合進行判重。
類比:BFS就好像是我們選擇領域的時候先從廣度進行了解後,在選擇一個領域去做。

DFS
定義:廣度優先搜索同樣也適合用在樹(圖/狀態集)中尋找特定節點。每一條路走到底,再往回走看是否有其它的路徑,再走到底往回走是否有路。

類比:DFS就是我們選擇好一個領域後,把它徹底研究透徹在研究其它領域。

面試題
1、二叉樹按照層進行遍歷
思路:使用廣度優先搜索,每一層掃描完放到一起,O(n)
使用深度優先搜索,每一次記錄下深度,按照深度歸納每層的數據,O(n)

URL:https://leetcode.com/problems/binary-tree-level-order-traversal/

2、在二叉樹中找出最大深度和最小深度
思路:DFS,每一層都記錄深度,判定到有葉子結點則更新下max和min的值,直到遍歷完
BFS,一層層的掃,判定是不是葉子結點,第一個到達葉子結點的是最小深度。最後一個到達的葉子節點是最大深度

URL:https://leetcode.com/problems/maximum-depth-of-binary-tree/
https://leetcode.com/problems/minimum-depth-of-binary-tree/

3、給出n對括號,生成有效的括號組合
思路:數學歸納法,推出n有多少種情況
深度優先搜索,給出n對括號,字符串長度固是定的2n。相當於給2n的格子,每個格子有左括號、右括號的選擇。總共有2^2n種可能,最後進行過濾
基於DFS的基礎上進行優化,不合法的直接不進行遞歸,比如直接使用右括號開頭的,把左右括號使用掉的個數記錄下來,最終只能使用到n,程序停止
URL:https://leetcode.com/problems/generate-parentheses/


剪枝
定義:在對樹、圖、狀態集等等的搜索中經常使用到的一種過濾,可以很好的降低搜索的複雜性。
類比:圍棋比象棋更加的複雜,圍棋的空間狀態比較多,可能性也很多。alpha go就是複雜的搜索樹加上剪枝的方式(過濾掉不必要的搜索高度),快速把對方戰勝。

面試題
1、N皇后問題
思路:暴力破解的做法,把二維的平面每一個格子進行掃一遍看看能不能放Q
使用深度搜索優先,每一層判定能不能放Q
接著數組把行、列、撇、捺的位置都表示出來,然後利用剪枝進行過濾。只要在橫豎撇捺位置都沒有Q覆蓋的地方才能放新的Q

URL:https://leetcode.com/problems/n-queens/
https://leetcode.com/problems/n-queens-ii/

2、數獨問題
思路:用計算機去實現類似人的思考方式,不斷去填充,有衝突進行回溯。田數字1-9,並且判定在橫豎3x3裡面沒有重複才能放置。利用策略儘可能少的去搜索判定,從選擇少的地方進行枚舉更容易確定下來

URL:https://leetcode.com/problems/sudoku-solver/
https://leetcode.com/problems/valid-sudoku/


二分查找
符合以下三個要求的適合使用二分查找
1、Sorted(單調遞增或遞減)

2、Bounded(存在上下界)

3、Accessible by index(能夠通過索引訪問)


面試題
1、求一個數的平方根
思路:二分法,不斷的去二分枚舉然後和原值比較
牛頓迭代法
URL:https://leetcode.com/problems/sqrtx/
https://leetcode.com/problems/valid-perfect-square/


Trie樹

定義:Trie樹,即字典樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。核心思想是空間換時間,利用字符串的公共前綴來降低查詢時間的開銷。
應用:用於統計和排序大量的字符串(不限於字符串),還被搜尋引擎用於文本詞頻統計。
優點:最大限度減少無謂的字符串比較,查詢效率比哈希表高。

面試題

1、實現一個字典樹
思路:需要實現插入、查找、查找前綴。我們可以把單詞排序好然後去字典樹中找。
URL:https://leetcode.com/problems/implement-trie-prefix-tree/

2、二維網格中單詞搜索問題
思路:使用深度搜索優選遍歷進行搜索,看看能不能找到
把要搜索的單詞放到字典樹中,然後去網格中枚舉看是不是能走到字典樹的葉子節點
URL:https://leetcode-cn.com/problems/word-search-ii/

未完待續...


相關焦點

  • 我們到底該如何學習《數據結構與算法》
    既然數據結構與算法重要,到底哪個地方重要呢?下面就來說說:2、重要性體現第一:面試面試確實是第一個體現的點,因為你會發現,面試外企的時候他們第一件事就是啥都不問,上來就是幾道算法題。包括國內的字節跳動。現在的阿里、騰訊、華為、美團。凡是大家知道的那些大廠基本上上來就是先敲代碼。可以看出國內外大廠對於算法與數據結構的看重。
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 阿里三面慘遭被虐,關於數據結構與算法竟然一竅不通!
    以Java為描述語言,介紹計算機編程中使用的數據結構和算法,覆蓋相應競爭性考試的主題,目的不是提供關於數據結構和算法的定理及證明,而是強調問題及其分析,講解必備知識和解題技巧。書中匯集知名IT企業經典的編程面試題目並給出解題思路,為學生應試和軟體開發人員面試提供有益指導。本書特點:所有代碼用Java實現。數據結構難點啟發思考。為每個問題列舉可能的解決辦法。
  • 從數據結構到算法:圖網絡方法初探
    什麼是圖圖是一種常見的數據結構,用於表示對象及其之間的關係。其中,對象又稱節點(node)或頂點(vertex),關係用邊(edge)來描述。因此也催化出一系列在圖上進行數據挖掘的任務,如為用戶推薦感興趣的好友、判斷蛋白質結構、預測交通流量、檢測異常帳戶等等。但是真實圖的數據量龐大,動輒上億節點、而且內部拓撲結構複雜,很難將傳統的圖分析方法如最短路徑、DFS、BFS、PageRank 等算法應用到這些任務上。鑑於機器學習在圖像、文本領域的廣泛應用,一部分研究者嘗試將機器學習方法和圖數據結合起來,逐漸成為機器學習領域的一股熱潮。
  • 數據結構與算法分析筆記——B樹
    數據結構與算法分析筆記——B樹B樹AVL樹的特徵是,通過在插入或刪除時的微調,使得整個樹中任意節點的左子樹和右子樹之間的高度差不超過1。這樣的結果是,整棵樹的高度不至於太高。那麼,如果我們想要得到一棵更低的樹?該如何呢?
  • 2018國家電網考試備考計算機之數據結構與算法(6)
    2018國家電網考試備考計算機之數據結構與算法(6)由北京事業單位考試網提供:更多關於2018國家電網考試,計算機數據結構與算法,事業單位考試網的內容請關注北京事業單位考試網!或關注北京華圖微信公眾號(bjhuatu),事業單位培訓諮詢電話:400-010-1568。
  • 微軟、優步,老工程師告訴你哪些數據結構和算法最重要
    一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。
  • 常用數據無損壓縮算法分析
    事實上,從壓縮軟體WINRAR到熟知的MP3,數據壓縮技術早已應用於各個領域。2 數據壓縮技術概述 本質上壓縮數據是因為數據自身具有冗餘性。數據壓縮是利用各種算法將數據冗餘壓縮到最小,並儘可能地減少失真,從而提高傳輸效率和節約存儲空間。 數據壓縮技術一般分為有損壓縮和無損壓縮。
  • 固定幾何結構的FFT算法及其FPGA實現
    FFT算法多種多樣,按數據組合方式不同一般分時域和頻域,按數據抽取方式的不同又可分為基2,基4等。各算法的優缺點視不同的制約因素而不同。FFT的實現方法也多種多樣,可以用軟體實現,也可以用硬體實現,用軟體在PC機或工作站上實現則計算速度很慢。一般多結合具體系統用硬體實現。例如用單片機或DSP實現。但是速度仍然很慢,難以與快速的A/D器件匹配。
  • Java數據結構和算法——圖
    1.1圖的概念圖(Graph),是一種複雜的非線性表結構,圖的元素我們就叫做頂點(vertex),一個頂點可以與任意其他頂點建立連接關係,這種建立的關係叫做邊(edge),頂點相連接的邊的條數叫做度(degree) 。邊有方向的圖叫做有向圖 ,邊無方向的圖叫無向圖 。
  • Java數據結構的線性結構和非線性結構,這篇足夠了
    數據結構與算法,可以說是程式設計師的靈魂。大家在找工作面試的時候,尤其是大網際網路公司面試的時候,數據結構與算法必問,想要學好數據結構,首先你要高效而愉快地學習,作為優秀的程式設計師它可以在海量數據計算的時候,依然保持高速地計算。
  • 數據結構框架概述
    數據結構(data structure)是帶有結構特性的數據元素的集合,它研究的是數據的邏輯結構和數據的物理結構以及它們之間的相互關係,並對這種結構定義相適應的運算,設計出相應的算法,並確保經過這些運算以後所得到的新結構仍保持原來的結構類型。簡而言之,數據結構是相互之間存在一種或多種特定關係的數據元素的集合,即帶「結構」的數據元素的集合。
  • 數據科學家應該知道的頂級機器學習算法
    示例算法包括邏輯回歸和反向傳播神經網絡。無監督學習在此無監督機器學習中,輸入數據未標記並且沒有已知結果。我們必須通過推導輸入數據中存在的結構來準備模型。這可能是提取一般規則。可以通過數學過程來減少冗餘。示例問題包括聚類,降維和關聯規則學習。示例算法包括Apriori算法和k-Means。半監督學習輸入數據是帶標籤和未帶標籤的示例的混合。存在期望的預測問題。
  • 資料|《常用數據挖掘算法總結及 Python 實現》
    今日資料推薦《 常用數據挖掘算法總結及 Python 實現 》這份資源非常適合相關的從業人員或大數據愛好者,該文檔總結了常用的數據挖掘的算法原理以及 Python 實踐內容,為初學者提供良好的參考資料第五部分:Python 數據預處理第六部分:數據結構與算法第七部分:SQL 知識第八部分:數據挖掘案列分析
  • 吳信東:數據挖掘算法的經典與現代
    其中,明略科技首席科學家、明略科學院院長吳信東做了題為《數據挖掘算法回顧:經典與現代》報告,總時長為1個小時左右,內容主要分為三個部分:數據挖掘中代表性的領域、數據挖掘的經典算法、2006年之後的現代數據挖掘技術。下文是本場報告的文字版,由 AI 科技評論編輯。
  • 基2 FFT 算法的模塊化硬體實現與比較
    通過時序調用可組成不同結構的 FFT 處理器,實現流水結構與遞歸結構兩種方案,分別側重於處理速度與資源佔用量兩方面的優勢。在FPGA硬體設計中使用 Verilog 語言完成代碼編程,實現了兩種結構的 512 點基 2 算法的快速傅立葉變換,使用 Modelsim 完成功能仿真。與 MATLAB 中 FFT 函數對比驗證了結果的正確性。
  • 【乾貨】數據挖掘中算法學習的2條進擊路線
    這說明你尚不具備深入開展數據挖掘算法學習的能力。你會發現到處都是門檻,很難繼續進行下去。 第二條路線K-means →EM → 樸素貝葉斯→貝葉斯網絡→隱馬爾科夫模型(基本模型、前向算法、維特比算法、前向-後向算法) →卡爾曼濾波這條線路所涉及的基本都是那些各種畫來畫去的圖模型,學術名詞稱為 PGM 。這條線的思路和第一條是截然不同的!
  • 數據結構基本概念
    一、什麼是數據結構1、用計算機解決一個具體問題的步驟(1)分析問題,確定數據模型。(2)設計相應的算法。(3)編寫程序,運行並調試程序直至得到正確的結果。(2)數據對象數據對象是性質相同的有限個數據元素的集合,它是數據的一個子集。如大寫字母數據對象是集合C={'A','B','C',…,'Z'};1~100的整數數據對象是集合N={1,2,…,100}。註:默認情況下,數據結構中的數據都指的是數據對象。
  • 數據驅動歸因的幾個算法
    數據驅動歸因,英文是Data-Driven Attribution,簡稱DDA,或數據驅動歸因模型,英文是Data-Driven Attribution Models,簡稱DDAM,也叫算法歸因。自Google 宣布即將推出歸因模型以來,廣告主對新的數據驅動模型表現出很大興趣。
  • 人工智慧算法有助於快速分析蛋白質摺疊結構
    近日,英國《自然》雜誌報導,美國哈佛大學醫學院生物學家AlQuraishi開發出新型人工智慧算法,能夠快速分析預測蛋白質三維結構,大大提高蛋白質三維結構預測的效率,將預測時間從若干小時或幾天縮短至幾毫秒