後臺開發面經-北森

一、八大數據結構及分類

  • 一、數組 頻繁查詢,對存儲空間要求不大,不多增長和刪除的狀況
  • 二、棧 棧常應用於實現遞歸功能方面的場景,例如斐波那契數列
  • 三、隊列 由於隊列先進先出的特色,在多線程阻塞隊列管理中很是適用
  • 四、鏈表 數據量較小,須要頻繁增長,刪除操做的場景
  • 五、樹 二叉樹既有鏈表的好處,也有數組的好處,是二者的優化方案,在處理大批量的動態數據方面很是有用。
  • 六、散列表 哈希衝突的問題,若是處理的很差會浪費大量的時間,致使應用崩潰
  • 七、堆 由於堆有序的特色,通常用來作數組中的排序,稱爲堆排序
  • 八、圖

http://www.javashuo.com/article/p-adhbaize-ew.htmlhtml

由於哈希表是基於數組衍生的數據結構,在添加刪除元素方面是比較慢的,因此不少時候須要用到一種數組鏈表來作,也就是拉鍊法。拉鍊法是數組結合鏈表的一種結構,較早前的hashMap底層的存儲就是採用這種結構,直到jdk1.8以後才換成了數組加紅黑樹的結構。mysql

圖是一種比較複雜的數據結構,在存儲數據上有着比較複雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構linux

二、堆棧特色及應用

棧:特色就是一個先進後出的結構。
隊列:特色就是一個先進先出的結構。c++

棧的應用:很是普遍,在CPU內部就有提供棧這個機制。主要用途:函數調用和返回,數字轉字符,表達式求值,走迷宮等等。在CPU內部棧主要是用來進行子程序調用和返回中斷時數據保存和返回在編程語言中:主要用來進行函數的調用和返回。能夠說在計算機中,只要數據的保存知足先進後出的原理,都優先考慮使用棧,因此棧是計算機中不可缺的機制。git

隊列的應用:隊列主要用在和時間有關的地方,特別是操做系統中,隊列是實現多任務的重要機制。windows中的消息機制就是經過隊列來實現的。進程調度也是使用隊列來實現,因此隊列也是一個重要的機制。只要知足數據的先進先出原理就可使用隊列。程序員

三、鏈表和數組的區別

不一樣:redis

  1. 鏈表是鏈式的存儲結構;數組是順序的存儲結構。(物理地址存儲的連續性)
  2. 鏈表經過指針來鏈接元素與元素,數組則是把全部元素按次序依次存儲。(存儲元素不一樣,前者指針+值,後者值)
  3. 鏈表的插入刪除元素相對數組較爲簡單,不須要移動元素,且較爲容易實現長度擴充,可是尋找某個元素較爲困難;
  4. 數組尋找某個元素較爲簡單,但插入與刪除比較複雜,因爲最大長度須要再編程一開始時指定,故當達到最大長度時,擴充長度不如鏈表方便。

相同:兩種結構都可實現數據的順序存儲,構造出來的模型呈線性結構。算法

區別一:物理地址存儲的連續性
數組的元素在內存中是連續存放的。
鏈表的元素在內存中不必定是連續存放的,一般是不連續的。
區別二:訪問速度
數組的訪問速度很快,由於數組能夠根據數組能夠根據下標進行快速定位。
鏈表的訪問速度較慢,由於鏈表訪問元素須要移動指針。
區別三:添加、刪減元素速度
數組的元素增刪速度較慢,由於須要移動大量的元素。
鏈表的元素增刪速度較快,由於只須要修改指針便可。sql

四、介紹下樹,前綴樹的應用場景,能夠怎樣優化

前綴樹也叫字典樹,經常使用語字符串的查找。數據庫

字典樹==前綴樹==Trie樹:

查詢某個單詞(前綴)在全部單詞中出現次數的一種數據結構

查詢和插入時間複雜度都是O(n),是一種以空間換時間的方法。

詳細介紹參考於: http://www.javashuo.com/article/p-zwukhaty-cz.html (須要詳細看

https://blog.csdn.net/aiphis/article/details/48247469

應用:

前綴樹有着普遍的應用,例如自動補全,拼寫檢查、搜索單詞、搜索前綴等等

五、併發編程,說一下理解,線程池的優缺點(看詳細內容)

1. 什麼是線程池?

線程池是一種多線程處理形式,處理過程當中將任務添加到隊列,而後在建立線程後自動啓動這些任務。

