學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法讀什么書

-----------

通知:如果本站對你學(xué)習(xí)算法有幫助踊淳,請收藏網(wǎng)址,并推薦給你的朋友迂尝。由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去開付費專欄垄开,價格還不便宜。我這免費寫給你看税肪,多宣傳原創(chuàng)作者是你唯一能做的,誰也不希望劣幣驅(qū)逐良幣對吧益兄?

咱們的公眾號有很多硬核的算法文章,今天就聊點輕松的净捅,就具體聊聊我非常“鼓吹”的《算法4》蛔六。這本書我在之前的文章多次推薦過,但是沒有具體的介紹古今,今天就來正式介紹一下滔以。。

我的推薦不會直接甩一大堆書目你画,而是會聯(lián)系實際生活抵碟,講一些書中有趣有用的知識,無論你最后會不會去看這本書坏匪,本文都會給你帶來一些收獲拟逮。

首先這本書是適合初學(xué)者的∈首遥總是有很多讀者問敦迄,我只會 C 語言,能不能看《算法4》?學(xué)算法最好用什么語言罚屋?諸如此類的問題苦囱。

經(jīng)常看咱們公眾號的讀者應(yīng)該體會到了脾猛,算法其實是一種思維模式撕彤,和你用什么語言沒啥關(guān)系。我們的文章也不會固定用某一種語言猛拴,而是什么語言寫出來容易理解就用什么語言羹铅。再退一步說,到底適不適合你愉昆,網(wǎng)上找個 PDF 親自看一下不就知道了职员?

《算法4》看起來挺厚的,但是前面幾十頁是教你 Java 的跛溉;每章后面還有習(xí)題廉邑,占了不少頁數(shù);每章還有一些數(shù)學(xué)證明倒谷,這些都可以忽略蛛蒙。這樣算下來,剩下的就是基礎(chǔ)知識和疑難解答之類的內(nèi)容渤愁,含金量很高牵祟,把這些基礎(chǔ)知識動手實踐一遍,真的就可以達(dá)到不錯的水平了抖格。

PS:我認(rèn)真寫了 100 多篇原創(chuàng)诺苹,手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄雹拄,持續(xù)更新收奔。建議收藏,按照我的文章順序刷題滓玖,掌握各種算法套路后投再入題海就如魚得水了坪哄。

我覺得這本書之所以能有這么高的評分,一個是因為講解詳細(xì)势篡,還有大量配圖翩肌,另一個原因就是書中把一些算法和現(xiàn)實生活中的使用場景聯(lián)系起來禁悠,你不僅知道某個算法怎么實現(xiàn),也知道它大概能運用到什么場景粱坤,下面我就來介紹兩個圖算法的簡單應(yīng)用。

一站玄、二分圖的應(yīng)用

我想舉的第一個例子是二分圖蜒什。簡單來說,二分圖就是一幅擁有特殊性質(zhì)的圖:能夠用兩種顏色為所有頂點著色霎冯,使得任何一條邊的兩個頂點顏色不同沈撞。

image

明白了二分圖是什么缠俺,能解決什么實際問題呢贷岸?算法方面偿警,常見的操作是如何判定一幅圖是不是二分圖。比如說下面這道 LeetCode 題目:

image

你想想盒使,如果我們把每個人視為一個頂點少办,邊代表討厭英妓;相互討厭的兩個人之間連接一條邊鞋拟,就可以形成一幅圖惹资。那么根據(jù)剛才二分圖的定義褪测,如果這幅圖是一幅二分圖,就說明這些人可以被分為兩組懈叹,否則的話就不行澄成。

這是判定二分圖算法的一個應(yīng)用畏吓,其實二分圖在數(shù)據(jù)結(jié)構(gòu)方面也有一些不錯的特性

比如說我們需要一種數(shù)據(jù)結(jié)構(gòu)來儲存電影和演員之間的關(guān)系:某一部電影肯定是由多位演員出演的肾砂,且某一位演員可能會出演多部電影宏悦。你使用什么數(shù)據(jù)結(jié)構(gòu)來存儲這種關(guān)系呢?

