互聯網_數據結構

數據結構

  • 數組
  • 棧,先進後出
  • 隊列,先進先出
  • 雙端隊列,雙端隊列中的元素能夠從兩端彈出,插入和刪除操做限定在隊列的兩邊進行。
  • 環形隊列,環形隊列是一種特殊的隊列結構,保證了元素也是先進先出的,但與通常隊列的區別是,他們是環形的,即隊列頭部的上個元素是隊列尾部,一般是容納元素數固定的一個閉環。
  • 堆,一種特別的樹狀數據結構。堆老是一棵徹底樹。即除了最底層,其餘層的節點都被元素填滿,且最底層儘量地從左到右填入。
  • 鏈表
  • 單向鏈表。
  • 雙向鏈表。
  • 跳錶,一種帶多級索引的鏈表。
  • 散列表,是根據鍵而直接訪問在內存存儲位置的數據結構。它經過計算一個關於鍵值的函數,將所需查詢的數據映射到表中一個位置來訪問記錄,這加快了查找速度。
  • 二叉樹,二叉樹是一個連通的無環圖,而且每個頂點的度不大於3。
  • 紅黑樹,是一種自平衡二叉查找樹。
  • 字典樹(Trie)
  • 圖(Graph)是由頂點的有窮非空集合和頂點之間的邊的集合組成。
  • TODO
  • 布隆過濾器,一個機率型數據結構,能夠用來判斷一個元素是否在一個集合中。判斷某個元素在,可能會被誤判;判斷某個元素不在,那麼必定不在。

算法思想

分治法

分治法是基於多項分支遞歸的一種很重要的算法範式。字面上的解釋是「分而治之」,就是把一個複雜的問題分紅兩個或更多的相同或類似的子問題,直到最後子問題能夠簡單的直接求解,原問題的解即子問題的解的合併。算法

例子:快排、歸併排序、MapReduce數組

貪心算法

貪心算法就是在每一步的選擇中都按照當前最優的選擇,從而但願最終結果獲得最優解。貪心算法在有最優子結構的問題中尤其有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題可以分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。
貪心算法與動態規劃的不一樣在於它對每一個子問題的解決方案都作出選擇,不能回退。動態規劃則會保存之前的運算結果,並根據之前的結果對當前進行選擇,有回退功能。數據結構

例子:最小生成樹、哈夫曼編碼函數

動態規劃(Dynamic Programming)

動態規劃經過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。經常適用於有重疊子問題和最優子結構性質的問題。
若要解一個給定問題,咱們須要解其不一樣部分(即子問題),再根據子問題的解以得出原問題的解。一般許多子問題很是類似,爲此動態規劃法試圖僅僅解決每一個子問題一次,從而減小計算量:一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次須要同一個子問題解之時直接查表。這種作法在重複子問題的數目關於輸入的規模呈指數增加時特別有用。優化

遞歸+記憶=遞推

適用狀況:編碼

  1. 具備最優子結構性質。
  2. 無後效性,子問題肯定後不會再改變。
  3. 子問題重疊的性質。

例子:揹包問題人工智能

回溯法(backtracking) 設計

回溯法採用試錯的思想,它嘗試分步的去解決一個問題。在分步解決問題的過程當中,當它經過嘗試發現現有的分步答案不能獲得有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再經過其它的可能的分步解答再次嘗試尋找問題的答案。回溯法一般用最簡單的遞歸方法來實現,在反覆重複上述的步驟後可能出現兩種狀況:排序

  1. 找到一個可能存在的正確的答案
  2. 在嘗試了全部可能的分步方法後宣告該問題沒有答案

在最壞的狀況下,回溯法會致使一次複雜度爲指數時間的計算。遞歸

例子:八皇后問題

分支界限法

與貪婪算法同樣,這種方法也是用來爲組合優化問題設計求解算法的,所不一樣的是它在問題的整個可能解空間搜索,所設計出來的算法雖其時間複雜度比貪婪算法高,但它的優勢是與窮舉法相似,都能保證求出問題的最佳解,並且這種方法不是盲目的窮舉搜索,而是在搜索過程當中經過限界,能夠中途中止對某些不可能獲得最優解的子空間進一步搜索(相似於人工智能中的剪枝),故它比窮舉法效率更高。

機率算法

例子: 數值隨機化算法 蒙特卡羅(Monte Carlo)算法 拉斯維加斯(Las Vegas)算法 舍伍德(Sherwood)算法

相關文章
相關標籤/搜索