作為業(yè)務(wù)開發(fā)瘪板,我們會用到各種框架、中間件和底層系統(tǒng)漆诽,比如 Spring侮攀、RPC 框架、消息中間件拴泌、Redis 等等魏身。在這些基礎(chǔ)框架中,一般都揉和了很多基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法的設(shè)計思想蚪腐。比如箭昵,我們常用的 Key-Value 數(shù)據(jù)庫 Redis 中,里面的有序集合是用什么數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)的呢回季?為什么要用跳表來實現(xiàn)呢家制?為什么不用二叉樹呢?
在平時的工作中泡一,數(shù)據(jù)結(jié)構(gòu)和算法的應(yīng)用到處可見颤殴。我來舉一個你非常熟悉的例子:如何實時統(tǒng)計 業(yè)務(wù)接口 99%的 響應(yīng)時間?
你可能最先想到鼻忠,每次查詢時涵但,從小到大排序所有的響應(yīng)時間,如果總共有 1200 個數(shù)據(jù)帖蔓,那第1188個數(shù)據(jù)就是 99% 的響應(yīng)時間矮瘟。很顯然,每次用這個方法查詢的話都要排序塑娇,效率是非常低的澈侠。但是,如果你知道“堆”這個數(shù)據(jù)結(jié)構(gòu)埋酬,用兩個堆可以非常高效地解決這個問題哨啃。
對編程還有追求?不想被行業(yè)淘汰写妥?那就不要只會寫湊合能用的代碼拳球!
何為編程能力強?是代碼的可讀性好珍特、健壯醇坝?還是擴展性好?我覺得沒法列,也列不全呼猪。但是画畅,在我看來,性能好壞起碼是其中一個非常重要的評判標(biāo)準(zhǔn)宋距。但是轴踱,如果你連代碼的時間復(fù)雜度、空間復(fù)雜度都不知道怎么分析谚赎,怎么寫出高性能的代碼呢淫僻?
如果你在一家成熟的公司,或者 BAT 這樣的大公司壶唤,面對的是千萬級甚至億級的用戶雳灵,開發(fā)的是 TB、PB 級別數(shù)據(jù)的處理系統(tǒng)闸盔。性能幾乎是開發(fā)過程中時刻都要考慮的問題悯辙。一個簡單的ArrayList、Linked List 的選擇問題迎吵,就可能會產(chǎn)生成千上萬倍的性能差別躲撰。這個時候,數(shù)據(jù)結(jié)構(gòu)和算法的意義就完全凸顯出來了击费。