既然是存儲映射關(guān)系源葫,最簡單的不就是使用哈希表嘛臼氨,我們可以使用一個 HashMap<String, List<String>> 來存儲電影到演員列表的映射芭届,如果給一部電影的名字,就能快速得到出演該電影的演員持隧。

但是如果給出一個演員的名字屡拨,我們想快速得到該演員演出的所有電影,怎么辦呢呀狼?這就需要「反向索引」哥艇,對之前的哈希表進(jìn)行一些操作貌踏,新建另一個哈希表,把演員作為鍵祖乳,把電影列表作為值。

對于上面這個例子蜒秤,可以使用二分圖來取代哈希表作媚。電影和演員是具有二分圖性質(zhì)的:如果把電影和演員視為圖中的頂點伞访,出演關(guān)系作為邊,那么與電影頂點相連的一定是演員弟灼,與演員相鄰的一定是電影田绑,不存在演員和演員相連掩驱,電影和電影相連的情況。

PS:我認(rèn)真寫了 100 多篇原創(chuàng)欧穴,手把手刷 200 道力扣題目涮帘,全部發(fā)布在 labuladong的算法小抄调缨,持續(xù)更新吆你。建議收藏,按照我的文章順序刷題伤哺,掌握各種算法套路后投再入題海就如魚得水了默责。

回顧二分圖的定義咸包,如果對演員和電影頂點著色,肯定就是一幅二分圖:

image

如果這幅圖構(gòu)建完成媒熊,就不需要反向索引芦鳍,對于演員頂點葛账,其直接連接的頂點就是他出演的電影籍琳,對于電影頂點,其直接連接的頂點就是出演演員喝峦。

當(dāng)然呜达,對于這個問題,書中還提到了一些其他有趣的玩法眉踱,比如說社交網(wǎng)絡(luò)中「間隔度數(shù)」的計算(六度空間理論應(yīng)該聽說過)等等霜威,其實就是一個 BFS 廣度優(yōu)先搜索尋找最短路徑的問題侥祭,具體代碼實現(xiàn)這里就不展開了矮冬。

二、套匯的算法

如果我們說貨幣 A 到貨幣 B 的匯率是 10吆录,意思就是 1 單位的貨幣 A 可以換 10 單位貨幣 B恢筝。如果我們把每種貨幣視為一幅圖的頂點,貨幣之間的匯率視為加權(quán)有向邊此改,那么整個匯率市場就是一幅「完全加權(quán)有向圖」侄柔。

一旦把現(xiàn)實生活中的情景抽象成圖暂题,就有可能運用算法解決一些問題薪者。比如說圖中可能存在下面的情況:

image

圖中的加權(quán)有向邊代表匯率言津,我們可以發(fā)現(xiàn)如果把 100 單位的貨幣 A 換成 B纺念,再換成 C陷谱,最后換回 A,就可以得到 100×0.9×0.8×1.4 = 100.8 單位的 A渣窜!如果交易的金額大一些的話乔宿,賺的錢是很可觀的访雪,這種空手套白狼的操作就是套匯臣缀。

現(xiàn)實中交易會有種種限制,而且市場瞬息萬變精置,但是套匯的利潤還是很高的番宁,關(guān)鍵就在于如何快速找到這種套匯機(jī)會呢?

借助圖的抽象踱蠢,我們發(fā)現(xiàn)套匯機(jī)會其實就是一個環(huán)播聪,且這個環(huán)上的權(quán)重之積大于 1离陶,只要在順著這個環(huán)交易一圈就能空手套白狼衅檀。

圖論中有一個經(jīng)典算法叫做 Bellman-Ford 算法沉眶,可以用于尋找負(fù)權(quán)重環(huán)谎倔。對于我們說的套匯問題片习,可以先把所有邊的權(quán)重 w 替換成 -ln(w)藕咏,這樣「尋找權(quán)重乘積大于 1 的環(huán)」就轉(zhuǎn)化成了「尋找權(quán)重和小于 0 的環(huán)」孽查,就可以使用 Bellman-Ford 算法在 O(EV) 的時間內(nèi)尋找負(fù)權(quán)重環(huán)盲再,也就是尋找套匯機(jī)會答朋。

