《程序得运、競賽與算法》是老文章,里面講的內(nèi)容基本過時锅移,沒有什么意思熔掺。重新放出來是希望大家記得,在我們的CS學(xué)院非剃,ACM競賽是很牛逼的事情置逻。--作者注
2013年左右,筆者抽空關(guān)注了一下某些程序設(shè)計(jì)競賽的書备绽。我是競賽盲券坞,沒有參加過任何程序競賽,不過我就喜歡折騰肺素、瞎想恨锚,順便也與幾位搞過ACM競賽的同學(xué)探討相關(guān)問題。
首先压怠,我找來某同學(xué)推薦的《挑戰(zhàn)程序設(shè)計(jì)競賽(第2版)》( 作者: 秋葉拓哉 / 巖田陽一 / 北川宜稔 出版社: 人民郵電出版社 譯者: 巫澤俊 / 莊俊元 / 李津羽 出版年: 2013-6)翻看了一下眠冈,挺有意思。加上我之前買的劉汝佳的幾本競賽書菌瘫,我對程序競賽有了一點(diǎn)點(diǎn)認(rèn)識蜗顽。我就想,一本講競賽的書與一本算法書有什么區(qū)別呢雨让?比如雇盖,《算法導(dǎo)論》?
然后主要是針對《挑戰(zhàn)程序設(shè)計(jì)競賽》和《算法導(dǎo)論》進(jìn)行了一些比較栖忠。我發(fā)現(xiàn)崔挖,從內(nèi)容的組織上它們有非常類似之處:從基本的數(shù)據(jù)結(jié)構(gòu)出發(fā)(堆、棧庵寞、樹狸相、圖),講解一些基本的算法捐川,然后貪心法脓鹃、回溯法,進(jìn)而動態(tài)規(guī)劃古沥,網(wǎng)絡(luò)流瘸右,計(jì)算幾何娇跟,再加上一些數(shù)學(xué)知識,主要以數(shù)論太颤、組合數(shù)學(xué)為主的知識苞俘。盡管類似,但是又有非常明顯的區(qū)別龄章。(《數(shù)據(jù)結(jié)構(gòu)》吃谣、數(shù)論、概率等本身就獨(dú)立成課瓦堵,使得分析下去會更復(fù)雜基协。《算法導(dǎo)論》有數(shù)據(jù)結(jié)構(gòu)的內(nèi)容菇用,但顯然這部分內(nèi)容并非必須澜驮。)
主要體現(xiàn)在纵朋,競賽書的講解主要針對特定的題目释树,強(qiáng)調(diào)技巧和程序。算法書針對已知問題(難題)猜敢,強(qiáng)調(diào)準(zhǔn)確性卦绣、系統(tǒng)性和通用性耐量。我列表如下,其中有些結(jié)論我心目中不是那么武斷滤港,只是寫下來就成了這個樣子廊蜒,大家可以探討:
目標(biāo) 系統(tǒng)性 理論性 技巧性 關(guān)注點(diǎn) 趣味性 學(xué)習(xí)要求
算法學(xué)習(xí): 學(xué)科訓(xùn)練 強(qiáng) 強(qiáng) 較弱 通用難題 較弱 高
ACM競賽: 比賽 較弱 弱 強(qiáng) 特定問題 強(qiáng) 高
注:難題,我指的是理論上準(zhǔn)確定義的無高效算法的那一類問題溅漾。有了準(zhǔn)確定義之后山叮,世界上就只有一種難題。特定問題添履,我想說屁倔,它們是被設(shè)計(jì)出來而且必然有答案的“玩具”題,對很多人也許很難暮胧,但本質(zhì)上一定是“容易”的問題锐借。
以上比較還沒涉及另一個關(guān)鍵詞:程序。競賽培訓(xùn)書都會講一點(diǎn)編程往衷,一般也會分析不少的代碼钞翔,而算法書大多是用偽代碼,而不會講程序席舍。值得注意嗅战,競賽書會涉及編程,但又絕不能替代程序設(shè)計(jì)的入門教程。所以驮捍,我這里列出了三個關(guān)鍵詞:程序、競賽和算法脚曾。恰恰競賽就在“程序”與“算法”的中間东且,是利用程序和算法思路去解題。競賽當(dāng)然需要高IQ本讥、豐富的想象珊泳、高超的技巧和有針對性的強(qiáng)化培訓(xùn)。值得注意并且我想強(qiáng)調(diào)的是拷沸,競賽訓(xùn)練并不能替代編程的訓(xùn)練和算法的學(xué)習(xí)色查。希望通過程序競賽來進(jìn)行程序和算法的學(xué)習(xí),或者寄望其可強(qiáng)化學(xué)習(xí)或作為高階訓(xùn)練撞芍,就顯得有點(diǎn)不切實(shí)際秧了。
計(jì)算學(xué)科發(fā)展這么幾十年,在基礎(chǔ)科目上都有非常專門的訓(xùn)練內(nèi)容序无。請大家記住這一點(diǎn)验毡,也許你缺乏這些訓(xùn)練,只是你缺乏帝嗡,而不是教學(xué)內(nèi)容上缺乏晶通。而且這種訓(xùn)練絕不能用競賽的訓(xùn)練來替代。對此缺乏足夠認(rèn)識的同學(xué)將要碰釘子的哟玷!如何有針對性地進(jìn)行學(xué)科訓(xùn)練則不是本文所討論的問題狮辽。
總之,我現(xiàn)在的建議是:競賽本身是非常有意思的活動巢寡,它幫助了程序設(shè)計(jì)的訓(xùn)練和算法的學(xué)習(xí)喉脖,激發(fā)了同學(xué)們的學(xué)習(xí)興趣,也有助于培養(yǎng)學(xué)習(xí)能力讼渊、交流能力动看、團(tuán)隊(duì)精神,值得提倡爪幻。但是競賽不能替代編程與算法的學(xué)科訓(xùn)練菱皆。編程與算法是計(jì)算機(jī)學(xué)科的兩大基本學(xué)科內(nèi)容,是必修的基礎(chǔ)科目挨稿,需要系統(tǒng)地強(qiáng)化訓(xùn)練與學(xué)習(xí)仇轻。
2017年7月6日整理