1. 程式人生 > >高效演算法:競賽、應試與提高必修128例

高效演算法:競賽、應試與提高必修128例

內容簡介

本書旨在探討如何優化演算法效率,詳細闡述了經典演算法和特殊演算法的實現、應用技巧和複雜度驗證過程,內容由淺入深,能幫助讀者快速掌握複雜度適當、正確率高的高效程式設計方法以及自檢、自測技巧,是參加 ACM ICPC、Google Code Jam 等國際程式設計競賽、備戰程式設計考試、提高程式設計效率、優化程式設計方法的參考書目。

適讀人群:本書適合演算法愛好者和程式設計人員,尤其是參加程式設計競賽和考試的人員,可作為參加程式設計競賽的備賽參考書目。

編輯推薦

  • 法國暢銷演算法與程式設計參考書
  • 128個簡單、實用的演算法例項
  • 透徹講解基於 Python 的高效演算法思路與程式設計要點
  • 戰勝程式設計競賽技術難關
  • 線上提供更多趣題和拓展實戰例子
  • 國際程式設計大賽導師經驗精髓,破解競賽的制勝祕籍
  • 提高競賽、應試與程式設計技能

作者簡介

Christoph Dürr,法國國家科學研究院研究員,巴黎皮埃爾-瑪麗 · 居里大學博士生導師,Operation Research 科研組研究主任。

Jill-Jênn Vie,法國高等電力學院博士、演算法講師,擔任法國高等師範學院 Paris-Saclay 團隊在 ACM 競賽中的演算法導師;曾任法國國際程式設計大賽 Prologin 主席,並於2014年獲 Google RISE Award。

本書內容

譯者序

22 年前的秋天,我剛剛進入初中時,得到了一臺中華學習機。它的 1 MHz 主頻甚至趕不上現在一臺 10 元錢的計算器。我從第一行用 BASIC 語言寫的 IF/ELSE 開始,開啟了自己的程式設計人生。1996 年,還是初中生的我憑著不多的演算法和邏輯知識參加了國家資訊學奧林匹克競賽,當然,最後只得到了安慰獎。二十多年後,我得知當年斬獲金牌的是王小川,如今搜狗的 CEO。

現在,我在一家網際網路公司負責技術並管理研發團隊。從自身的職業發展經歷,以及在中國和法國的招聘和用人經歷中,我深刻體會到了軟體工程師的成就在很大程度上取決於他的專業知識視野。這是個很現實的問題。因此,我在得到翻譯這本法語技術書的機會時,欣然接受了這個頗有難度的任務。

法國是一個盛產數學家的國度。不同於大家的傳統印象,法國人在“浪漫”的同時,在工作和科研中非常講究邏輯與驗證——產品原型要驗證,技術探索要驗證。證明和實驗有著同樣不可或缺的地位。理論和實踐的結合,讓法國學界和企業界在相當長時間內保持著旺盛的生命力與創造力。這是我在法國 8 年學習和工作中的真實體驗。

本書由法國國際資訊學奧林匹克競賽“國家隊”輔導老師編寫,凝聚了作者輔導高中生、大學生參加國際資訊學奧林匹克競賽的大量經驗和技巧。書中提及的部分演算法十分常見,在實際工作中也十分常用。但也有另一部分演算法,例如舞蹈鏈演算法以及一些涉及圖論與匹配的演算法,在中國的大學教育都不太提及。

在人工智慧和深度學習大發展的今天,Python 語言、演算法,特別是證明演算法可靠性和高效性的能力,是進入大資料和人工智慧人才市場的入場券。希望讀者善用 Github 和作者準備的原始碼網站,以及網上能夠找到的技術資源,在嘗試程式碼實現的同時,去理解演算法複雜度的證明過程,從而徹底掌握並熟練運用這些凝聚了很多代人智慧的無形資產。

我要感謝教我寫下第一行程式碼的哥哥史軼,支援並指導我參加國家資訊學奧林匹克競賽的湖北省十堰市東風汽車公司第四中學的陳長國老師,用大量課外知識開拓了我的見識的東風汽車公司第一中學的吳華山老師,支援我前往法國留學的父母,以及一直以來給我帶來太多快樂的妻子和孩子。

由於個人水平有限,譯文不能做到盡善盡美,歡迎讀者通過我的個人網站 www.jetwaves.cn 與我交流。

史世強

2017 年 10 月於巴黎

我們編寫本書的主要動力是對 Python 語言程式設計的熱愛和對解決演算法問題的激情。Python 語言能夠如此打動人,是因為這種語言能讓我們編寫清晰而優雅的程式碼,把注意力集中於演算法的本質步驟,而不需要過多關注複雜的語法和資料結構。同時,我們用 Python 完成編寫程式後數個月再回頭來讀的時候,仍然可以理解自己寫的程式碼,這一點十分有教益。作為本書的作者,我們最希望的是能接受新的挑戰,其次是能經得住各種測試,因為一段程式程式碼只有在毫無 bug 地實現後,我們才算真正地掌握了程式設計技巧。我們希望用自己的熱情感染讀者,營造出一種氛圍,鼓勵大家學習和掌握紮實的演算法和程式設計基礎知識。這種學習經歷往往會受到大型軟體企業招聘人員的賞識,而對於軟體工程師或電腦科學教育工作者來說,這對其整個職業生涯也會有所幫助。

本書按照主題而不是技術分類收錄了 128 種演算法。其中某些演算法是常見的經典演算法,另一些則不太常見。尤其在讀者備戰 ACM-ICPC、Google Code Jam、Facebook Hacker Cup、Prologin 和 France-ioi 等程式設計競賽時,本書編寫的大量問題將起到積極的輔導作用。我們希望本書能夠成為演算法的基礎教程和高階程式設計教程的參考,或者能讓學習數學和計算機專業的讀者看到與眾不同的進修內容。讀者可以在網站 tryalgo.org(http://tryalgo.org/code/)上找到本書使用的原始碼庫 {1[也可以用 PyPI 直接安裝後下載檢視並執行。——譯者注]},以及用來測試程式碼除錯結果和實現效能的連結。

感謝 Huong 和智子,如果沒有這兩位朋友的支援,本書是無法完成的。感謝法國綜合理工學院和法國高等師範學院 Cachan 分校的學生們,他們多次通宵達旦的訓練,為本書提供了很多素材。最後,感謝所有審閱手稿的朋友們,他們是 René Adad、Evripidis Bampis、Binh-Minh Bui-Xuan、Stéphane Henriot、Lê Thành Dững Nguyễn、Alexandre Nolin 和 Antoine Pietri。本書的作者之一要特別感謝在 Tiers 高中時的老師 Yves Lemaire 先生:當年就是在這位老師的啟迪下,作者才初次發現了本書 2.5 節中描述的“寶藏”。

最後,我們希望讀者在碰到演算法難題時,能夠耐心地花時間去思考。祝願大家能在豁然間找到解答,甚至是一個優雅的解答,享受到勝利的喜悅之情。

好,我們要開始了!

第1章 引言
第2章 字串
第3章 序列
第4章 陣列
第5章 區間
第6章 圖
第7章 圖中的環
第8章 最短路徑
第9章 耦合性和流
第10章 樹
第11章 集合
第12章 點和多邊形
第13章 長方形
第14章 計算
第15章 窮舉

閱讀全文: http://gitbook.cn/gitchat/geekbook/5bbd724d9ccd7c1379f30155