http://www.javashuo.com/article/p-adhbaize-ew.htmlhtml
由於哈希表是基於數組衍生的數據結構,在添加刪除元素方面是比較慢的,因此不少時候須要用到一種數組鏈表來作,也就是拉鍊法。拉鍊法是數組結合鏈表的一種結構,較早前的hashMap底層的存儲就是採用這種結構,直到jdk1.8以後才換成了數組加紅黑樹的結構。mysql
圖是一種比較複雜的數據結構,在存儲數據上有着比較複雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構linux
棧:特色就是一個先進後出的結構。
隊列:特色就是一個先進先出的結構。c++
棧的應用:很是普遍,在CPU內部就有提供棧這個機制。主要用途:函數調用和返回,數字轉字符,表達式求值,走迷宮等等。在CPU內部棧主要是用來進行子程序調用和返回,中斷時數據保存和返回。在編程語言中:主要用來進行函數的調用和返回。能夠說在計算機中,只要數據的保存知足先進後出的原理,都優先考慮使用棧,因此棧是計算機中不可缺的機制。git
隊列的應用:隊列主要用在和時間有關的地方,特別是操做系統中,隊列是實現多任務的重要機制。windows中的消息機制就是經過隊列來實現的。進程調度也是使用隊列來實現,因此隊列也是一個重要的機制。只要知足數據的先進先出原理就可使用隊列。程序員
不一樣:redis
相同:兩種結構都可實現數據的順序存儲,構造出來的模型呈線性結構。算法
區別一:物理地址存儲的連續性
數組的元素在內存中是連續存放的。
鏈表的元素在內存中不必定是連續存放的,一般是不連續的。
區別二:訪問速度
數組的訪問速度很快,由於數組能夠根據數組能夠根據下標進行快速定位。
鏈表的訪問速度較慢,由於鏈表訪問元素須要移動指針。
區別三:添加、刪減元素速度
數組的元素增刪速度較慢,由於須要移動大量的元素。
鏈表的元素增刪速度較快,由於只須要修改指針便可。sql
前綴樹也叫字典樹,經常使用語字符串的查找。數據庫
字典樹==前綴樹==Trie樹:
查詢某個單詞(前綴)在全部單詞中出現次數的一種數據結構
查詢和插入時間複雜度都是O(n),是一種以空間換時間的方法。
詳細介紹參考於: http://www.javashuo.com/article/p-zwukhaty-cz.html (須要詳細看)
https://blog.csdn.net/aiphis/article/details/48247469
應用:
前綴樹有着普遍的應用,例如自動補全,拼寫檢查、搜索單詞、搜索前綴等等
線程池是一種多線程處理形式,處理過程當中將任務添加到隊列,而後在建立線程後自動啓動這些任務。
通俗點講,線程池就是一個容器,集中管理線程。線程使用完畢不會銷燬,而是會先存儲在線程池內。
一、判斷線程池裏的核心線程是否都在執行任務,若是不是(核心線程空閒或者還有核心線程沒有被建立)則建立一個新的工做線程來執行任務。若是核心線程都在執行任務,則進入下個流程。
二、線程池判斷工做隊列是否已滿,若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。
三、判斷線程池裏的線程是否都處於工做狀態,若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。
https://blog.csdn.net/jiao1902676909/article/details/88980110
一、線程是稀缺資源,使用線程池能夠減小建立和銷燬線程的次數,每一個工做線程均可以重複使用。
二、能夠根據系統的承受能力,調整線程池中工做線程的數量,防止由於消耗過多內存致使服務器崩潰。
建立的線程池具體配置爲:核心線程數量爲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
https://www.runoob.com/design-pattern/singleton-pattern.html
https://www.jianshu.com/p/3bfd916f2bb2
https://blog.csdn.net/u011109589/article/details/80519863
log2(n)取整後 +1
協程不是進程或線程,其執行過程更相似於子例程,或者說不帶返回值的函數調用。
一個程序能夠包含多個協程,能夠對比與一個進程包含多個線程,
於是下面咱們來比較協程和線程。咱們知道多個線程相對獨立,有本身的上下文,切換受系統控制;而協程也相對獨立,有本身的上下文,可是其切換由本身控制,由當前協程切換到其餘協程由當前協程來控制。
協程和線程區別:協程避免了無心義的調度,由此能夠提升性能,但也所以,程序員必須本身承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。
http://www.javashuo.com/article/p-osgohrxy-ee.html
https://blog.csdn.net/jason_cuijiahui/article/details/82587076
http://www.javashuo.com/article/p-aeomaiju-eg.html
http://www.javashuo.com/article/p-hbufqghd-ek.html
一、病毒木馬形成。 二、打開的網頁過多,可形成短期CPU佔用率高。 三、看視頻時因爲硬盤讀寫慢、網速慢,也可引發CPU佔用率高。 四、玩大型遊戲時,也可引發CPU佔用率高。 五、有時自啓動項過多(其中包括與系統不兼容的程序),引發響應慢引發CPU佔用率高。
怎麼判斷一個元素是否是數組?
霍夫曼樹:帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹
https://blog.csdn.net/qq_29519041/article/details/81428934
https://www.jianshu.com/p/d632b7e8f003
http://c.biancheng.net/view/3398.html
http://www.javashuo.com/article/p-epsgovkv-em.html
https://blog.csdn.net/qq_34793133/article/details/80087727
http://www.javashuo.com/article/p-pzhpbcel-mu.html
(1)進程棧大小時執行時肯定的,與編譯連接無關
(2)進程棧大小是隨機確認的,至少比線程棧要大,但不會超過2倍
(3)線程棧是固定大小的,可使用ulimit -a 查看,使用ulimit -s 修改。通常默認是8M。
(4)通常默認狀況下,線程棧是在進程的堆中分配棧空間,每一個線程擁有獨立的棧空間,爲了不線程之間的棧空間踩踏,線程棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另外一個線程踏入到這個隔離區,就會引起段錯誤。
https://blog.csdn.net/elfprincexu/article/details/78779158
函數模板不能進行隱式類型轉換
若是出現函數重載,優先調用普通函數
若是想強制使用函數模板,則可使用空參數列表
函數模板也能夠發生重載
若是函數模板能夠產生更好的匹配,那麼優先使用函數模板
https://blog.csdn.net/XUCHEN1230/article/details/86370292
編譯器會對函數模板進行兩次編譯:
1,對模板代碼自己進行編譯;
1,檢查函數模板自己有無語法錯誤等;
2,對參數替換後的代碼進行編譯;
1,調用函數模板的時候,編譯器要根據實際的參數類型獲得真正的函數,這個時候編譯器會對這個函數進行第二次編譯;
匿名函數
好比你代碼裏有一些小函數,而這些函數通常只被調用一次(好比函數指針),這時你就能夠用lambda表達式替代他們,這樣代碼看起來更簡潔些,用起來也方便