1. 程式人生 > >資料結構與演算法2

資料結構與演算法2

資料結構與演算法常見基礎問題總結

  1. 什麼是資料結構?
    資料結構是指相互之間存在一種或多種特定關係的資料結構集合。即資料和資料之間的關係。
  2. 資料的儲存結構是怎樣的?
    分為順序儲存和鏈式儲存。
    順序儲存類似食堂打飯排隊,中間加塞需要後面的人全部後移;
    鏈式儲存類似銀行取號機制排隊辦理業務,依靠號碼進行排隊,加塞只需給個最小號-1就可以。
  3. 資料的邏輯結構是什麼?
    分為線性結構、樹形結構、集合(雜湊表)結構、圖形結構四種。
    線性結構中元素的關係為一對一的關係;
    樹形結構中元素的關係為一對多的關係;
    集合結構中元素同屬於一個集合,為並列關係;
    圖形結構中元素的關係為多對多的關係;
  4. 什麼是演算法?
    演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述演算法問題的策略機制。
    簡而言之,演算法就是解決問題的思路。
  5. 演算法有什麼特性?
    演算法有5個特性,分別是輸入、輸出、有窮性、確定性、可行性。
  6. 演算法有什麼要求?
    演算法的要求有5個方面,分別是正確性、可讀性、健壯性、時間複雜度、空間複雜度。
  7. 如何衡量演算法的優劣?
    衡量演算法一般有事後統計和事前分析估算的方法。
  8. 線性結構有哪些?
    線性結構一般有一維陣列、棧、佇列、連結串列等結構。
  9. 陣列的查詢演算法有哪些?
    陣列查詢可以通過線性查詢法(逐個遍歷)和二分查詢法(前提是有序)進行查詢匹配。
  10. 棧與佇列的區別是什麼?
    棧是一種先進後出的資料結構,類似手槍子彈上彈夾,先放進去的子彈最後被打出來;
    佇列是一種先進先出的資料結構,類似於銀行辦理業務排隊,先排隊的先辦理業務。
  11. 連結串列都有哪些,他們的資料結構是什麼樣的?
    連結串列有單向連結串列、單向迴圈連結串列、雙向連結串列和雙向迴圈連結串列四種。
    單向連結串列的資料結構是節點內容+下一個節點引用的結構;最後一個節點的下一個節點為NULL;
    單向迴圈連結串列與單向連結串列的區別是單向迴圈連結串列的最後一個節點的下一個節點指向第一個節點;
    雙向連結串列(非迴圈)的資料結構是上一個節點引用+節點的內容+下一個節點引用的結構,最後一個節點的下一個節點為null,第一個節點的上一個節點為null;
    雙向迴圈連結串列與雙向連結串列的區別是最後一個節點的下一個節點指向第一個節點,第一個節點的上一個節點指向最後一個節點。
  12. 什麼是遞迴?
    遞迴是在一個方法內部呼叫該方法本身的程式設計方式。
  13. 什麼是樹結構?
    樹結構是一種非線性資料結構,它的資料元素(在樹中稱為結點)按分支關係組織起來的結構,很象自然界中的樹。
  14. 樹結構有哪些?
    樹結構有二叉樹、線索二叉樹、赫夫曼樹、二叉排序樹、二叉平衡樹和多路查詢樹等樹結構。
  15. 什麼是滿二叉樹,什麼是完全二叉樹?
    滿二叉樹中,所有葉子節點都在最後一層且節點的總數為(2^n-1)個,n為樹的高度。
    完全二叉樹中,所有葉子節點都在最後一層或者倒數第二層且最後一層的葉子節點在左邊連續,倒數第二層的葉子節點在右邊連續(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹 );
  16. 鏈式儲存的二叉樹和順序儲存的二叉樹有什麼區別?
    鏈式儲存是使用連結串列關聯引用儲存;
    順序儲存的二叉樹儲存資料在陣列中,從第一層開始從左到右依次填入陣列中,順序儲存的二叉樹通常只儲存完全二叉樹(即陣列中間不會有空值)。
  17. 樹的遍歷有幾種方式?
    遍歷分為前序遍歷、中序遍歷、後序遍歷三種。
    前序遍歷:針對所有的節點,遍歷順序為父節點->左節點->右節點;
    中序遍歷:針對所有的節點,遍歷順序為左節點->父節點->右節點;
    後序遍歷:針對所有的節點,遍歷順序為左節點->右節點->父節點;
  18. 什麼是線索二叉樹?
    利用二叉連結串列中的空指標域,存放指向結點在某種遍歷次序下的前驅和後繼結點的指標(這種附加的指標稱為"線索"),加上線索的二叉樹稱為線索二叉樹。
  19. 線索二叉樹解決了什麼問題?
    線索連結串列解決了無法直接找到該結點在某種遍歷序列中的前驅和後繼結點的問題,解決了二叉連結串列找左、右孩子困難的問題。
    二叉樹的遍歷本質上是將一個複雜的非線性結構轉換為線性結構,使每個結點都有了唯一前驅和後繼(第一個結點無前驅,最後一個結點無後繼)。對於二叉樹的一個結點,查詢其左右子女是方便的,其前驅後繼只有在遍歷中得到。為了容易找到前驅和後繼,調整二叉樹節點資料結構來很方便的找到其前驅後繼節點。
  20. 什麼是赫夫曼樹?
    給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。
  21. 赫夫曼樹有什麼特點?
    哈夫曼樹的構建方式為子下而上開始構建,權值較大的結點離根較近。
  22. 赫夫曼樹結構在實際中有什麼應用?
    資料壓縮,依據資料的出現頻率進行編碼,出現頻率越高,編碼越短,且所有編碼不會出現部分重複導致混淆,最終實現縮短整體編碼的目標。
  23. 什麼是二叉排序樹?
    二叉排序樹又稱二叉查詢樹、二叉搜尋樹,左子樹的最大值小於根節點,右子樹的最小值大於根節點,且沒有鍵值相等的節點稱為二叉排序樹。
  24. 什麼是二叉平衡樹?
    它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
  25. 插入資料時如何始終保持二叉平衡樹始終保持平衡?
    通過單旋和雙旋的方式。
  26. 什麼是多路查詢樹?
    多路就是子樹超過2個的樹,B樹和B+樹是多路查詢樹。
  27. B樹與B+樹的區別是什麼?
    單一節點儲存更多的元素,使得查詢的IO次數更少
    所有查詢都要查詢到葉子節點,查詢效能穩定
    所有葉子節點形成有序連結串列,便於範圍查詢
  28. 什麼是雜湊表(散列表,集合結構)資料結構?
    雜湊表就是一種以 鍵-值(key-indexed) 儲存資料的結構,我們只要輸入待查詢的值即key,即可查詢到其對應的值。
    如果所有的鍵都是整數,那麼就可以使用一個簡單的無序陣列來實現:將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值
  29. 什麼是Hash函式?
    建立起資料元素的存放位置與資料元素的關鍵字之間的對應關係的函式被稱為雜湊函式。
  30. 有哪些雜湊表的構造方法?
    有直接定址法、數字分析法、平方取中法、取餘法、隨機數法。
  31. 如何使用Hash表結構?
    儲存資料時,將資料存入通過雜湊函式計算所得哪那個地址裡面。
    查詢時,使用同一個雜湊函式通過關鍵字key計算出儲存地址,通過該地址即可訪問到查詢的記錄。
  32. Hash函式有什麼要求?
    雜湊函式需要易於計算並且能夠均勻分佈所有鍵。
  33. 如何解決雜湊衝突問題?
    可以通過開放地址法和鏈地址法處理,開放地址法包括線性探測法、二次探測法、再雜湊法。
  34. 什麼是圖結構?
    結點之間的鄰接關係是任意的一種資料結構。
  35. 圖結構的遍歷方式有幾種?
    有深度優先遍歷和廣度優先遍歷兩種。
  36. 列舉常用的排序演算法
    常用的排序演算法有交換排序(氣泡排序和快速排序)、插入排序(直接插入排序和希爾排序)、選擇排序(簡單選擇排序和堆排序)、歸併排序和基數排序。
  37. 簡述氣泡排序和快速排序的原理
    氣泡排序是比較兩個相鄰的元素,將值大的元素交換到右端。
    快速排序(Quicksort)是對氣泡排序的一種改進。首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
  38. 簡述直接插入排序和希爾排序的原理
    直接插入排序基本思想是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。一般是把第一個元素看作是一個有序的序列,不斷地將待排序記錄插入到有序序列中,最後整個序列都是一個有序序列。
    希爾排序是直接插入排序的改進版,又稱縮小增量排序,其原理是將序列按照一定步長(間隔)分為若干個子序列,然後對每一個子序列進行簡單插入排序,排序之後縮短步長再次進行子序列排序,最終步長為1進行簡單插入排序,整個的排序過程每一個元素會不斷接近它最終的位置。
  39. 簡述簡單選擇排序和堆排序的原理
    簡單選擇排序是每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排序的記錄序列末尾,直到全部排序結束為止。
    堆排序就是將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了。大頂堆:每個節點都大於等於左右孩子節點的值,小頂堆:每個節點都小於等於左右孩子節點的值。
  40. 簡述歸併排序的原理
    歸併排序是將兩個有序序列歸併為一個有序序列的過程,對於一個序列,可以通過遞迴不斷拆分成兩個更小的序列,最終拆到長度為0或者1的兩個序列,然後兩兩歸併,最後整個序列有序。
  41. 簡述基數排序的原理
    基數排序是將整數按位數切割成不同的數字,然後按每個位數分別比較,比如至多三位數的整數,先按照各位大小進行排序,再按照十位大小進行排序,最後按照百位進行排序,最終成為有序序列,不足三位補零,前提是必須知道序列中最大的數才能使用基數排序。