計算機考研複試面試常問問題 數據結構篇(上)

計算機考研複試面試常問問題 數據結構篇(上)

使用前需知(拒絕白嫖,若是對你有幫助,你只需點個贊就行):

須要pdf直接打印版,可在公衆號"程序員寶藏"回覆複試上岸獲取(會持續更新)程序員

在複習過程當中,我用心查閱並整理了在考研複試面試中可能問到的大部分問題,並分點整理了答案,能夠直接理解背誦並加上本身的語言潤色!極力推薦打印下來看,效率更高!面試

聲明:一些邊邊角角的沒有收集,畢竟是考研面試,不是筆試,這樣也能減輕你們的負擔!算法

此係列一共有8篇:編程語言篇**|數據結構篇|操做系統篇|組成原理篇|計算機網絡篇|數據庫篇|軟件工程篇|計算機專業英語篇**(還未所有完成,敬請期待,大家的支持和關注是我最大的動力!)數據庫

我的整理,不可用於商業用途,轉載請註明出處。編程

須要408電子書2021版,可在公衆號"程序員寶藏"回覆408電子書獲取數組

須要408初試視頻2021版,可在公衆號"程序員寶藏"回覆408視頻獲取網絡

須要複試機試視頻,可在公衆號"程序員寶藏"回覆機試必過獲取數據結構

加油,你們均可以上岸!!!讓咱們一塊兒努力!!!框架


 

 

第一章、緒論

快速喚起記憶知識框架:編程語言


1 .時間複雜度

ps:我看到一個學長回憶說老師問了他 大O 是什麼意思???若是是我,估計當場矇蔽了,畢竟平時知道作題就行,也沒仔細看 大O 什麼意思,因此你們仍是看看這題。有備無患。

一個語句的頻度是指該語句在算法中被重複執行的次數。算法中全部語句的頻度之和記爲T(n), 它是該算法問題規模n 的函數,時間複雜度主要分析T(n) 的數量級。算法中基本運算(最深層循環內的語句)的頻度與T(n) 同數量級,所以一般採用算法中基本運算的頻度f(n)來分析算法的時間複雜度。所以,算法的時間複雜度記爲 T(n) = O(f(n))

取f(n) 中隨n 增加最快的項,將其係數置爲1 做爲時間複雜度的度量。例如, f(n) = an^3^ + bn^2^ + cn 的時向複雜度爲O(n^3^)

上式中, O 的含義是T(n) 的數量級,其嚴格的數學定義是:若T(n)和f(n)是定義在正整數集合上的兩個函數,則存在正常數C 和n~0~,使得當n >= n~0~時,都知足0 <=T(n) <=Cf(n) 。 算法的時間複雜度不只依賴於問題的規模n, 也取決於待輸入數據的性質(如輸入數據元素 的初始狀態)


2.空間複雜度

算法的空間複雜度S(n)定義爲該算法所耗費的存儲空間,它是問題規模n 的函數。記爲 S(n) = O(g(n)) 一個程序在執行時除須要存儲空間來存放自己所用的指令、常數、變量和輸入數據外,還須要一些對數據進行操做的工做單元和存儲一些爲實現計算所需信息的輔助空間。若輸入數據所佔空間只取決於問題自己,和算法無關,則只需分析除輸入和程序以外的額外空間。 算法原地工做是指算法所需的輔助空間爲常量,即O(1) 。


3.數的邏輯結構

指的是數據元素之間邏輯關係,與數的存儲結構無關,是獨立於計算機的,如下是分類圖。


4.數的存儲結構