《算法4》就介紹到這里绿映,關(guān)于上面兩個例子的具體內(nèi)容丐一,可以自己去看書库车,公眾號后臺回復(fù)關(guān)鍵詞「算法4」就有 PDF柠衍。

PS:我認(rèn)真寫了 100 多篇原創(chuàng)晶乔,手把手刷 200 道力扣題目珍坊,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新正罢。建議收藏阵漏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了翻具。

三履怯、最后說幾句

首先,前文說對于數(shù)學(xué)證明裆泳、章后習(xí)題可以忽略叹洲,可能有人要抬杠了:難道習(xí)題和數(shù)學(xué)證明不重要嗎?

那我想說工禾,就是不重要运提,起碼對大多數(shù)人來說不重要帜篇。我覺得吧,學(xué)習(xí)就要帶著目的性去學(xué)签钩,大部分人學(xué)算法不就是鞏固計算機(jī)知識,對付面試題目嗎拾给?如果是這個目的乒疏,那就學(xué)些基本的數(shù)據(jù)結(jié)構(gòu)和經(jīng)典算法窍侧,明白它們的時間復(fù)雜度暇咆,然后去刷題就好了亏镰,何必和習(xí)題、證明過不去耸黑?

這也是我從來不推薦《算法導(dǎo)論》這本書的原因缺菌。如果有人給你推薦這本書,只可能有兩個原因剂陡,要么他是真大佬顽爹,要么他在裝大佬捏题。《算法導(dǎo)論》中充斥大量數(shù)學(xué)證明,而且很多數(shù)據(jù)結(jié)構(gòu)是很少用到的,頂多當(dāng)個字典用。你說你學(xué)了那些有啥用呢,饒過自己唄见转。

另外校焦,讀書在精不在多耸成。你花時間《算法4》過個大半(最后小半部分有點困難),同時刷點題劲件,看看咱們的公眾號文章牵辣,算法這塊真就夠了,別對細(xì)節(jié)問題太較真。

_____________

我的 在線電子書 有 100 篇原創(chuàng)文章,手把手帶刷 200 道力扣題目泳桦,建議收藏浮毯!對應(yīng)的 GitHub 算法倉庫 已經(jīng)獲得了 70k star芳誓,歡迎標(biāo)星赂摆!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹤树,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖屿储,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雹食,死亡現(xiàn)場離奇詭異,居然都是意外死亡赎离,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門荣病,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事编兄⌒恫欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俊嗽。 經(jīng)常有香客問我绍豁,道長芯咧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任竹揍,我火速辦了婚禮敬飒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芬位。我一直安慰自己无拗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布昧碉。 她就那樣靜靜地躺著英染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪被饿。 梳的紋絲不亂的頭發(fā)上四康,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音狭握,去河邊找鬼闪金。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哎垦。 我是一名探鬼主播囱嫩,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漏设!你這毒婦竟也來了墨闲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤愿题,失蹤者是張志新(化名)和其女友劉穎损俭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潘酗,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡杆兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仔夺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琐脏。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缸兔,靈堂內(nèi)的尸體忽然破棺而出日裙,到底是詐尸還是另有隱情,我是刑警寧澤惰蜜,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布昂拂,位于F島的核電站,受9級特大地震影響抛猖,放射性物質(zhì)發(fā)生泄漏格侯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一财著、第九天 我趴在偏房一處隱蔽的房頂上張望联四。 院中可真熱鬧,春花似錦撑教、人聲如沸朝墩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽收苏。三九已至,卻和暖如春愤兵,著一層夾襖步出監(jiān)牢的瞬間倒戏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工恐似, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傍念。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓矫夷,卻偏偏與公主長得像葛闷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子双藕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容