【數據結構——面試篇】數據結構與算法總結

 

數據結構部分:

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

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

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

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

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

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

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

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

5、字符串相關

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

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

 

算法部分

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還包含了泛化的迭代器,和運行在迭代器至上的各種使用的算法。這些對於性能要求不是太高,但又不希望自己從底層實現算法的應用還是很具有誘惑力的。

參考博文:https://www.cnblogs.com/houjun/p/4896268.html

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