數據結構與算法 - 經常使用

數據結構部分程序員

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

C++語言中能夠用數組處理一組數據類型相同的數據,但不容許動態定義數組的大小,即在使 用數組以前必須肯定數組的大小。而在實際應用中,用戶使用數組以前有時沒法準確肯定數組的大小,只能將數組定義成足夠大小,這樣數組中有些空間可能不被使 用,從而形成內存空間的浪費。鏈表是一種常見的數據組織形式,它採用動態分配內存的形式實現。須要時能夠用new分配內存空間,不須要時用delete將 已分配的空間釋放,不會形成內存空間的浪費。
  
從邏輯結構來看:數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的狀況,即數組的大小一旦定義就不能改變。當數據增長時,可能超出原先 定義的元素個數;當數據減小時,形成內存浪費;鏈表動態地進行存儲分配,能夠適應數據動態地增減的狀況,且能夠方便地插入、刪除數據項。(數組中插入、刪 除數據項時,須要移動其它數據項)。  
  
從內存存儲來看:(靜態)數組從棧中分配空間(用NEW建立的在堆中), 對於程序員方便快速,可是自由度小;鏈表從堆中分配空間, 自由度大可是申請管理比較麻煩.算法

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

2.鏈表的一些操做,如鏈表的反轉,鏈表存在環路的判斷(快慢指針),雙向鏈表,循環鏈表相關操做。數據結構

3.隊列(特殊的如優先級隊列),棧的應用。(好比隊列用在消息隊列,棧用在遞歸調用中)編碼

4.二叉樹的基本操做spa

二叉樹的三種遍歷方式(前序,中序,後序)及其遞歸和非遞歸實現,三種遍歷方式的主要應用(如後綴表達式等)。相關操做的時間複雜度。設計

5.字符串相關指針

整數,浮點數和字符串之間的轉換(atoi,atof,itoa)orm

字符串拷貝注意異常檢查,好比空指針,字符串重疊,自賦值,字符串結束符'/0'等。

二.算法部分

1.排序算法:

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

各類排序算法的使用範圍總結:

(1)當數據規模較小的時候,能夠用簡單的排序算法如直接插 入排序或直接選擇排序。

(2)當文件的初態已經基本有序時,能夠用直接插入排序或冒泡排序。

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

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

(5)歸併排序能夠用於內排序,也能夠用於外排序。在外排序時,一般採用多路歸併,而且經過解決長順串的合併,產生長的初始串,提升主機與外設並行 能力等措施,以減小訪問外存額次數,提升外排序的效率。

2,查找算法

可以熟練寫出或者是上機編碼出二分查找的程序。

3.hash算法

4.一些算法設計思想。

相關文章
相關標籤/搜索