資料結構簡單題

weixin_42176038發表於2020-10-15

選擇和評價資料結構標準和方法
P13

1.演算法的時間複雜度:
答:在程式中反覆執行的語句的執行次數被稱為語句的頻度,時間複雜度就是所有語句頻度之和的數量級,而所有語句的頻度之和與程式最內層迴圈的頻度是同一個數量級,所以演算法的時間複雜度是最內層迴圈的頻度的數量級

補充:演算法設計的步驟:
1.建立資料模型
2.確定資料結構與演算法
3.選用語言
4.除錯並執行

2.空間複雜度:
答:程式在執行時所佔的空間
直接插入排序的空間複雜度是O(1),遞迴的空間複雜度是O(n)

4.資料的儲存結構:
答:
(1)順序儲存:邏輯上相鄰的兩個元素的物理位置也相鄰。
優點:能夠隨機存取。
缺點:插入刪除需要移動大量的元素,不方便。

(2)鏈式儲存:邏輯上相鄰的兩個元素的物理位置不一定相鄰,每個結點用一個指標來找到下一個結點的位置。
優點:插入和刪除很方便
缺點:隨機讀取時不方便,需要從第一個結點開始遍歷

(3)索引儲存:在儲存時,還附加建立索引表,索引表中的每一項稱為索引項,索引項的一般形式是(關鍵字,地址)
優點:檢索速度快
缺點:索引表佔用儲存空間,並且插入和刪除一個資料時,對應的索引項也要插入和刪除,會耗費較多的時間

(4)雜湊儲存:通過函式,根據資料的元素的關鍵字計算該元素的地址
優點:檢索、增加和刪除結點的操作比較快
缺點:可能會出現元素儲存單元的衝突,解決衝突又需要增加時間和空間的開銷

5.迴圈比遞迴的效率一定高嗎?
答:迴圈和遞迴能夠實現相互轉換,且各自有自己的優缺點,判斷誰的效率高是沒有絕對的答案的。

遞迴:
優點:程式碼簡潔清晰、容易實現
缺點:當遞迴次數很多時,需要增加額外的堆疊處理,有可能產生堆疊溢位的現象

迴圈:
優點:結構簡單,速度快,效率高
缺點:不容易理解,編寫複雜程式碼時會比較困難

6.順序表和連結串列的比較:
答:順序表和連結串列可以從四個大的方向去比較。
(1)存取(讀取)方式:順序表能夠隨機讀取和順序讀取,而連結串列只能按順序讀取
(2)查詢:如果是按值查詢並且表無序時,順序表和連結串列的時間複雜度都是O(n),如果表有序,則可以用折半查詢法,時間複雜度是O(nlog2n);如果是按序號查詢,則順序表支援隨機查詢,時間複雜度是O(1),而連結串列的時間複雜度是O(n)
(3)插入和刪除:順序表插入和刪除需要移動大量的元素,時間複雜度是O(n),連結串列的插入和刪除只需要修改指標的位置,時間複雜度是O(1)
(4)空間分配:順序表的空間分配分為靜態分配和動態分配,靜態記憶體分配時,很容易導致記憶體溢位或者是浪費,而動態記憶體分配時,有時候不存在一大塊連續的儲存空間,導致分配失敗,並且需要移動大量的元素,效率低。
而連結串列是直接在需要的時候申請記憶體,只要有記憶體就能夠分配,操作靈活、高效。

7.頭指標和頭結點的區別:
答:頭指標是指在第一個結點之前的指標,它是一個連結串列存在的標誌,是必須存在必不可少的。
頭結點是第一個結點之前的結點,它是為了方面在第一個結點之前進行元素的插入和刪除操作,它不是必須的,並且資料域也可以不存放資訊。

8.棧和佇列的區別:
答:棧是隻能在一端進行插入和刪除的線性表,插入和刪除都在棧頂進行,它的特點是“先進後出”。常用於瀏覽器的回退或者是括號的匹配問題,遞迴問題,但是遞迴問題要注意堆疊的溢位現象

佇列是在一端插入在另一端刪除的線性表,插入的那端是隊尾,刪除的那端是隊首,特點是“先進先出”,在層次遍歷和BFS演算法、狄傑斯特拉演算法中使用到

9.共享棧:
答:利用棧底位置不變的特性,讓兩個順序棧共享同一個一維陣列空間,將兩個棧的棧底分別設在共享空間的兩端,兩個棧頂向共享空間延伸。

10.如何區分迴圈佇列是隊空還是隊滿?
答:有兩種區分方式:
第一種:犧牲一個單元來區分隊空和隊滿
隊空的標誌是 隊首指標 = = 隊尾指標;
隊滿的標誌是(隊尾指標+1)%maxsize ==隊首指標

第二種: 型別中增設表示元素資料的記憶體單元
隊空:元素的個數為0
隊滿:元素的個數為Maxsize