通俗點講,線程池就是一個容器,集中管理線程。線程使用完畢不會銷燬,而是會先存儲在線程池內。

2. 提交一個任務到線程池中,線程池的處理流程以下:

一、判斷線程池裏的核心線程是否都在執行任務,若是不是(核心線程空閒或者還有核心線程沒有被建立)則建立一個新的工做線程來執行任務。若是核心線程都在執行任務,則進入下個流程。

二、線程池判斷工做隊列是否已滿,若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。

三、判斷線程池裏的線程是否都處於工做狀態,若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。

https://blog.csdn.net/jiao1902676909/article/details/88980110

3. 線程池的優缺點

一、線程是稀缺資源,使用線程池能夠減小建立和銷燬線程的次數,每一個工做線程均可以重複使用。

二、能夠根據系統的承受能力,調整線程池中工做線程的數量,防止由於消耗過多內存致使服務器崩潰。

四、線程處理流程:

建立的線程池具體配置爲:核心線程數量爲5個;所有線程數量爲10個;工做隊列的長度爲5

剛開始都是在建立新的線程,達到核心線程數量5個後,新的任務進來後不再建立新的線程,而是將任務加入工做隊列,任務隊列到達上限5個後,新的任務又會建立新的普通線程,直到達到線程池最大的線程數量10個,後面的任務則根據配置的飽和策略來處理。咱們這裏沒有具體配置,使用的是默認的配置AbortPolicy:直接拋出異常。

一個應用場景

linux高併發的實現,線程池的實現思想,怎樣處理高併發就好比說,用迅雷看電影。一邊下載,一邊播放。這個時候下載進程和播放進程,他們兩個就有同步的機制,例如:只能播放視頻文件中已經下載完成的部分,沒有下載的不能播放。

https://blog.csdn.net/chenkaifang/article/details/81428799

六、併發和並行的區別

併發是輪流處理多個任務,並行是同時處理多個任務

https://www.jianshu.com/p/cbf9588b2afb

七、遞歸須要考慮一些什麼

①一個函數在他的函數體內調用他自身稱爲遞歸調用,執行遞歸函數將反覆調用其自身,每執行一次進入新的一層。

②爲防止遞歸函數無休止的進行,必須在函數內有終止條件。

③對於一個函數只要知道他的遞歸定義式和邊界條件,就能夠編遞歸函數。

層數不能太多,在遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲。遞歸次數過多容易形成棧溢出等。

遞歸算法解題一般顯得很簡潔,但遞歸算法解題的運行效率較低。因此通常不提倡用遞歸算法設計程序。

充分必要條件是:問題具備某種可借用的類同自身的子問題描述的性質;某一有限步的子問題(也稱本原問題)有直接的解存在。

八、動態規劃與遞歸

遞歸算法就是經過解決同一問題的一個或多個更小的實例來最終解決一個大問題的算法。爲了在C語言中實現遞歸算法,經常使用遞歸函數,也就是說能調用自身的函數。遞歸程序的基本特徵:它調用自身(參數的值更小),具備終止條件,能夠直接計算其結果。

      在使用遞歸程序時,咱們須要考慮編程環境必須可以保持一個其大小與遞歸深度成正比例的下推棧。對於大型問題,這個棧須要的空間可能妨礙咱們使用遞歸的方法。

     一個遞歸模型爲分治法,最本質的特徵就是:把一個問題分解成獨立的子問題。若是子問題並不獨立,問題就會複雜的多,主要緣由是即便是這種最簡單算法的直接遞歸實現,也可能須要不可思議的時間,使用動態規劃技術就能夠避免這個缺陷。

能夠按照從最小開始的順序計算全部函數值來求任何相似函數的值,在每一步使用先前已經計算出的值來計算當前值,咱們稱這項技術爲自底向上的動態規劃。只要有存儲已經計算出的值的空間,就能把這項技術應用到任何遞歸計算中,就能把算法從指數級運行時間向線性運行時間改進。

性質:動態規劃下降了遞歸函數的運行時間,也就是減小了計算全部小於或等於給定參數的遞歸調用所要求的時間,其中處理一次遞歸調用的時間爲常量。

具體詳見於https://blog.csdn.net/DeepIT/article/details/6530282