存儲結構是指數據結構在計算機中的表示,也稱物理結構,主要有如下4種:

  1. 順序存儲。把邏輯上相鄰的元素存儲在物理位置上也相鄰的存儲單元中,元素之間的關係由存儲單元的鄰接關係來體現。其優勢是能夠實現隨機存取,每一個元素佔用最少的存儲空間;缺點是隻能使用相鄰的一整塊存儲單元,所以可能產生較多的外部碎片。

  2. 鏈式存儲。不要求邏輯上相鄰的元素在物理位置上也相鄰,藉助指示元素存儲地址的指針來表示元素之間的邏輯關係。其優勢是不會出現碎片現象,能充分利用全部存儲單元;缺點是每一個元素因存儲指針而佔用額外的存儲空間,且只能實現順序存取。

  3. 索引存儲。在存儲元素信息的同時,還創建附加的索引表。索引表中的每項稱爲索引項,索引項的通常形式是(關鍵字,地址)。其優勢是檢索速度快;缺點是附加的索引表額外佔用存儲空間。另外,增長和刪除數據時也要修改索引表,於是會花費較多的時間。

  4. 散列存儲。根據元素的關鍵字直接計算出該元素的存儲地址,又稱哈希(Hash) 存儲。其優勢是檢索、增長和刪除結點的操做都很快;缺點是若散列函數很差,則可能出現元素存儲單元的衝突,而解決衝突會增長時間和空間開銷。

5.用循環比遞歸的效率高嗎?

循環和遞歸二者是能夠互換的,不能決定性的說循環的效率比遞歸高。

遞歸的優勢是:代碼簡潔清晰,容易檢查正確性;缺點是:當遞歸調用的次數較多時,要增長額外的堆棧處理,有可能產生堆棧溢出的狀況,對執行效率有必定的影響。

循環的優勢是:結構簡單,速度快;缺點是:它並不能解決所有問題,有的問題適合於用遞歸來解決不適合用循環。


6.貪心算法和動態規劃以及分治法的區別?

貪心算法顧名思義就是作出在當前看來是最好的結果,它不從總體上加以考慮,也就是局部最優解。貪心算法從上往下,從頂部一步一步最優,獲得最後的結果,它不能保證全局最優解,與貪心策略的選擇有關。

動態規劃是把問題分解成子問題,這些子問題可能有重複,能夠記錄下前面子問題的結果防止重複計算。動態規劃解決子問題,前一個子問題的解對後一個子問題產生必定的影響。在求解子問題的過程當中保留哪些有可能獲得最優的局部解,丟棄其餘局部解,直到解決最後一個問題時也就是初始問題的解。動態規劃是從下到上,一步一步找到全局最優解。(各子問題重疊)

分治法(divide-and-conquer):將原問題劃分紅n個規模較小而結構與原問題類似的子問題;遞歸地解決這些子問題,而後再合併其結果,就獲得原問題的解。(各子問題獨立)

分治模式在每一層遞歸上都有三個步驟:

分解(Divide):將原問題分解成一系列子問題; 解決(conquer):遞歸地解各個子問題。若子問題足夠小,則直接求解; 合併(Combine):將子問題的結果合併成原問題的解。

例如歸併排序。


第二章、線性表


快速喚起記憶知識框架:


7.順序表和鏈表的比較

1.存取(讀寫)方式 順序表能夠順序存取,也能夠隨機存取,鏈表只能從表頭順序存取元素。例如在第i個位置上執行存或取的操做,順序表僅需一次訪問,而鏈表則需從表頭開始依次訪問i次。

2.邏輯結構與物理結構 採用順序存儲時,邏輯上相鄰的元素,對應的物理存儲位置也相鄰。而採用鏈式存儲時,邏輯上相鄰的元素,物理存儲位置則不必定相鄰,對應的邏輯關係是經過指針連接來表示的。

3.查找、插入和刪除操做 對於按值查找,順序表無序時,二者的時間複雜度均爲O(n); 順序表有序時,可採用折半查找,此時的時間複雜度爲O(log2n) 。

對於按序號查找,順序表支持隨機訪問,時間複雜度僅爲0(1), 而鏈表的平均時間複雜度爲O(n) 。順序表的插入、刪除操做,平均須要移動半個表長的元素。鏈表的插入、刪除操做,只需修改相關結點的指針域便可。因爲鏈表的每一個結點都帶有指針域,故而存儲密度不夠大。