11.棧在括號匹配中的演算法思想:
答:(1)如果是左括號,則入棧
(2)如果是右括號,則判斷當前棧是否為空,如果為空,則不匹配,不為空,則看是否與棧頂的左括號匹配,如果匹配,則棧頂元素出棧
(2)最終所有的元素都進棧和出棧完畢,檢查棧是否為空,如果不為空,則說明還有多餘的左括號沒有匹配,因此括號匹配失敗,如果為空,則括號匹配成功。

12.棧在字尾表示式求值的演算法思想:
答:掃描表示式的每一項
(1)如果是運算元,則進棧
(2)如果是運算子,則從棧中退出兩個元素,進行出棧,並且將得到的結果入棧
(3)表示式的所有項都掃描完後,最後棧頂存放的元素就是最終的結果。

13.棧在遞迴中的應用:
答:若在一個函式、一個過程或者一個資料結構的定義中直接或者間接的呼叫了它自身,則這個函式、這個過程、這個資料結構稱為是遞迴定義的,簡稱為遞迴。
遞迴問題只需要少數的程式碼就能夠描述出解題過程中所需要的多次重複計算,大大減少了程式的程式碼量,遞迴所用到的是系統管理棧,但是通常情況下,每次遞迴都要保留現場,空間複雜度為O(n),效率不高,並且當遞迴次數過深的時候,容易出現堆疊溢位的現象。
將遞迴轉化成非遞迴演算法,也是用棧來實現的。相比起遞迴演算法的系統管理棧,需要建一個自己管理的棧。

14.佇列在層次遍歷中的作用:
答:首先根結點入隊,接著隊根結點的子結點進行預處理,等預處理完後,根結點出隊,接著剛剛處理的子結點入隊,這部分的子結點又進行預處理,直到所有的結點都入隊出隊處理完畢。

15.佇列在計算機系統中的應用:
答:有兩個方面的應用:
(1)解決了主機和外部裝置之間速度不匹配的問題
以主機和印表機為例,主機輸出資料的速度比印表機輸出資料的速度要快很多,由於速度不匹配,直接把輸出的資料給印表機肯定是不行的,於是需要設定一個緩衝區,主機將一部分要列印的資料寫入緩衝區,寫滿後就暫停輸出,轉去做其他的事情,而印表機就從緩衝區中按照先進先出的原則依次取出資料並列印出來,列印完後向主機發出請求。這裡的列印緩衝區就是一個佇列。

(2)CPU資源的競爭
答:在一個多終端的計算機系統中,多個使用者需要CPU各自執行自己的程式,分別通過各自的終端向作業系統提出佔用CPU的請求。作業系統按照每個請求在時間上的先後順序,將他們排成一個佇列,每次把CPU分配給隊首請求的使用者使用。當相應的程式執行結束或者用完規定的時間間隔後,令其出隊,再把CPU分配給新的隊首請求的使用者使用。

16.矩陣的壓縮技術:
答:針對特殊的矩陣進行壓縮儲存
對稱矩陣:含有大量相同元素的矩陣
稀疏矩陣、上(下)三角矩陣:含有大量0元素的矩陣

壓縮思想:矩陣中相同的資料元素(包括元素0)只儲存一個

18.遞迴轉換成非遞迴為什麼要用棧:
答:在實現函式呼叫的時候,系統底層就是用棧來保護現場的;具體來說,每次呼叫函式時,會把當前函式的區域性變數和返回地址都壓棧儲存起來,當系統呼叫結束返回時,再把區域性變數從棧中彈出來;
遞迴的核心就是重複的函式呼叫,如果要變成非遞迴,就需要自己實現棧的資料結構來儲存一些狀態變數,這其實就是模擬函式的呼叫。

19.堆排序:
堆:是一種特殊的完全二叉樹,葉子結點的值大於或者小於根結點的值
(PS:完全二叉樹是指第n-1層,每一層的結點數是2^(n-1),最後一層的結點可以不放滿,但是必須是從左至右放的)

堆排序:最好、最壞、平均時間複雜度是O(nlogn)
思想:(以大根堆為例)將待排序的構造成一個大根堆,此時最大的元素就是根結點的元素,這時候,將這個元素與末尾的元素進行交換,然後再將剩下的n-1個元素構造成一個大根堆,就會形成一個有序 區。

步驟:
(1)構造初始堆
a.建立一個完全二叉樹
b.從最後一個非葉子結點開始調整,一旦比根結點大,則與根結點進行交換,最終最大的元素位於根結點的位置上
(2)將堆頂元素與末尾元素進行交換,末尾的元素值最大
(3)重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素當前末尾元素,反覆執行+調整步驟,直到整個序列有序。

鄰接表與鄰接矩陣有什麼異同之處?

聯絡:鄰接表中每個連結串列對應於鄰接矩陣中的一行,連結串列中結點個數等於一行中非零元素的個數。

區別: ① 對於任一確定的無向圖,鄰接矩陣是唯一的(行列號與頂點編號一致),但鄰接表不唯一(連結次序與頂點編號無關)。 ② 鄰接矩陣的空間複雜度為O(n2),而鄰接表的空間複雜度為O(n+e)。

用途:鄰接矩陣多用於稠密圖的儲存(e接近n(n-1)/2);而鄰接表多用於稀疏圖的儲存(e<<n2)

相關文章