上帝的磨盤轉動很慢,可是卻磨得很細。 ——毛姆
本文已經收錄至個人GitHub,歡迎你們踊躍star 和 issues。
https://github.com/midou-tech...git
相互之間存在一種或多種特定關係的數據元素的集合,我總結一下就是描述數據關係的一種載體。github
數據結構包括邏輯結構和存儲結構兩個層次的描述。算法
描述數據邏輯關係的一種方式,與數據的存儲無關。邏輯結構中數據元素之間的關係主要分爲四種:集合結構、線性結構、樹結構、圖結構。全部的數據結構在邏輯上均可以用這四種中的一種。編程
數據和數據元素邏輯關係的存儲對象,也被稱爲物理結構。一般邏輯結構包含兩種,鏈式存儲和順序存儲。順序存儲 數據元素存儲在一塊連續的內存空間上,例如數組,就是一塊連續的空間。鏈式存儲 數據存儲不必定在一塊連續的內存空間上,例如單鏈表。數組
是一組值的集合和定義在這個集合上的操做的總稱。服務器
由用戶定義的表示應用問題的數學模型,以及定義在這個模型上的一組操做的總稱,具體包括三部分,數據對象、數據對象上關係的集合以及對數據對象基本操做的集合。微信
抽象數據類型有本身的定義格式:數據結構
ADT 抽象數據對象名 { 數據對象:(數據對象的定義) 數據關係:(數據關係的定義) 基本操做:(基本操做的定義) }
算法 解決一類問題而規定的一個有限長操做序列。併發
算法必須知足幾個特性才能稱之爲算法:高併發
評價算法優劣的主要從如下幾個方面考慮:
用算法中的"基本語句" 的執行次數來度量算法的工做量。正常狀態下通常用循環或者遞歸的運行次數。
在某些算法中算法的時間複雜度會根據算法的初始狀態決定,這種時候須要計算出算法的最好時間複雜度、最壞時間複雜度和平均時間複雜度。好比常見的排序算法就有最好最壞和平均時間複雜度。
算法在運行過程當中佔用的輔助空間大小,被稱做該算法的空間複雜度。
時間複雜度和空間複雜度都是用大寫的 "O" 表示。對於一個算法,其時間複雜度和空間複雜度每每是相互影響的,當追求一個較好的時間複雜度時, 可能會致使佔用較多的存儲空間, 便可能會使空間複雜度的性能變差, 反之亦然。不過, 一般狀況下, 鑑於運算空間較爲充足, 人們都以算法的時間複雜度做爲算法優劣的衡址指標。
本身在寫算法時必定要能夠去留意算法的效率問題,否則你寫出來的算法雖然知足可行性、肯定性、健壯性,也會是一個很爛的算法。時間複雜度是咱們平常編程設計考慮最多的。
在學習算法效率的時候通常會把O(3N)≈O(N),N的常數倍都直接約等於O(N)。這也是約等於,不是徹底相等。實際編程設計時特別是在一些效率要求較高的程序設計必定要考慮進去,不能約等於。在高併發的請求下,O(3N)和O(N)是有着天壤之別的。
我在工做中遇到的一個實例,差點背了事故。一個高併發的場景下(qps在5k左右),我寫了一個O(3N)的程序,測試時邏輯沒問題,結果沒問題,沒有對該場景進行高併發壓測,就上線了。上線以後不到十分鐘我收到短信報警,多臺機器CPU打滿了,內存也在飆升(32C—124G的服務器)。此時的我嚇壞了,意識到我剛剛發佈了,確定和我發佈有關。保證線上優先,立馬把剛上線的服務下掉,別影響其餘業務正常。下掉個人服務,CPU資源報警解除了。
通過一番review代碼,各類測試,最終定位到兩個問題。一個是我代碼裏面有一處內存泄漏致使內存飆升了,還有一處就是時間複雜度的問題。錯誤的把O(3N)=O(N)的算法上線了。把算法優化爲O(N)以後,通過一番壓力測試徹底沒問題。此次事件對我一個很大的啓示是,高併發的場景下,O(3N)≠O(N),必定不能等於。
高併發場景下算法的效率尤其重要,此時時間和空間的平衡關係必定要充分考慮。
概念性的東西通常在實際工做中不會去過多糾結,不少工做好久的同窗徹底不記得這些概念的文字卻依然能夠輕鬆愉快的完成相應知識的工做。是的,不拘泥於概念,卻熟練運用概念對應的知識是咱們的目的。這樣說並非概念不重要,徹底不須要看概念。概念是認識一個事物的開始,他表示一個事物是什麼,後面的作什麼,爲何,都是創建在是什麼的基礎上的,因此概念必定要理解,而不是背書。
在學校的同窗會養成一種很很差的習慣,就是必須去記這些概念。爲何呢?由於考試會考。是的,我在大學的時候也會去記這些概念的文字應付考試。好比下面這些考題就曾經出如今考卷中
抽象數據類型。
不要慌,理解記憶這些概念。既能應付考試,又能很好的理解知識。你須要記住考試好不表明你對知識掌握的好,掌握是指的能把這些知識運用在實際工做和生活應用中。
下一篇文章會寫數據結構一種很是重要的數據結構——線性表。記得關注我,精彩內容不錯過喔。
微信搜索 龍躍十二 便可訂閱,微信更新會早於博客喔。