讀者拿到這本書的感覺可能是: 這本書真厚。接下來他有點忐忑和疑惑: 這本書雖然厚,但是它有價值嗎?它的內容和風格適合我嗎?還有其他的一些問題。下面做一個詳細的解答。
為什麼學算法競賽
算法競賽是計算機相關競賽中影響的分支。目前國內影響大的計算機算法類競賽有全國青少年信息學奧林匹克競賽(NOI)、國際大學生程序設計競賽(ICPC)、中國大學生程序設計競賽(CCPC)、藍橋杯全國軟件和信息技術專業人纔大賽(軟件類)、中國高校計算機大賽團體程序設計天梯賽等。每個競賽每年的參賽者,少則幾萬人,多則十幾萬人。
在大學裡,與算法競賽相關的課程有“計算機程序設計”“數據結構與算法”“算法分析與設計”“程序閱讀與編程實踐”“算法與程序設計實踐”“算法藝術與競賽”等。
在算法競賽中獲獎有很多好處。在學校可以獲得獎學金,保研時獲得加分。畢業找工作時更有用,一張算法競賽的獲獎證書
是用人單位判斷求職者能力的重要依據。算法競賽受到學校、學生、用人單位的重視和歡迎。
學習和參加算法競賽,是通往傑出程序員的捷徑。競賽的獲獎者基本上都成長為出色的軟件工程師,並且有很多人是IT公司的創業者。例如當前熱門的自動駕駛公司小馬智行的聯合創始人兼CTO樓天城,是2009年ICPC全球總決賽第二戎啟行公司的員工大多數是ICPC的金牌隊員。
算法競賽在以下幾方面對IT人纔培養起到了關鍵作用:
(1) 編寫大量代碼。代碼量直接體現了程序員的能力。比爾·蓋茨說: “如果你想雇用一個工程師,看看他寫的代碼,就夠了。如果他沒寫過大量代碼,就不要雇用他。”Linus說: “Talk is cheap,show me the code.”大量編碼是傑出程序員的基本功。算法競賽隊員想獲獎,普遍需要寫5萬~10萬行的代碼。
(2) 掌握豐富的算法知識。算法競賽涉及絕大部分常見的確定性算法,掌握這些知識不僅能在軟件開發中得心應手,而且是進一步探索未知算法的基礎。例如現在非常火爆的、代表了人類未來技術的人工智能研究,涉及許多精深的算法理論,沒有經過基礎算法訓練的人根本無法參與。
(3) 培養計算思維和邏輯思維。一道算法題往往需要綜合多種能力,例如數據結構、算法知識、數學方法、流程和邏輯等,這是計算思維和邏輯思維能力的體現。
(4) 培養團隊合作精神。在軟件行業,團隊合作非常重要。像ICPC、CCPC這樣的團隊賽,把對團隊合作的要求放在了重要位置。一支隊伍的3個人,在同等水平下,配合默契的話可以多做一兩道題,把獲獎等級提高一個檔次。他們在日常訓練中通過長期磨合,互相了解,做到合理分工、優勢互補,從而發揮出的團隊力量。即使是藍橋杯和NOI這樣的個人賽,隊員在學習過程中互助互學,也發揮了團隊的關鍵作用。
為什麼選用這本書
讀者的期望總是很高的。
如果讀者是一名算法競賽的初學者,他非常希望有一本“神書”。讀完這本“神書”之後,他或者在參加大公司的算法題面試時自信滿滿,或者參加算法競賽時代碼噴湧而出,或者在日常工作中能用巧妙的算法解決實際問題……前輩們向他推薦了一些好書,他看了書,做了一些例題,他覺得自己學到了很多算法,掌握了很多競賽技巧,但是遇到實際問題,或者參加競賽時,他還是感覺很暈,發現那些書和例題似乎都用不上。神書在哪裡?
當他跨過初學者的門檻,他會認識到這樣的“神書”其實並不存在。這往往不是書的問題,而是他對書的期望過高了。一些算法競賽相關的教材確實寫得很好,也有很好的口碑,可以說是學習算法競賽的書。但是要將書上的知識轉化為自己的能力,需要經過大量的練習,正如陸遊詩中所說: “紙上得來終覺淺,絕知此事要躬行。”對應到編程這件事上,有兩個重要的學習過程: ①學習經典算法和經典代碼,建立算法思維; ②大量編碼,讓代碼成為自己大腦思維的一部分。
算法競賽的學習難度頗高,它需要一名參賽者掌握以下能力: 豐富的算法知識、快速準確的編碼能力、敏捷的建模能力。
學習算法競賽產生了一個自然的結果: 經過長期深入學習並在算法競賽中得獎的學生,都建立了對自己計算機編程能力的自信,並能順利成為出色的程序員。
算法競賽這樣高難度的學習顯然不是一蹴而就的。算法競賽的學習者分為三個層次: 初學者、中級隊員和高級隊員。本書努力幫助讀者順利度過從初級到高級的學習過程,希望讀者看過本書之後,能說一句: “這本書雖然不神,但是還不錯!”
本書是一本算法競賽“大全”,講解了算法競賽涉及的絕大部分知識點。書中對應的部分也適合這三種層次的學員,陪伴他們從初學者走向高級隊員。
(1) 初學者。一名剛學過C/C 、Java、Python中任意一門編程語言的學生,做了一些編程題目,建立了編碼的興趣,對進一步學習有信心和動力,希望有一本介紹算法競賽知識點的書指導學習,這本書的初級部分正適合他,幫助他了解基礎算法知識點、學習模板代碼、練習基礎題。經過這樣的學習後,他很可能獲得藍橋杯省賽三等獎,甚至更好。不過,他仍沒有獲得ICPC、CCPC銅獎的能力。
(2) 中級隊員。中級隊員順利地跨過了初學者階段,他證明自己已經走上了成為傑出程序員的道路。中級隊員符合這樣的畫像: 精通編程語言,編碼得心應手; 他做過幾百道基礎算法題,並且準備繼續對算法競賽傾心投入; 他有了志同道合、水平相當的隊友一起學習進步; 他遇到了學習瓶頸,計算思維還不夠; 他隻能做簡單題和一些中等題,對難題無從下手。中級隊員可能獲得藍橋杯省賽二等獎、一等獎,也差不多有ICPC、CCPC銅獎的水平。本書的中級部分能幫助他進一步掌握算法知識、提高算法思維能力、練習較難的題目。
(3) 高級隊員。他們獲得了藍橋杯國賽二等獎或一等獎,以及ICPC、CCPC銀牌或金牌。這些獎牌是“高級隊員”的標簽,他們已經足夠被稱為“出色的程序員”,在就業市場上十分搶手。本書的高級部分能幫助他們進一步擴展知識點,增強計算思維。
本書的內容介紹
本書內容的難度涵蓋了初級、中級、高級,下面對本書的章節按難度做一個劃分。
章名初級中級高級