數據結構與算法總結

數據結構部分:

1、數組和鏈表的區別。(很簡單,但是很常考,記得要回答全面)

C++語言中可以用數組處理一組數據類型相同的數據,但不允許動態定義數組的大小,即在使用數組之前必須確定數組的大小。而在實際應用中,用戶使用數組之前無法確定數組的大小,只能夠將數組定義成足夠大小,這樣數組的空間可能不被使用,從而造成內存空間的浪費。鏈表是一種常見的數據組織形式,他採用動態分配內存的形式實現。需要時可以用new分配內存空間,不需要時用delete將已分配的空間釋放,不會造成內存空間的浪費。

從邏輯結構上來看,數組必須實現定於固定的長度,不能適應數據動態增減的情況,即數組的大小一旦定義就不能改變。當數據增加是,可能超過原先定義的元素的個數;當數據減少時,造成內存浪費;鏈表動態進行存儲分配,可以適應數據動態地增減的情況,且可以方便地插入、刪除數據項。

從內存存儲的角度看;數組從棧中分配空間(用new則在堆上創建),對程序員方便快速,但是自由度小;鏈表從堆中分配空間,自由度大但是申請管理比較麻煩。

從訪問方式類看,數組在內存中是連續的存儲,因此可以利用下標索引進行訪問;鏈表是鏈式存儲結構,在訪問元素時候只能夠通過線性方式由前到後順序的訪問,所以訪問效率比數組要低。

2、鏈表的一些操作,如反轉,鏈表陳釗環路判斷,雙向鏈表,循環鏈表相關操作。

3、隊列,棧的應用。(比如對壘在消息隊列,站用在遞歸調用中)

4、二叉樹的是那種遍歷方式及其遞歸和非遞歸實現,三種遍歷方式的主要應用(後綴表達式),相關的時間複雜度。

5、字符串相關

整型,浮點型和字符串的轉換(atoi,atof,itoa)

字符串拷貝注意異常檢查,比如空指針,字符串重疊,自賦值,字符串結束符‘\0’等。

小知識點

數據結構分類

1、用鏈表表示線性表的優點是(便於插入和刪除操作)

2、單鏈表中,增加頭結點的目的是(方便運算的實現)

3、棧和隊列的共同特點是(只允許在端點處插入和刪除元素)

4、棧通常採用的兩種存儲結構是(線性存儲結構和鏈表存儲結構)

5、隊列具有(先進先出)的特徵,棧具有(後進先出)的特徵。

6、鏈表(插入和刪除不需要移動元素,但是無法隨機訪問任一元素)

7、循環鏈表的主要優點是(從表中任一結點出發都能訪問到整個鏈表)

8、線性表(除了第一個和最後一個元素外,其餘每個元素都有一個直接前驅和直接後繼)

9、線性表的順序存儲結構和線性表的鏈式存儲結構分別是(隨機存取的存儲結構、順序存取的存儲結構)

10、深度爲5的滿二叉樹中,葉子結點的個數爲(16)。其共有(31)個結點。

       設一棵完全二叉樹共有699個結點。則該二叉樹的葉子結點數爲(350)個。 

             #完全二叉樹總的結點數爲N,若N爲奇數,則葉子結點數爲(N+1)/2;若N爲偶數,則葉子結點數爲N/2。

11、具有3個結點的二叉樹有(5)種形態。 #高度爲2層的是:根-左-右。高度爲3層的是:根-左-左、根-左-右、根-右-右、根-右-左。

12、一棵二叉樹中有3個葉子結點,有8個度爲1的結點,則該二叉樹中總的結點數爲(13)個。

      #葉子結點數n0與度爲2的結點數n2的關係是:n0=n2+1,所以度爲2的結點個數爲3-1=2。所以總的結點數爲 n=n0+n1+n2, 8+2+3=13.

13、已知二叉樹的後序遍歷序列是dabec,中序遍歷序列是debac,它的前序遍歷序列是(cedba)。#過程見文章:點擊打開鏈接

14、已知二叉樹的前序遍歷序列是abdgcefh,中序遍歷序列是dgbaechf,它的前序遍歷序列是(gdbehfca)。