4.空間分配 順序存儲在靜態存儲分配情形下,一旦存儲空間裝滿就不能擴充,若再加入新元素,則會出現內存溢出,所以須要預先分配足夠大的存儲空間。預先分配過大,可能會致使順序表後部大量閒置;預先分配太小,又會形成溢出。動態存儲分配雖然存儲空間能夠擴充,但須要移動大量元素,致使操做效率下降,並且若內存中沒有更大塊的連續存儲空間,則會致使分配失敗。鏈式存儲的結點空間只在須要時申請分配,只要內存有空間就能夠分配,操做靈活、高效。


8.頭指針和頭結點的區別?

頭指針:是指向第一個節點存儲位置的指針,具備標識做用,頭指針是鏈表的必要元素,不管鏈表是否爲空,頭指針都存在。

頭結點:是放在第一個元素節點以前,便於在第一個元素節點以前進行插入和刪除的操做,頭結點不是鏈表的必須元素,無關緊要,頭結點的數據域也能夠不存儲任何信息。


第三章、棧和隊列


快速喚起記憶知識框架:


9.棧和隊列的區別?

隊列是容許在一段進行插入另外一端進行刪除的線性表。隊列顧名思義就像排隊同樣,對於進入隊列的元素按「先進先出」的規則處理,在表頭進行刪除在表尾進行插入。因爲隊列要進行頻繁的插入和刪除,通常爲了高效,選擇用定長數組來存儲隊列元素,在對隊列進行操做以前要判斷隊列是否爲空或是否已滿。若是想要動態長度也能夠用鏈表來存儲隊列,這時要記住隊頭和對位指針的地址。

棧是隻能在表尾進行插入和刪除操做的線性表。對於插入到棧的元素按「後進先出」的規則處理,插入和刪除操做都在棧頂進行,與隊列相似通常用定長數組存儲棧元素。因爲進棧和出棧都是在棧頂進行,所以要有一個size變量來記錄當前棧的大小,當進棧時size不能超過數組長度,size+1,出棧時棧不爲空,size-1。


10.共享棧

利用棧底位置相對不變的特性,可讓兩個順序棧共享一個一維數組空間,將兩個棧的棧底分別設置在共享空間的兩端,兩個棧頂向共享空間的中間延伸。這樣可以更有效的利用存儲空間,兩個棧的空間相互調節,只有在整個存儲空間被佔滿時才發生上溢。


11.如何區分循環隊列是隊空仍是隊滿?

普通狀況下,循環隊列隊空和隊滿的斷定條件是同樣的,都是Q.front == Q.rear。

ps:隊頭指針指向第一個數;隊尾指針指向最後一個數的下一個位置,即將要入隊的位置。

方法一:犧牲一個單元來區分隊空和隊滿,這個時候(Q.rear+1)%MaxSize == Q.front纔是隊滿標誌 。

方法二:類型中增設表示元素個數的數據成員。這樣,隊空的條件爲Q.size == 0;隊滿的條件爲Q.size == MaxSize。


12.棧在括號匹配中的算法思想?

括號匹配算法思想

(1)出現的凡是「左括號」,則進棧;

(2)出現的是「右括號」,

首先檢查棧是否空?

若棧空,則代表該「右括號」多餘

不然和棧頂元素比較?

若相匹配,則棧頂「左括號出棧」

不然代表不匹配

(3)表達式檢驗結束時,

若棧空,則代表表達式中匹配正確

不然代表「左括號」有餘;


13.棧在經過後綴表達式求值的算法思想?

順序掃描表達式的每一項,而後根據它的類型作以下相應操做:若該項是操做數,則將其壓入棧中;若該項是操做符,則連續從棧中退出兩個操做數y 和x, 造成運算指令XY, 並將計算結果從新壓入棧中。當表達式的全部項都掃描並處理完後,棧頂存放的就是最後的計算結果。


14.棧在遞歸中的應用?

遞歸是一種重要的程序設計方法。簡單地說,若在一個函數、過程或數據結構的定義中又應 用了它自身,則這個函數、過程或數據結構稱爲是遞歸定義的,簡稱遞歸。 它一般把一個大型的複雜問題層層轉化爲一個與原問題類似的規模較小的問題來求解,遞歸 策略只需少許的代碼就能夠描述出解題過程所須要的屢次重複計算,大大減小了程序的代碼量。但在一般狀況下,它的效率並非過高。