在自頂向下的動態規劃中,咱們存儲已知的值;在自底向上的動態規劃中,咱們預先計算這些值。咱們經常選擇自頂向下的動態規劃而不選自底向上動態規劃,其緣由以下:

     1 自頂向下的動態規劃是一個天然的求解問題的機械轉化。

     2 計算子問題的順序能本身處理。

     3 咱們可能不須要計算全部子問題的解。

     咱們不能忽視相當重要的一點是,當咱們須要的可能的函數值的數目太大以致於不能存儲(自頂向下)或預先計算(自底向上)全部值時,動態規劃就會變得低效。自頂向下動態規劃確實是開發高效的遞歸算法實現的基本技術,這類算法應歸入任何從事算法設計與實現所需的工具箱。

相關編程題目整理

http://www.javashuo.com/article/p-phajxaty-ds.html

https://blog.csdn.net/qq_35556064/article/details/82503076

九、數據庫的連表查詢和嵌套查詢,分頁查詢及子查詢

 連表查詢

from 多個表,使用where篩選條件

分頁查詢

select * from student limit 2,3

limit 2,3表明從第2條(不包含第2條) 數據開始查詢出3條記錄

嵌套查詢

將一個查詢塊嵌套在另外一個查詢塊的 WHERE 子句或 HAVING 短語的條件中的查詢稱爲 嵌套查詢。

http://www.javashuo.com/article/p-bwgxltnu-dx.html

十、數據庫增刪查改語句重複應該考慮什麼

 http://www.javashuo.com/article/p-eisyufyw-dy.html

十一、存儲引擎,InnoDB

 

 

十二、如何實現瀏覽器和服務器之間的通訊

 

1三、單例模式,實現方法,應用場景

 https://www.runoob.com/design-pattern/singleton-pattern.html

https://www.jianshu.com/p/3bfd916f2bb2

1四、生產者和消費者模式應用場景

 https://blog.csdn.net/u011109589/article/details/80519863

1五、算法題:156個元素數組,二分查找最少要多少次比較,最多多少次

 log2(n)取整後 +1

1六、進程和線程的區別,協程,同步機制

 協程不是進程或線程,其執行過程更相似於子例程,或者說不帶返回值的函數調用。 
一個程序能夠包含多個協程,能夠對比與一個進程包含多個線程, 
於是下面咱們來比較協程和線程。咱們知道多個線程相對獨立,有本身的上下文,切換受系統控制;而協程也相對獨立,有本身的上下文,可是其切換由本身控制,由當前協程切換到其餘協程由當前協程來控制。 
協程和線程區別:協程避免了無心義的調度,由此能夠提升性能,但也所以,程序員必須本身承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。

 http://www.javashuo.com/article/p-osgohrxy-ee.html

https://blog.csdn.net/jason_cuijiahui/article/details/82587076

1七、數據庫索引,存儲引擎

 http://www.javashuo.com/article/p-aeomaiju-eg.html

http://www.javashuo.com/article/p-hbufqghd-ek.html

1八、項目難點

 

1九、生成訂單號的實現

 

 

20、Redis 的數據結構

 

2一、最近在看什麼書,這麼多看得完嗎

 

2二、多線程同步的方法

 

 

2三、wait 和 notify 以及 notifyAll

 

2四、HashMap 查找效率最低和最高

 

 

2五、TCP 中 time-wait 狀態

 

 

 

2六、CPU 佔用率達到 100% 可能由什麼形成

一、病毒木馬形成。 
二、打開的網頁過多,可形成短期CPU佔用率高。 
三、看視頻時因爲硬盤讀寫慢、網速慢,也可引發CPU佔用率高。 
四、玩大型遊戲時,也可引發CPU佔用率高。 
五、有時自啓動項過多(其中包括與系統不兼容的程序),引發響應慢引發CPU佔用率高。

2七、服務調用超時可能由什麼形成

 

 

2八、數據庫中,怎樣理解這個非關係和關係這個概念的

 

 

 

2九、redis相關

 

 

 

30、幾種設計模式

 

 

3一、線程通訊

 

3二、mysql存儲引擎

 

 

3三、什麼是索引、怎麼設置索引

 

3四、什麼樣的時候作索引,舉例說明

 

3五、什麼樣的不適合作索引,舉例說明

 

 

3六、mysql底層原理說一下

 

 

3七、數據庫序列化

 

 

3八、內存分區(5個)

 

 

3九、基礎

  • 進程和線程
  • 進程通訊
  • 線程通訊
  • 鎖,樂觀鎖悲觀鎖
  • 爲啥要鎖,有什麼注意事項嗎
  • 細問了鎖和同步的相關知識,比較碎
算法設計
  • 貪吃蛇遊戲的設計思路

40、最長公共前綴

 

 