15、算法是指(解決方案的準確而完整的描述)。

16、算法由(順序、選擇、循環)控制結構組合而成。

17、算法的時間複雜度是指(算法執行過程中所需要的基本運算次數)。

18、算法的空間複雜度是指(執行過程中所需要的存儲空間)。

19、算法分析的目的是(分析算法的效率以求改進)。

20、數據的存儲結構是指(數據的邏輯結構在計算機中的表示)。

21、數據的邏輯結構是指(反映數據元素之間邏輯關係的數據結構)。

22、根據數據結構中各元素之間前後件關係的複雜程度,可將數據結構分爲(線性結構和非線性結構)。

線性結構一般是首無前驅,尾無後繼,中間元素有唯一的前驅和後繼。主要有:列表、鏈表、隊列、棧。

非線性結構主要有1、沒有對應關係的 集合。2、一對多關係的 樹。3、多對多關係的 圖。

23、(隊列,循環隊列,順序表)不具有記憶功能,(棧)具有記憶功能。

24、遞歸算法一般需要用(棧)來實現。

#在遞歸算法的運行過程中,需要利用棧來保存其運算結果、參數和返回地址等。

25、算法的五個基本特徵是:可行性,確定性,和擁有足夠的情報

有限性:算法在執行有限步後必須終止。

確定性:算法的每個步驟都需要精確地定義,嚴格地、無歧義的運行。

輸入:算法在運行之前賦給它的量。

輸出:算法運行結束時的結果。

可行性:算法原則上能夠精準地運行,而且人們用紙和筆做有限次運算後即可完成。

26、由兩個棧共享一個存儲空間的好處是(節省存儲空間,降低上溢發生的概率)。

爲了不發生上溢錯誤,就必須給每個棧分配一個足夠大的存儲空間。但實際中,很難準確地估計,若每個棧都分配過大的存儲空間,勢必造成系統空間緊張;若讓多個棧共用一個足夠大的連續存儲空間,則可利用棧的動態特性使它們的存儲空間互補

27、需要打印機輸出數據時,一般將打印作業放在一個(隊列)中。

28、非空的循環單鏈表head的尾結點(由 p 所指向) ,滿足(p->next=head )。

29、與單鏈表相比,雙向鏈表的優點是(更容易訪問相鄰結點)。

 

31、N個頂點的連通圖中邊的條數至少爲(N-1)條。#將所有頂點連成一條線即可

32、N個頂點的強連通圖中邊的條數至少爲(N)條。#將所有頂點連成一條圈

33、對長度爲n的線性表進行順序查找,最壞情況下需要比較(N)次。

34、最簡單的交換排序是(冒泡排序)。

35、對長度爲n的線性表進行順序冒泡排序,最壞情況下需要比較(n(n-1)/2)次。

        #一共比較n-1遍,第1遍需要比較n-1次,第1遍需要比較n-2次,........最後一遍需要比較1次。是一個等差序列,對其進行求和即可。

36、在序列基本有序的情況下,效率最高的方法是(A) #如果將插入排序換爲冒泡排序,則選冒泡排序

         A.插入排序   B.選擇排序   C.快速排序   D.堆排序

        插入排序通過數據元素的交換來逐步消除線性表中的逆序,所以比較的次數與初始排列次序有關,在待排序的元素序列基本有序的前提下,效率最高。而選擇排序和堆排序的比較次數與初始排列次序無關。快速排序雖然與初始排列次序有關,但在待排序的元素序列基本有序的前提下,效率低於插入排序。

37、希爾排序屬於(插入類排序),堆排序屬於(選擇類排序)。

38、在下列幾種排序方法中,要求內存量最大的是(D).
 

        A.插入排序  B.選擇排序  C.快速排序  D.歸併排序

        快速排序的基本思想是,通過一趟排序將待排序記錄分割成獨的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,再分別對這兩部分記錄繼續進行排序,以達到整個序列有序;插入排序的基本操作是指將無序序列中的各元素依次插入到已經有序的線性表中,從而得到一個新的序列;選擇排序的基本思想是:掃描整個線性表,從中選出最小的元素,將它交換到表的最前面(這是它應有的位置),然後對剩下的子表採用同樣的方法,直到表空爲止;歸併排序是將兩個或兩個以上的有序表組成合成一個新的序列表。

39、已知數據表 A中每個元素距其最終位置不遠,爲節省時間, 應採用(直接插入排序)。

40、數據結構是指相互有關聯的( 數據元素 )的集合。

41、數據元素之間的任何關係都可以用 (前驅和後繼) 關係來描述。

42、順序存儲方法是把邏輯上相鄰的結點存儲在 (物理位置) 相鄰的存儲單元中。

43、棧的基本運算有三種:入棧、退棧與讀棧頂元素。

44、隊列主要有兩種基本運算:入隊和退隊。

45、在實際應用中,帶鏈的棧可以用來收集計算機存儲空間中所有空閒的存儲結點,這種帶鏈的棧稱爲 (可利用棧) .

46、棧和隊列通常採用的存儲結構分別是 鏈式存儲和順序存儲。

47、當循環隊列非空且隊尾指針等於對頭指針時, 說明循環隊列已滿,不能進行入隊運算。這種情況稱爲 (上溢) 

48、當循環隊列爲空時, 不能進行退隊運算, 這種情況稱爲 (下溢)。

49、在一個容量爲 25 的循環隊列中, 若頭指針 front=16 , 尾指針 rear=9 , 則該循環隊列中共有 18 個元素。       

 注: 當 rear<front 時, 元素個數=總容量-( front -rear ); 當 rear>front 時,元素個數= rear -front 。

50、判斷一個鏈表是否存在環:點擊打開此鏈接

        單鏈表中元素的反轉:點擊打開此鏈接

        判斷兩個數組中是否有相同的數字:點擊打開此鏈接

        從一個子序列中找出其最大子序列的和:點擊打開此鏈接

        按單詞反轉字符串:點擊打開此鏈接

        刪除數組中重複的元素:點擊打開此鏈接

 

算法部分

1、排序算法:

排序可以算是最基本,最常用的算法,也是筆試面試中最常被考的算法,最基本的是冒泡排序,選擇排序,插入排序要可以很快地用代碼實現。這些主要考察你的實際編碼能力。堆排序,歸併排序,快速排序這些算法需要熟悉主要思想,和需要注意的細節地方。需要熟悉的常用排序算法的時間複雜度和空間複雜度。各種排序算法的使用範圍:

(1)、當數據規模較小時候,可以使用簡單的直接插入排序或者直接選擇排序。

(2)、當文件的初態已經基本有序,可以用直接插入排序和冒泡排序。

(3)、當數據規模較大是,應用速度最快的排序算法,可以考慮使用快速排序。當記錄隨機分佈的時候,快速排序平均時間最短,但是出現最壞的情況,這個時候的時間複雜度是O(n^2),且遞歸深度爲n,所需的佔空間爲O(n)。

(4)、對排序不會出現快排那樣最壞情況,且堆排序所需的輔助空間比快排要少,但是這兩種算法都不是穩定的,要求排序時是穩定的,可以考慮用歸併排序。

(5)、歸併排序可以用於內部排序,也可以使用於排不排序。在外部排序時,通常採用多路歸併,並且通過解決長順串的合併,纏上長的初始串,提高主機與外設並行能力等,以減少訪問外存額外次數,提高外排的效率。

2、查找算法

能夠熟練寫出或者上級編碼出二分查找的程序。

3、hash算法

4、一些算法設計思想。貪心算法,分治算法,動態規劃算法,隨機劃分算法,回溯算法等。這些可以根據具體的例子來複習。 

5、STL

STL(Standard Templete Library)是一個C++領域中,用模板實現的數據結構和算法庫,已經包含在了C++標準庫中,其中的vector,list,stack,queue等結構不僅擁有更強大的功能,還有了更高的安全性。除了數據結構外,STL還包含了泛化的迭代器,和運行在迭代器至上的各種使用的算法。這些對於性能要求不是太高,但又不希望自己從底層實現算法的應用還是很具有誘惑力的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章