將遞歸算法轉換爲非遞歸算法,一般須要藉助棧來實現這種轉換。


15.隊列在層次遍歷中的做用?

在信息處理中有一大類問題須要逐層或逐行處理。這類問題的解決方法每每是在處理當前層 或當前行時就對下一層或下一行作預處理,把處理順序安排好,待當前層或當前行處理完畢,就能夠處理下一層或下一行。使用隊列是爲了保存下一步的處理順序。下面用二叉樹層次遍歷的例子,說明隊列的應用。


16.隊列在計算機系統中的應用?

隊列在計算機系統中的應用很是普遍,如下僅從兩個方面來簡述隊列在計算機系統中的做用:第一個方面是解決主機與外部設備之間速度不匹配的問題,第二個方面是解決由多用戶引發 的資源競爭問題。

對於第一個方面,僅以主機和打印機之間速度不匹配的問題爲例作簡要說明。主機輸出數據給打印機打印,輸出數據的速度比打印數據的速度要快得多,因爲速度不匹配,若直接把輸出的 數據送給打印機打印顯然是不行的。解決的方法是設置一個打印數據緩衝區,主機把要打印輸出的數據依次寫入這個緩衝區,寫滿後就暫停輸出,轉去作其餘的事情。打印機就從緩衝區中按照先進先出的原則依次取出數據並打印,打印完後再向主機發出請求。主機接到請求後再向緩衝區寫入打印數據。這樣作既保證了打印數據的正確,又使主機提升了效率。因而可知,打印數據緩衝區中所存儲的數據就是一個隊列。

對於第二個方面, CPU (即中央處理器,它包括運算器和控制器)資源的競爭就是一個典型 的例子。在一個帶有多終端的計算機系統上,有多個用戶須要CPU 各自運行本身的程序,它們分別經過各自的終端向操做系統提出佔用CPU 的請求。操做系統一般按照每一個請求在時間上的前後順序,把它們排成一個隊列,每次把CPU 分配給隊首請求的用戶使用。當相應的程序運行結束或用完規定的時間間隔後,令其出隊,再把CPU 分配給新的隊首請求的用戶使用。這樣既能知足每一個用戶的請求,又使CPU 可以正常運行。


17.矩陣的壓縮存儲

數據結構中,提供針對某些特殊矩陣的壓縮存儲結構。這裏所說的特殊矩陣,主要分爲如下兩類:

  • 含有大量相同數據元素的矩陣,好比對稱矩陣;
  • 含有大量 0 元素的矩陣,好比稀疏矩陣、上(下)三角矩陣;

針對以上兩類矩陣,數據結構的壓縮存儲思想是:矩陣中的相同數據元素(包括元素 0)只存儲一個。


第四章、串


快速喚起記憶知識框架:


18.串的模式匹配

子串的定位操做一般稱爲串的模式匹配,他求的是子串(常稱模式串)在主串中的位置。

暴力模式匹配算法的思想是:從主串的第一個字符起,與子串的第一個字符比較,相等則繼續比較;不等則從主串的下一個位置起,繼續和子串開始比較,直到最後看是否匹配成功。

如下的子串爲:‘abcac’:

改進的模式匹配算法-----KMP算法:

在暴力匹配中,每趟匹配失敗都是模式後移一位再從頭開始比較。而某趟已匹配相等的字符 序列是模式的某個前綴,這種頻繁的重複比較至關於模式串在不斷地進行自我比較,這就是其低效率的根源。所以,能夠從分析模式自己的結構着手,若是已匹配相等的前綴序列中有某個後綴正好是模式的前綴,那麼就能夠將模式向後滑動到與這些相等字符對齊的位置,主串i指針無須回溯,並繼續從該位置開始進行比較。而模式向後滑動位數的計算僅與模式自己的結構有關,與主串無關。

(此處篇幅過長,感興趣能夠直接百度KPM算法詳細瞭解,固然要求不高的能夠直接跳過,知道大體思想便可,不要被問到一問三不知就能夠)

相關文章
相關標籤/搜索