4一、測試崗

  • 項目介紹
  • 白盒測試方法
  • 黑盒的等價類,因果圖
  • 數據庫查找某個字符
  • HTTP請求頭
  • GET/POST
  • 狀態碼304/403
  • 測試微信朋友圈發文字的功能
  • 口述找出字符串第一個不重複字符的代碼

4二、經常使用狀態碼

4三、基礎

你有提到僞數組,說一下僞數組
僞數組怎麼轉化爲數組?

怎麼判斷一個元素是否是數組?

25. 哪些會改變原數組?
26. 如今查找數組的第一項和查找數組的第9999項,效率同樣嗎?爲何?
27. 刪除數組的第一項和刪除數組的第9999項效率呢?
28. 關於存儲元素上,何時用數組這樣的結構效率高,何時用字典結構的對象這樣的結構效率高?
29. 說一下繼承
30. 爲何new了就能夠實現繼承
31. 說一下new發生了啥
32. new存在隱式返回對吧,那我函數裏面 return 1 如今new完以後返回什麼?
33. 數組扁平化的問題,我看你用了三行代碼,怎麼用一行代碼解決
42. git 經常使用命令哪些?
43. git怎麼合併指定提交記錄的分支?
44. http協議說一下
45. 說一下https和http的區別
46. 爲何https安全?
47. 那https會不會帶來性能問題?
48. 說一下http1.0和http1.1的主要區別
49. http2.0瞭解過嗎?詳細說一下
50. 知道強緩存和協商緩存嗎?說一下
51. 說一下協商緩存的詳細流程

4四、霍夫曼樹

霍夫曼樹:帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹

https://blog.csdn.net/qq_29519041/article/details/81428934

https://www.jianshu.com/p/d632b7e8f003

http://c.biancheng.net/view/3398.html

4五、信號量與互斥量的區別

http://www.javashuo.com/article/p-epsgovkv-em.html

https://blog.csdn.net/qq_34793133/article/details/80087727

 

4六、HTTP 304狀態碼的詳細講解

http://www.javashuo.com/article/p-pzhpbcel-mu.html

4七、數組與指針的區別

4八、new分配空間,釋放後空間是直接就能夠重複使用的麼?

4九、對單項鍊表進行排序

50、內核發送緩衝區,UDP有發送緩衝區麼?

5一、線程池的優點,怎麼使用

5二、內存池的優點,使用

5三、當使用線程池時,程序中怎麼解決死鎖

5四、線程池使用場景,何時不適用,線程池管理線程也會有開銷

5五、寫代碼中遇到什麼問題

5六、socket網絡編程

5七、阻塞編程與非阻塞編程

5八、操做系統的中斷、系統概念、內核

5九、線程的棧空間爲8M,進程的空間是多大?

    (1)進程棧大小時執行時肯定的,與編譯連接無關

    (2)進程棧大小是隨機確認的,至少比線程棧要大,但不會超過2倍

    (3)線程棧是固定大小的,可使用ulimit -a 查看,使用ulimit -s 修改。通常默認是8M。

    (4)通常默認狀況下,線程棧是在進程的堆中分配棧空間,每一個線程擁有獨立的棧空間,爲了不線程之間的棧空間踩踏,線程棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另外一個線程踏入到這個隔離區,就會引起段錯誤。

https://blog.csdn.net/elfprincexu/article/details/78779158

60、c++中函數模板與函數的效率

函數模板不能進行隱式類型轉換

若是出現函數重載,優先調用普通函數

若是想強制使用函數模板,則可使用空參數列表

函數模板也能夠發生重載

若是函數模板能夠產生更好的匹配,那麼優先使用函數模板

https://blog.csdn.net/XUCHEN1230/article/details/86370292

編譯器會對函數模板進行兩次編譯:

       1,對模板代碼自己進行編譯;

           1,檢查函數模板自己有無語法錯誤等;

       2,對參數替換後的代碼進行編譯;

           1,調用函數模板的時候,編譯器要根據實際的參數類型獲得真正的函數,這個時候編譯器會對這個函數進行第二次編譯

6一、C++中lambda表達式與傳統的函數相比有什麼優點

匿名函數
好比你代碼裏有一些小函數,而這些函數通常只被調用一次(好比函數指針),這時你就能夠用lambda表達式替代他們,這樣代碼看起來更簡潔些,用起來也方便

6二、緩衝區之間的關係,內核緩衝區,應用緩衝區

6三、

相關文章
相關標籤/搜索