數據結構面試題


  1. 什么是鏈表、隊列、棧?
    所謂單鏈表,即只有一個指針,指向下一個元素(結點)的地址,只要知道單鏈表的首地址,就可以遍歷整個鏈表了。由於鏈表結點是在堆區動態申請的,其地址並不是連續的,因此無法進行隨機訪問,只有通過前一結點的next指針才能定位到下一個結點的指針。
    隊列就像我們平時排隊一樣,按照數據到達的順序進行排隊,每次新插入的一個結點排在隊尾,刪除一個結點只能從頭才能出隊。簡言之,對元素的到達順序,按照“先進先出”的原則。
    棧的特點正好與隊列相反,按照數據進棧的逆序出棧,即“先進后出”,每次入棧將元素放在棧頂,出棧時也只能從棧頂出棧,與隊列類似,一般用定長數組存儲棧元素,而不是動態的申請結點空間。
  2. 怎么判斷鏈表是否有環?
    兩個指針分別按照固定步長行走,P1一次走1布,P2一次走2布,如果鏈表有環,P1和P2會有相遇的時刻。(追擊問題解法)
  3. 數組和鏈表的區別。
    從邏輯結構上來看,數組必須實現定於固定的長度,不能適應數據動態增減的情況,即數組的大小一旦定義就不能改變。當數據增加是,可能超過原先定義的元素的個數;當數據減少時,造成內存浪費;鏈表動態進行存儲分配,可以適應數據動態地增減的情況,且可以方便地插入、刪除數據項。
    從內存存儲的角度看;數組從棧中分配空間(用new則在堆上創建),對程序員方便快速,但是自由度小;鏈表從堆中分配空間,自由度大但是申請管理比較麻煩。
    從訪問方式類看,數組在內存中是連續的存儲,因此可以利用下標索引進行訪問;鏈表是鏈式存儲結構,在訪問元素時候只能夠通過線性方式由前到后順序的訪問,所以訪問效率比數組要低。
  4. 簡述快速排序過程
    1)選擇一個基准元素,通常選擇第一個元素或者最后一個元素,
    2)通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基准元素值小。另一部分記錄的元素值比基准值大。
    3)此時基准元素在其排好序后的正確位置
    4)然后分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。
  5. 各類排序算法對比
    時間復雜度來說:
    (1)平方階(O(n2))排序
      各類簡單排序:直接插入、直接選擇和冒泡排序;
    (2)線性對數階(O(nlog2n))排序
      快速排序、堆排序和歸並排序;
    說明:
    當原表有序或基本有序時,直接插入排序和冒泡排序將大大減少比較次數和移動記錄的次數,時間復雜度可降至O(n);
    而快速排序則相反,當原表基本有序時,將蛻化為冒泡排序,時間復雜度提高為O(n2);
    原表是否有序,對簡單選擇排序、堆排序、歸並排序和基數排序的時間復雜度影響不大。
    穩定性:
    排序算法的穩定性:若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序,這些記錄的相對次序保持不變,則稱該算法是穩定的;若經排序后,記錄的相對次序發生了改變,則稱該算法是不穩定的。
    穩定的排序算法:冒泡排序、插入排序、歸並排序和基數排序
    不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序
  6. 選擇排序算法准則:
    設待排序元素的個數為n.
    1)當n較大,則應采用時間復雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸並排序序。
    2)當n較大,內存空間允許,且要求穩定性:歸並排序
    3)當n較小,可采用直接插入或直接選擇排序。
    直接插入排序:當元素分布有序,直接插入排序將大大減少比較次數和移動記錄的次數。
    直接選擇排序 :元素分布有序,如果不要求穩定性,選擇直接選擇排序
  7. 用循環比遞歸效率高嗎?
    遞歸和循環兩者完全可以互換。不能完全決定性地說循環地效率比遞歸的效率高。
    遞歸算法:
    優點:代碼簡潔、清晰,並且容易驗證正確性。
    缺點:它的運行需要較多次數的函數調用,如果調用層數比較深,需要增加額外的堆棧處理(還有可能出現堆棧溢出的情況),比如參數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞歸,那將是極端難看的代碼。在編譯器優化后,對於多次調用的函數處理會有非常好的效率優化,效率未必低於循環。
    循環算法:
    優點:速度快,結構簡單。
    缺點:並不能解決所有的問題。有的問題適合使用遞歸而不是循環。如果使用循環並不困難的話,最好使用循環。
  8. 解決哈希沖突的方法
    哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。
    1) 線性探測法
    2) 平方探測法
    3) 偽隨機序列法
    4) 拉鏈法
  9. KMP算法:
    在一個字符串中查找是否包含目標的匹配字符串。其主要思想是每趟比較過程讓子串先后滑動一個合適的位置。當發生不匹配的情況時,不是右移一位,而是移動(當前匹配的長度– 當前匹配子串的部分匹配值)位。

參考博客:
https://www.cnblogs.com/yuxiaoba/p/8646169.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM