• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            讀《程序員的十層樓》

            這篇文章看了三四次啦,開(kāi)了博客就轉(zhuǎn)過(guò)來(lái)了。
            作者比較牛逼,說(shuō)得都很在理,作者應(yīng)該位于學(xué)者以上的層次了,不然眼光也放不到這么遠(yuǎn)。
            包括第11層,都說(shuō)得很對(duì)。上帝確實(shí)存在,自古都有敬神信神的故事,就不多說(shuō)了。。

            其實(shí)程序員的目的未必是要向更高層次發(fā)展,但重要的是找到自己的層次并且做到極致。就好比李開(kāi)復(fù)說(shuō)的“做最好的自己”。
            很多人,包括哥,都在迷茫著。究竟怎么做,才算做到極致。。。。
            這是最大的問(wèn)題。

            posted @ 2010-02-20 15:31 糯米 閱讀(310) | 評(píng)論 (0)編輯 收藏

            [轉(zhuǎn)]程序員的十層樓

            自西方文藝復(fù)興以來(lái),中國(guó)在自然科學(xué)方面落后西方很多,軟件領(lǐng)域也不例外。當(dāng)然現(xiàn)在中國(guó)的許多程序員們對(duì)此可能有許多不同的意見(jiàn),有些人認(rèn)為中國(guó)的程序員水平遠(yuǎn)落后于西方,有些則認(rèn)為中國(guó)的程序員個(gè)人能力并不比西方的程序員差,只是整個(gè)軟件產(chǎn)業(yè)落后而已。那么,到底中國(guó)的程序員水平比西方程序員水平差,還是中國(guó)有許多優(yōu)秀的程序員達(dá)到或超過(guò)了西方程序員同等水平呢?要解決這個(gè)問(wèn)題,必須先知道程序員 有多少種技術(shù)層級(jí),每個(gè)層級(jí)需要什么樣的技術(shù)水平,然后再比較中國(guó)和西方在各個(gè)技術(shù)層級(jí)的人數(shù),就可以知道到底有沒(méi)有差距,差距有多大。
            當(dāng)然,對(duì)于如何劃分程序員的技術(shù)層級(jí),不同公司或不同人會(huì)有不同的劃分標(biāo)準(zhǔn),下面的劃分僅代表個(gè)人的觀點(diǎn),如有不當(dāng)之處,還請(qǐng)?jiān)野宕u予以糾正。

            第1層 
            菜鳥(niǎo)第1層樓屬于地板層,邁進(jìn)這層樓的門(mén)檻是很低的。基本上懂計(jì)算機(jī)的基本操作,了解計(jì)算機(jī)專業(yè)的一些基礎(chǔ)知識(shí),掌握一門(mén)基本的編程語(yǔ)言如C/C++,或者Java,或者JavaScript,...,均可入門(mén)邁進(jìn)這層。
            在這層上,中國(guó)有著絕對(duì)的優(yōu)勢(shì),除了從計(jì)算機(jī)專業(yè)畢業(yè)的眾多人數(shù)外,還有大量的通信、自動(dòng)化、數(shù)學(xué)等相關(guān)專業(yè)的人士進(jìn)入這一行,此外還有眾多的其他專業(yè)轉(zhuǎn)行的人士,人數(shù)絕對(duì)比西方多出甚多。并且還有一個(gè)優(yōu)勢(shì)就是我們這層人員的平均智商比西方肯定高。
            沒(méi)有多少人愿意一輩子做菜鳥(niǎo),因?yàn)樽?菜鳥(niǎo)"的滋味實(shí)在是不咋的,整天被老大們吆喝著去裝裝機(jī)器,搭建一下測(cè)試環(huán)境,或者對(duì)照著別人寫(xiě)好的測(cè)試用例 做一些黑盒測(cè)試,好一點(diǎn)的可以被安排去寫(xiě)一點(diǎn)測(cè)試代碼。當(dāng)然如果運(yùn)氣"好"的話,碰到了國(guó)內(nèi)的一些作坊式的公司,也有機(jī)會(huì)去寫(xiě)一些正式的代碼。
            所以,菜鳥(niǎo)們總是在努力學(xué)習(xí),希望爬更高的一層樓去。

            第2層
            大蝦從第1層爬到第2層相對(duì)容易一些,以C/C++程序員為例,只要熟練掌握C/C++編程語(yǔ)言,掌握C標(biāo)準(zhǔn)庫(kù)和常用的各種數(shù)據(jù)結(jié)構(gòu)算法,掌握STL的 基本實(shí)現(xiàn)和使用方法,掌握多線程編程基礎(chǔ)知識(shí),掌握一種開(kāi)發(fā)環(huán)境,再對(duì)各種操作系統(tǒng)的API都去使用一下,搞網(wǎng)絡(luò)編程的當(dāng)然對(duì)socket編程要好好掌握 一下,然后再學(xué)習(xí)一些面向?qū)ο蟮脑O(shè)計(jì)知識(shí)和設(shè)計(jì)模式等,學(xué)習(xí)一些測(cè)試、軟件工程和質(zhì)量控制的基本知識(shí),大部分人經(jīng)過(guò)2~3年的努力,都可以爬到第2層,晉 升為"大蝦"。
            中國(guó)的"大蝦"數(shù)量和"菜鳥(niǎo)"數(shù)量估計(jì)不會(huì)少多少,所以這層上仍然遠(yuǎn)領(lǐng)先于西方。
            大蝦們通常還是有些自知之明,知道自己只能實(shí)現(xiàn)一些簡(jiǎn)單的功能,做不了大的東西,有時(shí)候還會(huì)遇到一些疑難問(wèn)題給卡住,所以他們對(duì)那些大牛級(jí)的人物通 常是非常崇拜的,國(guó)外的如Robert C. Martin、Linus Torvalds,國(guó)內(nèi)的如求伯君、王志東等通常是他們崇拜的對(duì)象。其中的有些人希望有一天也能達(dá)到這些大牛級(jí)人物的水平,所以他們繼續(xù)往樓上爬去。


            第3層
            牛人由于"大蝦"們經(jīng)常被一些疑難問(wèn)題給卡住,所以有了"大蝦"們只好繼續(xù)學(xué)習(xí),他們需要將原來(lái)所學(xué)的知識(shí)進(jìn)一步熟練掌握,比如以熟練掌握C++編程語(yǔ) 言為例,除了學(xué)一些基礎(chǔ)性的C++書(shū)籍如《C++ Primer》,《Effective C++》,《Think in C++》,《Exception C++》等之外,更重要的是需要了解C++編譯器的原理和實(shí)現(xiàn)機(jī)制,了解操作系統(tǒng)中的內(nèi)部機(jī)制如內(nèi)存管理、進(jìn)程和線程的管理機(jī)制,了解處理器的基礎(chǔ)知識(shí)和 代碼優(yōu)化的方法,此外還需要更深入地學(xué)習(xí)更多的數(shù)據(jù)結(jié)構(gòu)與算法,掌握更深入的測(cè)試和調(diào)試知識(shí)以及質(zhì)量管理和控制方法,對(duì)各種設(shè)計(jì)方法有更好的理解等。
            學(xué)習(xí)上面說(shuō)的這些知識(shí)不是一揮而就的,不看個(gè)三五十本書(shū)并掌握它是做不到的。以數(shù)據(jù)結(jié)構(gòu)算法來(lái)說(shuō),至少要看個(gè)5~10本這方面的著作;以軟件設(shè)計(jì)來(lái) 說(shuō),光懂結(jié)構(gòu)化設(shè)計(jì)、面向?qū)ο笤O(shè)計(jì)和一些設(shè)計(jì)模式是不夠的,還要了解軟件架構(gòu)設(shè)計(jì)、交互設(shè)計(jì)、面向方面的設(shè)計(jì)、面向使用的設(shè)計(jì)、面向數(shù)據(jù)結(jié)構(gòu)算法的設(shè)計(jì)、 情感化設(shè)計(jì)等,否則是很難進(jìn)到這個(gè)樓層的。
            當(dāng)然除了上面說(shuō)的知識(shí)外,大蝦們還需要去學(xué)習(xí)各種經(jīng)驗(yàn)和技巧。當(dāng)然這點(diǎn)難不倒他們,現(xiàn)在出版的書(shū)籍眾多,網(wǎng)絡(luò)上的技術(shù)文章更是不勝數(shù),然后再去各種 專業(yè)論壇里泡一泡,把這些書(shū)籍和文章中的各種經(jīng)驗(yàn)、技能、技巧掌握下來(lái),再去學(xué)習(xí)一些知名的開(kāi)源項(xiàng)目如Apache或Linux操作系統(tǒng)的源代碼實(shí)現(xiàn)等。 此時(shí)對(duì)付一般的疑難問(wèn)題通常都不在話下,菜鳥(niǎo)和大蝦們會(huì)覺(jué)得你很"牛",你也就爬到了第3層,晉升為"牛人"了。
            看了上面所講的要求,可能有些大蝦要暈過(guò)去了,成為牛人要學(xué)這么多東西啊!要求是不是太高了?其實(shí)要求一點(diǎn)也不高,這么點(diǎn)東西都掌握不了的話,怎么能讓別人覺(jué)得你"牛"呢?

            需要提一下的是,進(jìn)入多核時(shí)代后,從第2層爬到第3層增加了一道多核編程的門(mén)檻。當(dāng)然要邁過(guò)這道門(mén)檻并不難,已經(jīng)有很多前輩高人邁進(jìn)了這道門(mén)檻,只要循著他們的足跡前進(jìn)就可以了。想邁進(jìn)這道門(mén)檻者不妨去學(xué)習(xí)一下TBB開(kāi)源項(xiàng)目的源代碼(鏈接:http://www.threadingbuildingblocks.org/),然后上Intel的博客(http://softwareblogs-zho.intel.com/)和多核論壇(http://forum.csdn.net/Intel/IntelMulti-core/)去看看相關(guān)文章,再買上幾本相關(guān)的書(shū)籍學(xué)習(xí)一下。

            在國(guó)內(nèi), 一旦成為"牛人",通常可以到許多知名的公司里去,運(yùn)氣好者可以掛上一個(gè)架構(gòu)師的頭銜,甚至掛上一個(gè)"首席架構(gòu)師"或者"首席xx學(xué)家"的頭銜也不足為 奇。有不少爬到這層的人就以為到了樓頂了,可以眼睛往天上看了,開(kāi)始目空一切起來(lái),以為自己什么都可以做了,什么都懂了,經(jīng)常在網(wǎng)絡(luò)上亂砸板磚是這個(gè)群體 的最好寫(xiě)照。由此也看出,國(guó)內(nèi)的牛人數(shù)量仍然眾多,遠(yuǎn)多于西方的牛人數(shù)量,在這層上仍然是領(lǐng)先的。
            也有不少謙虛的"牛人",知道自己現(xiàn)在還不到半桶水階段。他們深知爬樓的游戲就像猴子上樹(shù)一樣,往下看是笑臉,往上看是屁股。為了多看笑臉,少看屁股,他們并沒(méi)有在此停步不前,而是繼續(xù)尋找到更上一層的樓梯,以便繼續(xù)往上爬。
             

            第4層
             大牛從第3層爬到第4層可不像上面說(shuō)過(guò)的那幾層一樣容易,要成為大牛的話,你必須要能做牛人們做不了的事情,解決牛人們解決不了問(wèn)題。比如牛人們通常都 不懂寫(xiě)操作系統(tǒng),不會(huì)寫(xiě)編譯器,不懂得TCP/IP協(xié)議的底層實(shí)現(xiàn),如果你有能力將其中的任何一個(gè)實(shí)現(xiàn)得象模象樣的話,那么你就從牛人升級(jí)為"大牛"了。
            當(dāng)然,由于各個(gè)專業(yè)領(lǐng)域的差別,這里舉操作系統(tǒng)、編譯器、TCP/IP協(xié)議只是作為例子,并不代表成為"大牛"一定需要掌握這些知識(shí),以時(shí)下熱門(mén)的 多核編程來(lái)說(shuō),如果你能比牛人們更深入地掌握其中的各種思想原理,能更加自如的運(yùn)用,并有能力去實(shí)現(xiàn)一個(gè)象開(kāi)源項(xiàng)目TBB庫(kù)一樣的東西,也可以成為"大 牛",又或者你能寫(xiě)出一個(gè)類似Apache一樣的服務(wù)器,或者寫(xiě)出一個(gè)數(shù)據(jù)庫(kù),都可以成為"大牛"。
            要成為"大牛"并不是一件簡(jiǎn)單的事情,需要付出比牛人們多得多的努力,一般來(lái)說(shuō),至少要看過(guò)200~400本左右的專業(yè)書(shū)籍并好好掌握它,除此之外,還得經(jīng)常關(guān)注網(wǎng)絡(luò)和期刊雜志上的各種最新信息。
            當(dāng)"牛人"晉升為"大牛",讓"牛人們"發(fā)現(xiàn)有比他們更牛的人時(shí),對(duì)"牛人"們的心靈的震撼是可想而知的。由于牛人們的數(shù)量龐大,并且牛人對(duì)大蝦和 菜鳥(niǎo)階層有言傳身教的影響,所以大牛們通常能獲得非常高的社會(huì)知名度,幾乎可以用"引無(wú)數(shù)菜鳥(niǎo)、大蝦、牛人競(jìng)折腰"來(lái)形容,看看前面提過(guò)的Linus Torvalds等大牛,應(yīng)該知道此言不虛。
            雖然成為"大牛"的條件看起來(lái)似乎很高似的,但是這層樓并不是很難爬的一層,只要通過(guò)一定的努力,素質(zhì)不是很差,還是有許多"牛人"可以爬到這一層的。由此可知,"大牛"這個(gè)樓層的人數(shù)其實(shí)并不像想像的那么少,例如比爾·蓋茨之類的人好像也是屬于這一層的。
            由于"大牛"這層的人數(shù)不少,所以也很難統(tǒng)計(jì)除到底是中國(guó)的"大牛"數(shù)量多還是西方的大牛數(shù)量多?我估計(jì)應(yīng)該是個(gè)旗鼓相當(dāng)?shù)臄?shù)量,或者中國(guó)的"大牛"們會(huì)更多一些。
            看到這里,可能會(huì)有很多人會(huì)以為我在這里說(shuō)瞎話,Linus Torvalds寫(xiě)出了著名的Linux操作系統(tǒng),我國(guó)并沒(méi)有人寫(xiě)出過(guò)類似的東西啊,我國(guó)的"大牛"怎么能和西方的比呢? 不知大家注意到?jīng)]有,Linus Torvalds只是寫(xiě)出了一個(gè)"象模象樣"的操作系統(tǒng)雛形,Linux后來(lái)真正發(fā)展成聞名全球的開(kāi)源操作系統(tǒng)期間,完全是因?yàn)樵S多支持開(kāi)源的商業(yè)公司如 IBM等,派出了許多比Linus Torvalds更高樓層的幕后英雄在里面把它開(kāi)發(fā)出來(lái)的。
            可能有些菜鳥(niǎo)認(rèn)為L(zhǎng)inus Torvalds是程序員中的上帝,不妨說(shuō)個(gè)小故事:
            Linus,Richard Stallman和Don Knuth(高德納)一同參加一個(gè)會(huì)議。
            Linus 說(shuō):"上帝說(shuō)我創(chuàng)造了世界上最優(yōu)秀的操作系統(tǒng)。"
            Richard Stallman自然不甘示弱地說(shuō):"上帝說(shuō)我創(chuàng)造了世界上最好用的編譯器。"
            Don Knuth一臉疑惑的說(shuō):"等等,等等,我什么時(shí)候說(shuō)過(guò)這些話?"
            由此可以看出,Linus Torvalds的技術(shù)水平并不像想像中那么高,只是"牛人"和"大蝦"覺(jué)得"大牛"比他們更牛吧了。在我國(guó),有一些當(dāng)時(shí)還處于"大蝦"層的人物,也能寫(xiě) 出介紹如何寫(xiě)操作系統(tǒng)的書(shū),并且書(shū)寫(xiě)得非常出色,而且寫(xiě)出了一個(gè)有那么一點(diǎn)點(diǎn)象模象樣的操作系統(tǒng)來(lái)。我想中國(guó)的"大牛"們是不會(huì)比西方差的,之所以沒(méi)有人 寫(xiě)出類似的商業(yè)產(chǎn)品來(lái),完全是社會(huì)環(huán)境的原因,并不是技術(shù)能力達(dá)不到的原因。
            "大牛"們之所以成為大牛,主要的原因是因?yàn)榘?牛人"給蓋了下去,并不是他們自己覺(jué)得如何牛。也許有很多菜鳥(niǎo)、大蝦甚至牛人覺(jué)得"大牛"這層已經(jīng) 到頂了,但大多數(shù)"大牛"估計(jì)應(yīng)該是有自知之明的,他們知道自己現(xiàn)在還沒(méi)有爬到半山腰,也就勉強(qiáng)能算個(gè)半桶水的水平,其中有些爬到這層沒(méi)有累趴下,仍然能 量充沛,并且又有志者,還是會(huì)繼續(xù)往更上一層樓爬的。
            看到這里,也許有些菜鳥(niǎo)、大蝦、牛人想不明白了,還有比"大牛"們更高的樓層,那會(huì)是什么樣的樓層?下面就來(lái)看看第5層樓的奧妙。


            第5層
             專家當(dāng)大牛們真正動(dòng)手做一個(gè)操作系統(tǒng)或者類似的其他軟件時(shí),他們就會(huì)發(fā)現(xiàn)自己的基本功仍然有很多的不足。以內(nèi)存管理為例,如果直接抄襲Linux或者其 他開(kāi)源操作系統(tǒng)的內(nèi)存管理算法,會(huì)被人看不起的,如果自動(dòng)動(dòng)手實(shí)現(xiàn)一個(gè)內(nèi)存管理算法,他會(huì)發(fā)現(xiàn)現(xiàn)在有關(guān)內(nèi)存管理方法的算法數(shù)量眾多,自己并沒(méi)有全部學(xué)過(guò)和 實(shí)踐過(guò),不知道到底該用那種內(nèi)存管理算法。
            看到這里,可能有些人已經(jīng)明白第5層樓的奧妙了,那就是需要做基礎(chǔ)研究,當(dāng)然在計(jì)算機(jī)里,最重要的就是"計(jì)算"二字,程序員要做基礎(chǔ)研究,主要的內(nèi)容就是研究非數(shù)值"計(jì)算"。
            非數(shù)值計(jì)算可是一個(gè)非常龐大的領(lǐng)域,不僅時(shí)下熱門(mén)的"多核計(jì)算"與"云計(jì)算"屬于非數(shù)值計(jì)算范疇,就是軟件需求、設(shè)計(jì)、測(cè)試、調(diào)試、評(píng)估、質(zhì)量控 制、軟件工程等本質(zhì)上也屬于非數(shù)值計(jì)算的范疇,甚至芯片硬件設(shè)計(jì)也同樣牽涉到非數(shù)值計(jì)算。如果你還沒(méi)有真正領(lǐng)悟"計(jì)算"二字的含義,那么你就沒(méi)有機(jī)會(huì)進(jìn)到 這層樓來(lái)。
            可能有人仍然沒(méi)有明白為什么比爾·蓋茨被劃在了大牛層,沒(méi)有進(jìn)到這層來(lái)。雖然比爾·蓋茨大學(xué)未畢業(yè),學(xué)歷不夠,但是家有藏書(shū)2萬(wàn)余冊(cè),進(jìn)入軟件這個(gè) 行業(yè)比絕大部分人都早,撇開(kāi)他的商業(yè)才能不談,即使只看他的技術(shù)水平,也可以算得上是學(xué)富五車,頂上幾個(gè)普通的計(jì)算機(jī)軟件博士之和是沒(méi)有問(wèn)題的,比起 Linus Torvalds之類的"大牛"們應(yīng)該技高一籌才對(duì),怎么還進(jìn)不了這層樓呢?
            非常遺憾的是,從Windows操作系統(tǒng)的實(shí)現(xiàn)來(lái)看,其對(duì)計(jì)算的理解是很膚淺的,如果把Google對(duì)計(jì)算方面的理解比做大學(xué)生,比爾·蓋茨只能算做一個(gè)初中生,所以比爾·蓋茨永遠(yuǎn)只能做個(gè)大牛人,成不了"專家"。
            看到這里,也許國(guó)內(nèi)的大牛們要高興起來(lái)了,原來(lái)比爾·蓋茨也只和我等在同一個(gè)層次,只要再升一層就可以超越比爾·蓋茨了。不過(guò)爬到這層可沒(méi)有從"牛 人"升為"大牛"那么簡(jiǎn)單,人家比爾·蓋茨都家有2萬(wàn)多冊(cè)書(shū),讓你看個(gè)500~1000本以上的專業(yè)書(shū)籍并掌握好它應(yīng)該要求不高吧。當(dāng)然,這并不是主要的 條件,更重要的是,需要到專業(yè)的學(xué)術(shù)站點(diǎn)去學(xué)習(xí)了,到ACM,IEEE,Elsevier,SpringerLink,SIAM等地方去下載論文應(yīng)該成為 你的定期功課,使用Google搜索引擎中的學(xué)術(shù)搜索更是應(yīng)該成為你的日常必修課。此外,你還得經(jīng)常關(guān)注是否有與你研究相關(guān)的開(kāi)源項(xiàng)目冒出來(lái),例如當(dāng)聽(tīng)到 有TBB這樣針對(duì)多核的開(kāi)源項(xiàng)目時(shí),你應(yīng)該第一時(shí)間到Google里輸入"TBB"搜索一下,將其源代碼下載下來(lái)好好研究一番,這樣也許你的一只腳已經(jīng)快 邁進(jìn)了這層樓的門(mén)檻。
            當(dāng)你象我上面說(shuō)的那樣去做了以后,隨著時(shí)間的推移,總會(huì)有某天,你發(fā)現(xiàn),在很多小的領(lǐng)域里,你已經(jīng)學(xué)不到什么新東西了,所有最新出來(lái)的研究成果你幾 乎都知道。此時(shí)你會(huì)發(fā)現(xiàn)你比在做"牛人"和"大牛"時(shí)的水平不知高出了多少,但是你一點(diǎn)也"牛"不起來(lái),因?yàn)槟銓W(xué)的知識(shí)和思想都是別人提出來(lái)的,你自己并 沒(méi)有多少自己的知識(shí)和思想分享給別人,所以你還得繼續(xù)往樓上爬才行。
            我不知道國(guó)內(nèi)的"專家"到底有多少,不過(guò)有一點(diǎn)可以肯定的是,如果把那些專門(mén)蒙大家的"磚家"也算上的話,我們的磚家比西方的要多得多。
             

            第6層 學(xué)者
            當(dāng)"專家"們想繼續(xù)往上一層樓爬時(shí),他們幾乎一眼就可以看到樓梯的入口,不過(guò)令他們吃驚的是,樓梯入口處豎了一道高高的門(mén)檻,上面寫(xiě)著"創(chuàng)新"二字。不幸的是,大多數(shù)人在爬到第5層樓時(shí)已經(jīng)體能消耗過(guò)度,無(wú)力翻過(guò)這道門(mén)檻。
            有少數(shù)體能充足者,可以輕易翻越這道門(mén)檻,但是并不意味著體力消耗過(guò)度者就無(wú)法翻越,因?yàn)槟阒皇菚簳r(shí)還沒(méi)有掌握恢復(fù)體能的方法而已,當(dāng)掌握了恢復(fù)體能的方法,將體能恢復(fù)后,你就可以輕易地翻越這道門(mén)檻了。
            怎么才能將體能恢復(fù)呢?我們的老祖宗"孔子"早就教導(dǎo)過(guò)我們"溫故而知新",在英文里,研究的單詞是"research",其前綴"re" 和"search"分別是什么意思不用我解釋吧。或許有些人覺(jué)得"溫故而知新"和"research"有些抽象,不好理解,我再給打個(gè)簡(jiǎn)單的比方,比如你 在爬一座高山,爬了半天,中途體力不支,怎么恢復(fù)體力呢?自然是休息一下,重新進(jìn)食一些食物,體力很快就可以得到恢復(fù)。
            由此可知,對(duì)體能消耗過(guò)度者,休息+重新進(jìn)食通常是恢復(fù)體能的最佳選擇。可惜的是,國(guó)內(nèi)的老板們并不懂得這點(diǎn),他們的公司里不僅連正常國(guó)家規(guī)定的休 息時(shí)間都不給足,有些公司甚至有員工"過(guò)勞死"出現(xiàn)。所以國(guó)內(nèi)能翻越"創(chuàng)新"這道門(mén)檻的人是"少之又少",和西方比起來(lái)估計(jì)是數(shù)量級(jí)的差別。
            再說(shuō)說(shuō)重新進(jìn)食的問(wèn)題,這個(gè)重新進(jìn)食是有講究的,需要進(jìn)食一些基礎(chǔ)性易消化的簡(jiǎn)單食物,不能進(jìn)食山珍海味級(jí)的復(fù)雜食物,否則很難快速吸收。以查找為 例,并不是去天天盯著那些復(fù)雜的查找結(jié)構(gòu)和算法進(jìn)行研究,你需要做的是將二分查找、哈希查找、普通二叉樹(shù)查找等基礎(chǔ)性的知識(shí)好好地復(fù)習(xí)幾遍。
            以哈希查找為例,首先你需要去將各種沖突解決方法如鏈?zhǔn)浇Y(jié)構(gòu)、二次哈希等編寫(xiě)一遍,再試試不同種類的哈希函數(shù),然后還需要試試在硬盤(pán)中如何實(shí)現(xiàn)哈希 查找,并考慮數(shù)據(jù)從硬盤(pán)讀到內(nèi)存后,如何組織硬盤(pán)中的數(shù)據(jù)才能快速地在內(nèi)存中構(gòu)建出哈希表來(lái),...,這樣你可能需要將一個(gè)哈希表寫(xiě)上十幾個(gè)不同的版本, 并比較各個(gè)版本的性能、功能方面的區(qū)別和適用范圍。
            總之,對(duì)任何一種簡(jiǎn)單的東西,你需要考慮各種各樣的需求,以需求來(lái)驅(qū)動(dòng)研究。最后你將各種最基礎(chǔ)性的查找結(jié)構(gòu)和算法都了然于胸后,或許某天你再看其他更復(fù)雜的查找算法,或者你在散步時(shí),腦袋里靈光一現(xiàn),突然間就發(fā)現(xiàn)了更好的方法,也就從專家晉升為"學(xué)者"了。
            學(xué)者所做的事情,通常都是在前人的基礎(chǔ)上,進(jìn)行一些小的優(yōu)化和改進(jìn),例如別人發(fā)明了鏈?zhǔn)交鶖?shù)排序的方法,你第1個(gè)發(fā)現(xiàn)使用一定的方法,可以用數(shù)組替代鏈表進(jìn)行基數(shù)排序,性能還能得到進(jìn)一步提高。
            由于學(xué)者需要的只是一些小的優(yōu)化改進(jìn),因此中國(guó)還是有一定數(shù)量的學(xué)者。不過(guò)和國(guó)外的數(shù)量比起來(lái),估計(jì)少了一個(gè)數(shù)量級(jí)而已。
            也許有人會(huì)覺(jué)得現(xiàn)在中國(guó)許多公司申請(qǐng)專利的數(shù)量達(dá)到甚至超過(guò)西方發(fā)達(dá)國(guó)家了,我們的學(xué)者數(shù)量應(yīng)該不會(huì)比他們少多少。因此,有必要把專利和這里說(shuō)的創(chuàng)新的區(qū)別解釋一下。
            所謂專利者,只要是以前沒(méi)有的,新的東西,都可以申請(qǐng)專利;甚至是以前有的東西,你把他用到了一個(gè)新的領(lǐng)域的產(chǎn)品里去,也可以申請(qǐng)專利。比如你在房 子里造一個(gè)水泥柱子,只要以前沒(méi)有人就這件事申請(qǐng)專利,那么你就可以申請(qǐng)專利,并且下次你把水泥柱子挪一個(gè)位置,又可以申請(qǐng)一個(gè)新的專利;或者你在一個(gè)柜 子上打上幾個(gè)孔,下次又把孔的位置改一改,...,均可申請(qǐng)專利。
            這層樓里所說(shuō)的創(chuàng)新,是指學(xué)術(shù)層面的創(chuàng)新,是基礎(chǔ)研究方面的創(chuàng)新,和專利的概念是完全不同的,難度也是完全不同的。你即使申請(qǐng)了一萬(wàn)個(gè)象那種打孔一類的專利,加起來(lái)也夠不到這層樓里的一個(gè)創(chuàng)新。
            當(dāng)你爬到第6層樓時(shí),你也許會(huì)有一種突破極限的快感,因?yàn)槟憬K于把那道高高的寫(xiě)著"創(chuàng)新"二字的門(mén)檻給翻過(guò)去了,實(shí)現(xiàn)了"0"的突破。這時(shí),你也許 有一種"獨(dú)上高樓,欲望盡天涯路"的感覺(jué),但是很快你會(huì)發(fā)現(xiàn)看到的都是比較近的路,遠(yuǎn)處的路根本看不清楚。如果你還有足夠的體力的話,你會(huì)想爬到更高一層 的樓層去。


            第7層 大師
            從第6層樓爬到第7層樓,并沒(méi)有多少捷徑可走,主要看你有沒(méi)有足夠的能量。你如果能象Hoare一樣設(shè)計(jì)出一個(gè)快速排序的算法;或者象Eugene W. Myers一樣設(shè)計(jì)出了一個(gè)用編輯圖的最短路徑模型來(lái)解決diff問(wèn)題的算法;或者象M.J.D. Powell一樣提出了一個(gè)能夠處理非線性規(guī)劃問(wèn)題的SQP方法;或者你發(fā)現(xiàn)基于比較的排序算法,它的復(fù)雜度下界為O(NLogN);或者你發(fā)現(xiàn)用棧可以 將遞歸的算法變成非遞歸的;或者你設(shè)計(jì)出一個(gè)紅黑樹(shù)或者AVL樹(shù)之類的查找結(jié)構(gòu);或者你設(shè)計(jì)出一個(gè)象C++或Java一樣的語(yǔ)言;或者你發(fā)明了 UML;...,你就爬到了第7層,晉升為"大師"了。
            上面舉的這些例子中,其中有些人站的樓層比這層高,這里只是為了形象說(shuō)明而舉例他們的某個(gè)成就。從上面列出的一些大師的貢獻(xiàn)可以看出,成為大師必須 要有較大的貢獻(xiàn)。首先解決問(wèn)題必須是比較重要的,其次你要比前輩們?cè)谀撤矫嬗幸粋€(gè)較大的提高,或者你解決的是一個(gè)全新的以前沒(méi)有解決過(guò)的問(wèn)題;最重要的 是,主要的思路和方法必須是你自己提供的,不再是在別人的思路基礎(chǔ)上進(jìn)行的優(yōu)化和改進(jìn)。
            看了上面這些要求,如果能量不夠的話,你也許會(huì)覺(jué)得有些困難,所以不是每個(gè)人都能成為"大師"的。中國(guó)軟件業(yè)里能稱得上是"大師"的人,用屈指可數(shù)來(lái)形容,估計(jì)是綽綽有余。值得一提得是,國(guó)外的"大師"就象我們的"大牛"一樣滿天飛的多。
            我把我猜測(cè)本國(guó)有可能進(jìn)到這層樓的大師列一下,以起個(gè)拋磚引玉的作用。漢王的"手寫(xiě)識(shí)別"技術(shù)由于是完全保密的,不知道它里面用了什么思想,原創(chuàng)思 想占的比重有多少,因此不知道該把它劃到這層樓還是更高一層樓去。原山東大學(xué)王小云教授破解DES和MD5算法時(shí),用到的方法不知道是不是完全原創(chuàng)的,如 果是的話也可進(jìn)到這層樓來(lái)。
            陳景潤(rùn)雖然沒(méi)有徹底解決哥德巴赫猜想,但他在解決問(wèn)題時(shí)所用的方法是創(chuàng)新的,因此也可以進(jìn)到這層樓來(lái)。當(dāng)然,如果能徹底解決哥德巴赫猜想,那么可以算到更高的樓層去。
            求伯君和王志東等大牛們,他們?cè)谧鯳PS和表格處理之類的軟件時(shí),不知是否有較大的原創(chuàng)算法在里面,如果有的話就算我錯(cuò)把他們劃到了大牛層。由于所 學(xué)有限,不知道國(guó)內(nèi)還有那些人能夠得上"大師"的級(jí)別,或許有少量做研究的教授、院士們,可以達(dá)到這個(gè)級(jí)別,有知道的不妨回個(gè)帖子晾一晾。
            鑒于"大師"這個(gè)稱號(hào)的光環(huán)效應(yīng),相信有不少人夢(mèng)想著成為"大師"。或許你看了前面舉的一些大師的例子,你會(huì)覺(jué)得要成為大師非常困難。不妨說(shuō)一下,現(xiàn)在有一條通往"大師"之路的捷徑打開(kāi)了,那就是多核計(jì)算領(lǐng)域,有大量的處女地等待大家去挖掘。
            以前在單核時(shí)代開(kāi)發(fā)的各種算法,現(xiàn)在都需要改寫(xiě)成并行的。數(shù)據(jù)結(jié)構(gòu)與算法、圖像處理、數(shù)值計(jì)算、操作系統(tǒng)、編譯器、測(cè)試調(diào)試等各個(gè)領(lǐng)域,都存在大量的機(jī)會(huì),可以讓你進(jìn)到這層樓來(lái),甚至有可能讓你進(jìn)到更高一層樓去。
             

            第8層 科學(xué)家

            科學(xué)家向來(lái)都是一個(gè)神圣的稱號(hào),因此我把他放在了“大師”之上。要成為科學(xué)家,你的貢獻(xiàn)必須超越大師,不妨隨便舉一些例子。

            如果你象Dijkstra一樣設(shè)計(jì)了ALGOL語(yǔ)言,提出了程序設(shè)計(jì)的三種基本結(jié)構(gòu):順序、選擇、循環(huán),那么你可以爬到第8層樓來(lái)。順便說(shuō)一下,即使拋開(kāi)這個(gè)成果,Dijkstra憑他的PV操作和信號(hào)量概念的提出,同樣可以進(jìn)到這層樓。

            如果你象Don Knuth一樣,是數(shù)據(jù)結(jié)構(gòu)與算法這門(mén)學(xué)科的重要奠基者,你也可以進(jìn)到這層樓來(lái)。當(dāng)然,數(shù)據(jù)結(jié)構(gòu)和算法這門(mén)學(xué)科不是某個(gè)人開(kāi)創(chuàng)的,是許多大師和科學(xué)家集體開(kāi)創(chuàng)的。

            如果你象巴科斯一樣發(fā)明了Fortran語(yǔ)言,并提出了巴科斯范式,對(duì)高級(jí)程序語(yǔ)言的發(fā)展起了重要作用,你也可以進(jìn)到這層樓來(lái)。

            或者你象Ken Thompson、Dennis Ritchie一樣發(fā)明了Unix操作系統(tǒng)和功能強(qiáng)大、高效、靈活、表達(dá)力強(qiáng)的C語(yǔ)言,對(duì)操作系統(tǒng)理論和高級(jí)編程語(yǔ)言均作出重大貢獻(xiàn),那么你也可以進(jìn)到這層樓來(lái)。

            或者你有Frederick P. Brooks一樣機(jī)會(huì),可以去領(lǐng)導(dǎo)開(kāi)發(fā)IBM的大型計(jì)算機(jī)System/360和OS/360操作系統(tǒng),并在失敗后反思總結(jié),寫(xiě)出《人月神話》,對(duì)軟件工程作出里程碑式的貢獻(xiàn),你也可以進(jìn)到這層來(lái)。

            或者你提出了面向?qū)ο笤O(shè)計(jì)的基本思想,或者你設(shè)計(jì)了互聯(lián)網(wǎng)的TCP/IP協(xié)議,或者你象Steven A.Cook一樣奠定NP完全性的理論基礎(chǔ),或者你象Frances Allen一樣專注于并行計(jì)算來(lái)實(shí)現(xiàn)編譯技術(shù),在編譯優(yōu)化理論和技術(shù)取得基礎(chǔ)性的成就,…,均可進(jìn)入這層。

            當(dāng)然,如果你發(fā)明了C++語(yǔ)言或者Java語(yǔ)言,你進(jìn)不到這層來(lái),因?yàn)槟阌玫降闹饕枷攵际沁@層樓中的科學(xué)家提出的,你自己并沒(méi)有沒(méi)有多少原創(chuàng)思想在里面。

            看了上面列出的科學(xué)家的成就,你會(huì)發(fā)現(xiàn),要成為“科學(xué)家”,通常要開(kāi)創(chuàng)一門(mén)分支學(xué)科,或者是這個(gè)分支學(xué)科的奠基者,或者在某個(gè)分支學(xué)科里作出里程碑式的重大貢獻(xiàn)。如果做不到這些的話,那么你能象Andrew C. Yao(姚期智)一樣在對(duì)計(jì)算理論的多個(gè)方向如偽隨機(jī)數(shù)生成,密碼學(xué)與通信復(fù)雜度等各個(gè)方向上作出重要貢獻(xiàn),成為集大成者,也可以進(jìn)入這層樓。

            成為“科學(xué)家”后,如果你有幸象Dijkstra一樣,出現(xiàn)在一個(gè)非常重視科學(xué)的國(guó)度。當(dāng)你去世時(shí),你家鄉(xiāng)滿城的人都會(huì)自動(dòng)地去為你送葬。不過(guò)如果不幸生錯(cuò)地方的話,能不挨“板磚”估計(jì)就算萬(wàn)幸了。

            從上面隨便舉的一些例子中,你可能能猜到,西方科學(xué)家的數(shù)量是非常多的,于是你會(huì)想中國(guó)應(yīng)該也有少量的科學(xué)家吧?我可以很負(fù)責(zé)任地告訴你一個(gè)不幸的結(jié)果,中國(guó)本土產(chǎn)生的科學(xué)家的數(shù)量為0。目前在國(guó)內(nèi),軟件領(lǐng)域的唯一的科學(xué)家就是上面提過(guò)的姚期智,還是國(guó)外請(qǐng)回來(lái)的,并不是本土產(chǎn)生的。

            可能你不同意我說(shuō)的本土科學(xué)家數(shù)量為0的結(jié)論,因?yàn)槟憬?jīng)常看到有許多公司里都有所謂“首席XX科學(xué)家”的頭銜。我想說(shuō)的是,這些所謂的“首席XX科學(xué)家”都是遠(yuǎn)遠(yuǎn)夠不到這層樓的級(jí)別的,有些人的水平估計(jì)也就是一個(gè)“牛人”或“大牛”的級(jí)別,好一點(diǎn)的最多也就一個(gè)“學(xué)者”的級(jí)別。尤其是那些被稱作“首席經(jīng)X學(xué)家”的,基本上可以把稱號(hào)改為“首席坑大家”。

            雖然我國(guó)沒(méi)有人能爬到這層樓上來(lái),但是西方國(guó)家仍然有許多人爬到了比這層更高的樓上。如果要問(wèn)我們比西方落后多少?那么可以簡(jiǎn)單地回答為:“落后了三層樓”。下面就來(lái)看看我們做夢(mèng)都沒(méi)有到過(guò)的更高一層樓的秘密。



            第9層 大科學(xué)家

            進(jìn)入這層樓的門(mén)檻通常需要一些運(yùn)氣,比如某天有個(gè)蘋(píng)果砸到你頭上時(shí),你碰巧發(fā)現(xiàn)了萬(wàn)有引力,那么你可以進(jìn)到這層樓來(lái)。當(dāng)然,萬(wàn)有引力幾百年前就被人發(fā)現(xiàn)了,如果你現(xiàn)在到處嚷嚷著說(shuō)你發(fā)現(xiàn)了萬(wàn)有引力,恐怕馬上會(huì)有人打110,然后警察會(huì)把你送到不正常人類的聚集地去。因此,這里舉萬(wàn)有引力的例子,只是說(shuō)你要有類似的成就才能進(jìn)到這層樓來(lái)。

            牛頓發(fā)現(xiàn)萬(wàn)有引力定律開(kāi)創(chuàng) 了經(jīng)典物理運(yùn)動(dòng)力學(xué)這門(mén)學(xué)科,如果你也能開(kāi)創(chuàng)一門(mén)大的學(xué)科,那么你就從科學(xué)家晉升為“大科學(xué)家”。比如愛(ài)因斯坦創(chuàng)建了相對(duì)論,從一個(gè)小職員變成了大科學(xué) 家。當(dāng)然大科學(xué)家可遠(yuǎn)不止這兩人,數(shù)學(xué)界里比物理學(xué)界更是多得多,如歐幾里得創(chuàng)建了平面幾何,笛卡爾開(kāi)創(chuàng)解析幾何,還有歐拉、高斯、萊布尼茨等數(shù)不清的人 物,跟計(jì)算相關(guān)的大科學(xué)家則有圖靈等人。

            從上面列出的一些大科學(xué)家 可以發(fā)現(xiàn),他們的成就不僅是開(kāi)創(chuàng)了一個(gè)大的學(xué)科,更重要的是他們的成就上升到了“公理”的層面。發(fā)現(xiàn)公理通常是需要一點(diǎn)運(yùn)氣的,如果你的運(yùn)氣不夠好的話, 另外還有一個(gè)笨辦法也可以進(jìn)到這層樓來(lái),那就是成為集大成者。例如馮·諾伊曼,對(duì)數(shù)學(xué)的所有分支都非常了解,許多領(lǐng)域都有較大的貢獻(xiàn),即使撇開(kāi)他對(duì)計(jì)算機(jī) 的開(kāi)創(chuàng)貢獻(xiàn),成為大科學(xué)家照樣綽綽有余。

            當(dāng)然,程序員們最關(guān)心的是 自己有沒(méi)有機(jī)會(huì)變成大科學(xué)家。既然計(jì)算機(jī)這門(mén)大學(xué)科的開(kāi)創(chuàng)性成果早就被馮·諾伊曼、圖靈等人摘走了,那么程序員們是不是沒(méi)有機(jī)會(huì)變成大科學(xué)家了呢?我們的 古人說(shuō)得好:“江山代有才人出,各領(lǐng)風(fēng)騷數(shù)百年”,現(xiàn)在在計(jì)算機(jī)這門(mén)學(xué)科下面誕生了許多非常重要的大的分支,所以你還是有足夠的機(jī)會(huì)進(jìn)到這層樓的。

            如果你能夠徹底解決自然語(yǔ)言理解(機(jī)器翻譯)這門(mén)學(xué)科中的核心問(wèn)題, 或者你在人工智能或者機(jī)器視覺(jué)(圖像識(shí)別)方面有突破性的發(fā)現(xiàn),那么你同樣可以輕易地晉升為“大科學(xué)家”。這樣當(dāng)某天你老了去世時(shí),或許那天國(guó)人已經(jīng)覺(jué)醒,你也能享受到如Dijkstra一樣的待遇,有滿城甚至全國(guó)的人去為你送葬。

            現(xiàn)在還剩下另外一個(gè)大家感興趣的問(wèn)題沒(méi)有討論,那就是這層中已經(jīng)出現(xiàn)了牛頓、愛(ài)因斯坦、高斯等我們平常人都認(rèn)為是頂級(jí)的科學(xué)家,是不是這層已經(jīng)是樓頂了呢?相信還記得本文標(biāo)題的人應(yīng)該知道現(xiàn)在僅僅是第9層,還有第10層沒(méi)有到達(dá)呢。可能不少人現(xiàn)在要感到困惑了,難道還有人站在比牛頓、愛(ài)因斯坦、高斯等人更高的樓層上?

            這個(gè)世界上確實(shí)存在可以用一只手的手指數(shù)得清的那么幾個(gè)人,他們爬到了第10層樓上。因此,第10層樓不是虛構(gòu)的,而是確實(shí)存在的。如果對(duì)此有疑惑或者認(rèn)為我在胡謅一番的話,那么不妨繼續(xù)往下看下去,窺一下第10層樓的秘密。

             

             第10層 大哲
            看了這層樓的名字“大哲”,可能不少人已經(jīng)猜到了這層樓的秘密,那就是你的成果必須要上升到哲學(xué)的高度,你才有機(jī)會(huì)能進(jìn)到這層來(lái)。

            當(dāng)然,上升到哲學(xué)高度只是一個(gè)必要條件,牛頓的萬(wàn)有引力似乎也上升到了哲學(xué)的高度,因?yàn)椴恢酪Φ降资窃趺磥?lái)的,但是牛頓沒(méi)有被劃到這一層,因?yàn)檫M(jìn)到這層還有另外的條件,那就是你的成果必須引起了哲學(xué)上的深度思考,并能讓人們的世界觀向前跨進(jìn)一大步。竊以為牛頓、愛(ài)因斯坦等人的成就還達(dá)不到讓人們世界觀向前跨進(jìn)一大步的程度。

            所以,這層樓中的人的成就對(duì)我們普通人認(rèn)識(shí)世界非常重要,你可以不學(xué)相對(duì)論,但是你不可以不對(duì)這層樓的人所作出的成就不了解,否則你的世界觀就是極其不完整的,會(huì)犯許多認(rèn)識(shí)上的錯(cuò)誤。不幸的是,中國(guó)的科普知識(shí)普及還不夠到位,知道這層樓成就的人好像并不多,程序員中恐怕更少。下面就來(lái)看看這些用一只手的手指數(shù)得清的大哲們,到底有什么成就,能比萬(wàn)有引力定律和相對(duì)論還重要。

            1、希爾伯特 (1862~1943)

            第1位進(jìn)到此樓層是一位名叫“希爾伯特”的大數(shù)學(xué)家,如果你學(xué)過(guò)《泛函分析》,那么你在學(xué)習(xí)希爾伯特空間時(shí)可能已經(jīng)對(duì)這位大數(shù)學(xué)家有所了解;如果你不是學(xué)數(shù)學(xué)出身的,又對(duì)數(shù)學(xué)史不感興趣的話,恐怕你從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)這個(gè)名字。不過(guò)如果我問(wèn)一下,知不知道二次世界大戰(zhàn)前世界數(shù)學(xué)中心在那里,你肯定會(huì)有興趣想知道。

            不妨說(shuō)一下,二戰(zhàn)前整個(gè)世界的數(shù)學(xué)中心就在德國(guó)的哥廷根,而我們這位大數(shù)學(xué)家希爾伯特便是它的統(tǒng)帥和靈魂人物。即使在二戰(zhàn)期間,希特勒和丘吉爾也有協(xié)定,德國(guó)不轟炸牛津和劍橋,作為回報(bào),英國(guó)不轟炸海德堡和哥廷根。

            整個(gè)二十世紀(jì)上半期的超一流數(shù)學(xué)家,幾乎都出自其門(mén)下。這里不妨舉幾個(gè)我們熟悉的人物,例如馮·諾伊曼就曾受到他和他的學(xué)生施密特和外爾的思想影響,還到哥廷根大學(xué)任過(guò)希爾伯特的助手,錢學(xué)森的老師馮·卡門(mén)是在哥廷根取得博士學(xué)位的。順便提一下,這位大數(shù)學(xué)家發(fā)現(xiàn)當(dāng)時(shí)物理學(xué)上出了很多大的成果如相對(duì)論和量子力學(xué),但是這些物理學(xué)家的數(shù)學(xué)功力明顯不足,因此有一段時(shí)間帶領(lǐng)他的學(xué)生們研究過(guò)物理學(xué),并獨(dú)立發(fā)現(xiàn)了廣義相對(duì)論,只是不好意思和物理學(xué)家爭(zhēng)功勞,將廣義相對(duì)論的功勞全部讓給了愛(ài)因斯坦。

            廣義相對(duì)論相對(duì)于這位大數(shù)學(xué)家在數(shù)學(xué)上的貢獻(xiàn),其實(shí)是算不了什么的,只是由此可看出這位大數(shù)學(xué)家品格的高尚之處。如果再去看看牛頓之流的人物的品行,整天和萊布尼茨、虎克等人爭(zhēng)功勞,利用自己的優(yōu)勢(shì)地位打壓他人,甚至鬧得上法庭,和這位希爾伯特先生比起來(lái),簡(jiǎn)直就是個(gè)小丑。

            說(shuō)到這里,你可能對(duì)這位大數(shù)學(xué)家“希爾伯特”有了一些初步映象,感覺(jué)到了他的重要性,不過(guò)他在數(shù)學(xué)上的主要成就可不是幾句話說(shuō)得清楚的。首先,他是一位集大成者,精通當(dāng)時(shí)數(shù)學(xué)所有分支領(lǐng)域,在數(shù)學(xué)的各個(gè)領(lǐng)域都有較大的貢獻(xiàn),當(dāng)然這些成就只能讓他成為一個(gè)大科學(xué)家,不能帶他進(jìn)入這層樓。事實(shí)上這位“希爾伯特”解決的任何一個(gè)數(shù)學(xué)問(wèn)題都?jí)虿坏竭@層樓的高度,那么他怎么混到這層樓來(lái)了呢?

            話得從1900年說(shuō)起,當(dāng)時(shí)還很年輕的希爾伯特在當(dāng)時(shí)的世界數(shù)學(xué)大會(huì)上做了一個(gè)報(bào)告,高屋建甌地提出了著名的23個(gè)未解決的數(shù)學(xué)問(wèn)題,然后整個(gè)二十世紀(jì)上半期,全世界的數(shù)學(xué)家們都在這23個(gè)問(wèn)題的指導(dǎo)下展開(kāi)研究,直到現(xiàn)在仍然有許多數(shù)學(xué)家受這23個(gè)問(wèn)題的指導(dǎo)在進(jìn)行研究。例如我們熟知的哥德巴赫猜想,就屬于其中第8個(gè)問(wèn)題素?cái)?shù)分布的一個(gè)子問(wèn)題。

            如果用“高瞻遠(yuǎn)矚”來(lái)形容這位大數(shù)學(xué)家的話,那么這個(gè)世界上恐怕沒(méi)有第二個(gè)人再配得上“高瞻遠(yuǎn)矚”這四個(gè)字,不論是歐拉、高斯、牛頓、愛(ài)因斯坦還是被譽(yù)為最有才華的數(shù)學(xué)家伽羅華,概不例外。

            雖然那23個(gè)問(wèn)題是歸納總結(jié)出來(lái)的,并不全是原創(chuàng),但是其中有不少問(wèn)題是可以上升到哲學(xué)的高度,引起深度思考的。可能大多數(shù)人都會(huì)覺(jué)得希爾伯特是進(jìn)不到這層樓的,我們知道提出問(wèn)題的人和解決問(wèn)題的人是一樣偉大的,何況他提出的問(wèn)題是如此之多,基于這點(diǎn),個(gè)人覺(jué)得應(yīng)該讓希爾伯特跨進(jìn)這層樓的門(mén)檻里。

            看完這位希爾伯特的成就,你可能會(huì)覺(jué)得對(duì)你的世界觀并沒(méi)有產(chǎn)生任何影響。確實(shí)如此,他提出的問(wèn)題不是用來(lái)影響你的,而是用來(lái)影響其他大科學(xué)家和大哲的,下面再來(lái)說(shuō)說(shuō)另一位對(duì)他提出的23個(gè)問(wèn)題中的第2個(gè)問(wèn)題有杰出貢獻(xiàn)的大哲,你就會(huì)感覺(jué)到大哲們的成果的威力了。

            2、哥德?tīng)?(1906~1978)

            這位大哲的名字叫“哥德?tīng)?(Gödel) ”,你可能從來(lái)也沒(méi)有聽(tīng)說(shuō)過(guò)這個(gè)名字,即使你讀了一個(gè)數(shù)學(xué)系的博士學(xué)位,如果你的研究方向不和這位大哲對(duì)口的話,你也不一定了解這位大哲的成就,更不知道他的成果對(duì)我們這個(gè)世界有何意義。

            簡(jiǎn)單地說(shuō),這位大哲20多歲時(shí)就證明了兩個(gè)定理,一個(gè)叫做“哥德?tīng)柾耆远ɡ?#8221;,另一個(gè)更重要的叫做“哥德?tīng)柌煌耆远ɡ?#8221;。你也許會(huì)覺(jué)得奇怪,第9層樓的成就就已經(jīng)上升到了公理的高度,這種證明定理的事情不是學(xué)者和大師們做的事情嗎?怎么能比第9層樓的成就還高呢?下面就來(lái)簡(jiǎn)單說(shuō)一下這兩個(gè)定理的含義,你就會(huì)明白這屬于系統(tǒng)級(jí)的定理,絕不是普通的定理和公理所能比擬的。

            “哥德?tīng)柾耆远ɡ?#8221;證明了邏輯學(xué)的幾條公理是完備的,即任何一個(gè)由這些公理所產(chǎn)生出的問(wèn)題,在這個(gè)公理系統(tǒng)內(nèi)可以判定它是真的還是假的,這個(gè)結(jié)論表明了我們?nèi)祟愃鶕碛械倪壿嬎季S能力是完備的。這條定理并不能將其帶入這層樓來(lái),帶其進(jìn)入這層樓的是另一條定理。

            “哥德?tīng)柌煌耆远ɡ?#8221;是在1930年證明的,它證明了現(xiàn)有數(shù)學(xué)的幾條公理(ZF公理系統(tǒng))是不完備的,即由這些公理產(chǎn)生出的問(wèn)題,無(wú)法由這幾條公理判斷它是真的還是假的。例如希爾伯特23個(gè)問(wèn)題中的第1個(gè)問(wèn)題,也就是著名的康托爾連續(xù)統(tǒng)假設(shè),哥德?tīng)栐?938年證明了現(xiàn)有公理系統(tǒng)中不能證明它是“假”的,科恩(Cohen,或許也可以稱得上是“半”個(gè)大哲)在1963年證明了現(xiàn)有公理系統(tǒng)不能證明它是“真”的。最有趣的是,即使你將某個(gè)不可判定的問(wèn)題,作為一條新的公理加入進(jìn)去,所組成的新的公理系統(tǒng)仍然是不完備的,即你無(wú)法構(gòu)造一個(gè)有限條公理的系統(tǒng),讓這個(gè)公理系統(tǒng)是完備的。

            也許你仍然無(wú)法理解上面這段話的含義,不妨先說(shuō)一下它對(duì)我們現(xiàn)實(shí)世界的影響。你可能知道1936年出現(xiàn)的圖靈機(jī)是現(xiàn)代計(jì)算機(jī)的理論模型,如果沒(méi)有哥德?tīng)柌煌耆远ɡ淼乃枷耄瑘D靈機(jī)什么時(shí)候能出來(lái)是很難說(shuō)的,所以這位哥德?tīng)柨梢运阕饔?jì)算機(jī)理論的奠基者的奠基者。計(jì)算機(jī)對(duì)我們這個(gè)世界產(chǎn)生的影響比原子彈大了多少,我想不用我說(shuō)大家也都清楚。當(dāng)然,對(duì)現(xiàn)實(shí)世界的影響只能把哥德?tīng)柾瑘D靈等人一樣劃到大科學(xué)家那一層去,能進(jìn)入這層乃是另有原因。

            可能你看過(guò)《未來(lái)戰(zhàn)士》、《黑客帝國(guó)》、《I,Robot》之類的科幻電影,于是你產(chǎn)生制造一個(gè)和人一樣或者比人更高一級(jí)的智能機(jī)器人的想法,這就引入了一個(gè)達(dá)到哲學(xué)高度的問(wèn)題,“人到底能不能制造出具有和人一樣的思維能力的機(jī)器來(lái)?”。

            我只能告訴你,“你的愿望是良好的,但現(xiàn)實(shí)是殘酷的”。如果你仔細(xì)思考一下不完全性定理的含義,并結(jié)合現(xiàn)代計(jì)算機(jī)所具有的能力分析一下,你會(huì)發(fā)現(xiàn)這個(gè)問(wèn)題的答案暫時(shí)是否定的。如果你想造出和人一樣思維能力的機(jī)器,那么你需要去好好學(xué)習(xí)這位大哲及其后續(xù)研究者的成果,并在他們的基礎(chǔ)上有新的突破才行。

            為了說(shuō)明這位大哲所研究領(lǐng)域的重要性,這里順便再討論一個(gè)我們?nèi)粘?zhēng)議不休的問(wèn)題,那就是孔夫子的“人之初、性本善”以及西方認(rèn)為“人之初、性本惡”的觀點(diǎn)孰優(yōu)孰劣的問(wèn)題。可能有許多人發(fā)現(xiàn)西方社會(huì)現(xiàn)在領(lǐng)先我們,于是就認(rèn)為“性本惡”是對(duì)的,“性本善”是錯(cuò)的,中國(guó)應(yīng)該拋棄以前的舊思想,改用西方的思想。當(dāng)然也有一些老學(xué)究們,認(rèn)為中國(guó)的人文思想是領(lǐng)先于西方的,自然而然地認(rèn)為“性本善”是對(duì)的,“性本惡”是錯(cuò)的。

            如果你學(xué)過(guò)大哲用過(guò)的公理化的分析方法,你就知道一套系統(tǒng)的多條公理間只要不會(huì)推導(dǎo)出矛盾的地方,即可以自圓其說(shuō),那么它可以看作是對(duì)的。這樣你可以很輕易地給這個(gè)問(wèn)題下一個(gè)結(jié)論,即“性本善”和“性本惡”是對(duì)等的,不存在孰優(yōu)孰劣的問(wèn)題,更不存在誰(shuí)對(duì)誰(shuí)錯(cuò)的問(wèn)題。只要你不同時(shí)將“性本善”和“性本惡”放入一個(gè)系統(tǒng)內(nèi),那么是不會(huì)有問(wèn)題的,甚至你也可以認(rèn)為“人之初、既無(wú)善、亦無(wú)惡”,或者認(rèn)為“人之初、部分善、部分惡”,都是可以自圓其說(shuō)的,所以我們的老祖宗提出的思想并沒(méi)有問(wèn)題,之所以落后乃是其他原因造成的。這個(gè)問(wèn)題其實(shí)在高斯所處的時(shí)代就有了結(jié)論,那時(shí)有人提出了非歐幾何,即平行線公理問(wèn)題,有人認(rèn)為過(guò)一點(diǎn)可以作多條平行線,還有人認(rèn)為平行線在無(wú)窮遠(yuǎn)點(diǎn)是相交的,和歐氏幾何關(guān)于過(guò)一點(diǎn)只能作一條平行線的公理都是矛盾的,但是他們各自的系統(tǒng)內(nèi)推導(dǎo)出的結(jié)論都是正確的。

            上面說(shuō)的只是對(duì)哥德?tīng)柌煌耆远ɡ淼囊恍┐譁\解析,實(shí)際上如果深入思考一下它的含義的話,你會(huì)發(fā)現(xiàn)它對(duì)物理學(xué)等許多學(xué)科有重大影響,包含的道理實(shí)在是深刻,遠(yuǎn)非一般的思想所能比擬,有興趣者不妨“google”或“百度”一下“哥德?tīng)?#8221;。或許只有我們的老祖宗“老子”提出的哲學(xué)思想,深度可以有得一比。

            哥德?tīng)柌煌耆远ɡ硪步o那些認(rèn)為科學(xué)是嚴(yán)謹(jǐn)?shù)娜水?dāng)頭一棒,原來(lái)連數(shù)學(xué)這樣的純理論學(xué)科都是不嚴(yán)謹(jǐn)?shù)模渌麑W(xué)科就更不用說(shuō)了。

            至此,已經(jīng)說(shuō)完數(shù)學(xué)上的大哲,下面不妨再看看物理學(xué)上的大哲,物理學(xué)上好像只出過(guò)一位叫“海森堡”的大哲(注:由于本人對(duì)物理學(xué)不甚了解,不知道“霍金”夠不夠得上大哲的稱號(hào))。
            3、海森堡 (1901~1976)

            海森堡這個(gè)名字相信沒(méi)有幾個(gè)人不知道的,大部分人在學(xué)習(xí)物理時(shí)都學(xué)過(guò)他的“測(cè)不準(zhǔn)關(guān)系”,也就是因?yàn)檫@個(gè)“測(cè)不準(zhǔn)關(guān)系”,海森堡爬到了第十層樓。

            如果你看過(guò)《時(shí)間簡(jiǎn)史》和《霍金講演錄-黑洞、嬰兒宇宙及其他》,你也許已經(jīng)了解測(cè)不準(zhǔn)關(guān)系的威力,所以這里不想做過(guò)多的討論,只談一些和本土產(chǎn)生的哲學(xué)思想相關(guān)的東西。

            首先看看爭(zhēng)論了幾千年,并且現(xiàn)在仍然有人在爭(zhēng)論不休的“宿命論”問(wèn)題。霍金認(rèn)為,只要這個(gè)宇宙有一個(gè)初始狀態(tài),粒子的運(yùn)動(dòng)是按照一定物理定律進(jìn)行的(比如相對(duì)論、量子力學(xué)屬于這些物理定律的一部分),那么所有的粒子運(yùn)動(dòng)軌跡將是確定的,然后只要你承認(rèn)唯物論,即精神是由物質(zhì)決定的,那么宿命論就是“對(duì)”的。當(dāng)然由于測(cè)不準(zhǔn)關(guān)系的存在,對(duì)人而言,又是無(wú)法準(zhǔn)確預(yù)測(cè)的,因此也可以將其看作是“不對(duì)”的。簡(jiǎn)單的說(shuō),可以認(rèn)為宿命論是“對(duì)”的是絕對(duì)的,宿命論是“不對(duì)”的是相對(duì)的。

            可能上面這段話你現(xiàn)在仍然難以理解,或許你又覺(jué)得你的命運(yùn)并不是上天注定的,而是可以通過(guò)自己的努力可以改變的。我要告訴你的是,你在想什么也是事先已注定的,包括你在預(yù)測(cè)本身也是事先注定的,因?yàn)榇竽X思考問(wèn)題最終是基本粒子運(yùn)動(dòng)的結(jié)果,而這些粒子的運(yùn)動(dòng)必然要遵循物理定律進(jìn)行,所以你會(huì)不會(huì)努力,想不想努力,包括你在想你該不該努力這件事本身也是事先注定的。順便說(shuō)一下,你現(xiàn)在正在看這篇文章,可能正在想這個(gè)宿命論問(wèn)題值得懷疑,或者覺(jué)得寫(xiě)得不夠好,準(zhǔn)備砸個(gè)板磚上來(lái);或者你在想這篇問(wèn)題寫(xiě)得有點(diǎn)意思,準(zhǔn)備看完后轉(zhuǎn)給朋友看一看;又或者你看到這里,覺(jué)得很累了,準(zhǔn)備休息一下;…;這些都是上天事先就注定的。從你自身的相對(duì)角度看,因?yàn)槟闶孪炔恢篮髞?lái)會(huì)發(fā)生什么,也可以認(rèn)為不是事先注定的,可能這句話有些不好理解,不妨好好理解前面說(shuō)過(guò)的公理化思想。

            如果你沒(méi)看過(guò)《霍金講演錄-黑洞、嬰兒宇宙及其他》,你可能會(huì)覺(jué)得很驚訝,宿命論歷來(lái)不都被認(rèn)為是唯心論嗎,怎么由唯物論推導(dǎo)出了宿命論呢?現(xiàn)實(shí)就是這樣和你開(kāi)了一個(gè)大的玩笑,不過(guò)這個(gè)玩笑也是事先注定的。如果你再仔細(xì)用公理化的方法思考一下唯物論和唯心論的矛盾性,就像前面分析性善論和性惡論一樣,你會(huì)發(fā)現(xiàn)唯物論、唯心論不一定就是沖突的,矛盾的雙方是可以統(tǒng)一的,只要你不要同時(shí)將唯物和唯心放進(jìn)同一個(gè)系統(tǒng)中就行。

            當(dāng)然也有聰明者仍然會(huì)懷疑宿命論問(wèn)題的正確性,因?yàn)檫@里有一個(gè)前提條件,即宇宙要有一個(gè)初始狀態(tài)。宇宙有沒(méi)有初始狀態(tài),我們并不知道啊,雖然有大爆炸學(xué)說(shuō),但那也只是假說(shuō)而已,并沒(méi)有得到確證,有些人就認(rèn)為宇宙是一直都存在的。這樣看來(lái)似乎你又有合理的理由在懷疑宿命論了,不過(guò)我仍然要告訴你,你現(xiàn)在在懷疑宿命論仍然是事先注定的,不相信的話就來(lái)看看下面的分析。

            雖然宇宙的初始狀態(tài)值得懷疑,但是這個(gè)宇宙至少已經(jīng)存在了一段時(shí)間,這點(diǎn)我想是毋庸置疑的。我們可以在我們已知的宇宙存在的這段時(shí)間內(nèi),任意取一個(gè)時(shí)間點(diǎn)t0,那么在這個(gè)時(shí)間點(diǎn)t0上,所有的粒子都有一個(gè)運(yùn)動(dòng)狀態(tài)。在時(shí)間點(diǎn)t0之后的時(shí)間里,由于粒子運(yùn)動(dòng)是按照物理定律進(jìn)行的,因此粒子運(yùn)動(dòng)軌跡由時(shí)間點(diǎn)t0的狀態(tài)決定。說(shuō)白一點(diǎn),如果取100年前的一個(gè)時(shí)間點(diǎn)作為t0,那么現(xiàn)在的所有粒子運(yùn)動(dòng)狀態(tài)100年前就已經(jīng)確定了,如果取10000年前一個(gè)時(shí)間點(diǎn)作為t0,那么最近10000年內(nèi)所有粒子運(yùn)動(dòng)的軌跡在10000年前就確定了,當(dāng)然,你可以取更早的時(shí)間,比如100億年前的時(shí)間點(diǎn)。

            總之,現(xiàn)在你會(huì)發(fā)現(xiàn)宇宙有沒(méi)有初始狀態(tài)并不會(huì)影響宿命論的正確性,所以這個(gè)世界的一切都是注定的。只不過(guò)由于粒子間相互影響過(guò)于復(fù)雜,我們無(wú)法知道這些粒子的運(yùn)動(dòng)軌跡而已。當(dāng)然,如果將測(cè)不準(zhǔn)關(guān)系用上的話,那么就是這個(gè)運(yùn)動(dòng)軌跡對(duì)人來(lái)說(shuō)是無(wú)法準(zhǔn)確預(yù)測(cè)的,所以不妨開(kāi)個(gè)玩笑:“算命先生經(jīng)常算得不準(zhǔn)大概是測(cè)不準(zhǔn)關(guān)系的緣故吧”。

            如果你再深入思考一下測(cè)不準(zhǔn)關(guān)系,你會(huì)發(fā)現(xiàn)這是一個(gè)測(cè)量系統(tǒng)的問(wèn)題。由于宿命論的存在,這個(gè)世界本身實(shí)際上是確定的,是“準(zhǔn)“的,之所以測(cè)不準(zhǔn)乃是我們?nèi)祟愃哂械臏y(cè)量能力依賴于基本粒子造成的。所以我在前面說(shuō)宿命論是“不對(duì)”的是相對(duì)的,它是相對(duì)于我們?nèi)祟惖臏y(cè)量能力而言的。根岑(Gentzen,曾任希爾伯特的助手)在一個(gè)更強(qiáng)的系統(tǒng)內(nèi)證明了ZF系統(tǒng)內(nèi)的問(wèn)題都是可判定的,從一個(gè)側(cè)面說(shuō)明這個(gè)世界本身是確定的。(注:它和哥德?tīng)柌煌耆远ɡ聿⒉幻埽捎跀?shù)學(xué)上的復(fù)雜性,這里就不詳細(xì)解釋了)

            不妨再想想我們老祖宗提出的“是莊周夢(mèng)見(jiàn)了蝴蝶?還是蝴蝶夢(mèng)見(jiàn)了莊周?”,“風(fēng)動(dòng)?幡動(dòng)?還是心動(dòng)?”之類的問(wèn)題,當(dāng)然以前你都認(rèn)為這是純粹的唯心主義,甚至認(rèn)為是封建糟粕,但是如果結(jié)合測(cè)不準(zhǔn)關(guān)系的內(nèi)涵,再結(jié)合前面所說(shuō)的公理化分析方法進(jìn)行分析,估計(jì)你現(xiàn)在不敢輕易地下結(jié)論。

            也許到現(xiàn)在你仍然無(wú)法理解為什么把大哲們劃在了大科學(xué)家的上一層,你可能仍然覺(jué)得萬(wàn)有引力、相對(duì)論等成果是最偉大的。下面就來(lái)談?wù)劄槭裁创笳鼙却罂茖W(xué)家高一層。

            如果把人類在現(xiàn)有能力情況下,將來(lái)所能夠擁有的知識(shí)總集看成是一個(gè)集合A,人類現(xiàn)在已有的知識(shí)總集看成是集合B,顯然,集合B只是集合A的一個(gè)子集,并且是很小的一個(gè)子集。牛頓力學(xué)、相對(duì)論這些理論只能算作集合B里的一個(gè)子集,相對(duì)于集合A,只能算作是滄海一粟。 換句話說(shuō),在人類現(xiàn)有能力可做的事情集合中,牛頓力學(xué)和相對(duì)論等理論給出了詳細(xì)的辦法讓你可以做其中的一些事情,當(dāng)然剩下的更多的事情是牛頓力學(xué)和相對(duì)論所無(wú)法解決的。

            哥德?tīng)柌煌耆远ɡ砗蜏y(cè)不準(zhǔn)關(guān)系的意義在于,它指出集合A的范圍,即將人類現(xiàn)有能力發(fā)揮到極限的情況下,那些事情是你能做到的,那些是你不能做到的。當(dāng)然,它并沒(méi)有給出具體的方法讓你去做你能做到的事情,它只是告訴我們我們?nèi)祟惉F(xiàn)在發(fā)現(xiàn)的能力所能達(dá)到的極限。或許將來(lái)發(fā)現(xiàn)人類有其他新的未發(fā)現(xiàn)的能力,那么這個(gè)極限就被打破了。比如將來(lái)能發(fā)現(xiàn)不依賴于基本粒子的其他測(cè)量方法,并且測(cè)量過(guò)程中不會(huì)改變其他粒子的狀態(tài),那么測(cè)不準(zhǔn)關(guān)系就被打破了。

            看到這里,估計(jì)你已經(jīng)發(fā)現(xiàn)了一些秘密,科學(xué)兜了一大圈,最終還是回到了哲學(xué),也就是我們所認(rèn)為的玄學(xué)上。同時(shí)你也會(huì)發(fā)現(xiàn),我們老祖宗提出的所謂玄學(xué),原來(lái)和現(xiàn)代科學(xué)是相通的,并非象某些人想像的那樣全是糟粕。如果有人認(rèn)為西方現(xiàn)代暫時(shí)領(lǐng)先我們,進(jìn)而就認(rèn)為西方古代就已經(jīng)超越我們,我們老祖宗就已經(jīng)落后西方,他們的思想都是糟粕的話,那么我認(rèn)為他可能犯了崇洋媚外的毛病。我不得不化用一句周杰倫在春晚上的歌詞送給他:“你不妨抓一副我們祖?zhèn)鞯闹嗅t(yī)良方,治一治你那崇洋媚外的內(nèi)傷”。順便告訴他一下,中醫(yī)用的陰陽(yáng)五行理論,它的前提假設(shè)就是宿命論。

            上面說(shuō)的這幾位大哲的成果,可能對(duì)你的世界觀會(huì)有很大的影響,于是你可能會(huì)羨慕起這些大哲們的成果來(lái)。如果你有大志的話,你會(huì)希望有朝一日你也能變成大哲,但是你發(fā)現(xiàn)上面的大哲是研究數(shù)學(xué)和物理學(xué)的,而你是學(xué)計(jì)算機(jī)的程序員,那么是不是沒(méi)有機(jī)會(huì)變成大哲呢?

            如果你能將NP難題給徹底解決掉,意味著計(jì)算機(jī)內(nèi)的計(jì)算的奧秘基本被揭開(kāi),或許你可以進(jìn)到這層樓來(lái);或者你能發(fā)現(xiàn)另外一套計(jì)算機(jī)可以理解的數(shù)學(xué)公理系統(tǒng),并且這個(gè)公理系統(tǒng)是完備的,那么計(jì)算機(jī)取代人類進(jìn)行思維的一個(gè)必要條件就滿足了,計(jì)算機(jī)將具有真正意義上的“邏輯思維和推理能力”,你可以輕松地進(jìn)到這層樓來(lái)。如果你發(fā)現(xiàn)了新的方法可以打破測(cè)不準(zhǔn)關(guān)系,同樣你也可以輕松地進(jìn)到這層樓來(lái)。

            如果你能徹底揭開(kāi)人類抽象思維的奧妙,并讓計(jì)算機(jī)懂得了如何創(chuàng)建抽象,具備抽象思維能力,那么也就具備了“設(shè)計(jì)能力”,可以取代人類進(jìn)行各種設(shè)計(jì)了,你也可以輕松地進(jìn)到這層樓來(lái)。順便說(shuō)一下,如果你對(duì)軟件設(shè)計(jì)有真正深刻理解的話,就會(huì)明白這不是在寫(xiě)科幻小說(shuō)。對(duì)此感興趣者,不妨好好地研究一下程序切片方面的技術(shù),會(huì)讓你對(duì)軟件設(shè)計(jì)和測(cè)試等方面的理解有質(zhì)的提高,或許有一天你能打開(kāi)這扇大門(mén)。

            當(dāng)然,計(jì)算機(jī)要完全取代人還有其他必要條件,后面還會(huì)提及。

            值得一提的是,雖然第10層樓是本文中所寫(xiě)的最高層,但是大哲們并沒(méi)有覺(jué)得他們到了頂層,他們通常都還會(huì)努力尋找通往更高一層的樓梯。如果你也有成為天下第一的想法,那么你或許會(huì)想要做什么事情才能超越大哲們的成就,當(dāng)然,這都得依賴于找到更高一層樓的樓梯。

            個(gè)人認(rèn)為,再往上一層樓的樓梯是通往天堂的道路,也就是說(shuō)第11層樓的名字叫“天堂”,是“上帝”住的地方,而不是人住的地方。如果將來(lái)某天有人能爬到天堂的話,那么他已經(jīng)不是人了,而是由人變成了“上帝”。

            你也許會(huì)懷疑這個(gè)世界到底有沒(méi)有“天堂”,“上帝”是否根本就不存在,我也很有同感。因此有必要再寫(xiě)上一段文字,討論一下“上帝”的問(wèn)題。如果你想了解天堂的奧妙,有沒(méi)有辦法讓你變成“上帝”,不妨看看繼續(xù)往下看看第11層樓的玄妙。注意我這里用的是“玄妙”二字,因?yàn)樯系墼诖蟛糠秩搜劾锕烙?jì)都是“玄之又玄”的東西。


            第11層 上帝
            看了上面的小標(biāo)題,你可能會(huì)覺(jué)得奇怪,這篇文章不是講“程序員的十層樓”嗎?怎么冒出了第11層來(lái)了?

            其實(shí)這并不矛盾,程序員確實(shí)只有十層樓,因?yàn)榕赖降?1層時(shí),已經(jīng)變成上帝,不再是程序員了;所以超出10層樓本身并不重要,關(guān)鍵的問(wèn)題是看你有沒(méi)有能力變成上帝。

            1、誰(shuí)是上帝?

            菜鳥(niǎo)們認(rèn)為L(zhǎng)inus Torvalds是程序員中的上帝,看完了前面各層樓的介紹,此時(shí)再看到這句話,相信你要忍不住在心里笑起來(lái)。當(dāng)然,你會(huì)不會(huì)笑起來(lái)是事先注定的。Don Knuth也不是上帝,他離上帝還有三層樓的距離。即使是大哲們,他們離天堂也還差一層樓,因此這個(gè)世界上有史以來(lái)還沒(méi)有任何一個(gè)人變成過(guò)上帝。

            我們感興趣的是,將來(lái)會(huì)不會(huì)有人爬到比大哲們更高的樓層上,變成了上帝。

            要變成上帝,你得有上帝一樣的能力,上帝會(huì)造人,你會(huì)嗎?

            你也許會(huì)怯生生地問(wèn):“我可以和愛(ài)人生小孩,算不算造人?”,你可能還會(huì)理直氣壯地說(shuō):“現(xiàn)在生物學(xué)上都可以克隆人了,早就有人掌握了造人的方法”。

            事實(shí)上克隆人需要有人的體細(xì)胞,必須要先有人才會(huì)有體細(xì)胞。上帝造人時(shí),這個(gè)世界上并沒(méi)有人,是從無(wú)生命的物質(zhì)“塵土”中創(chuàng)造出的人。因此,用最原始的方法生人和克隆人都是從有生命信息的物質(zhì)中生人,不能算作造人。

            這樣看來(lái),你根本不會(huì)造人,不過(guò)我可以告訴你一個(gè)“玄方”,讓你有機(jī)會(huì)學(xué)會(huì)如何造人。

            如果你揭開(kāi)了人類情感的奧秘,讓計(jì)算機(jī)也可以擁有和人類一樣的情感,那么計(jì)算機(jī)將可以理解人類的需求,具有了“情商”,將具有完整的和人一樣的能力。此時(shí),人類進(jìn)化到了機(jī)器人,科幻小說(shuō)將變成現(xiàn)實(shí),也就是說(shuō)你已經(jīng)掌握了真正的造人能力,晉升為“上帝”了。

            未來(lái)到底有沒(méi)有人能變成“上帝”,人能不能進(jìn)化到機(jī)器人,這是宿命論中事先注定了的。說(shuō)到這里,不妨再告訴你一個(gè)打破宿命論的方法,這個(gè)方法就是你要爬到比上帝還要高的樓層。

            “還有比上帝還高的樓層?”,你可能會(huì)第1時(shí)間內(nèi)冒出這個(gè)問(wèn)題,其實(shí)我也有同樣的懷疑。因此在寫(xiě)第12層樓前,有必要弄清楚它到底存不存在,即你可不可以騎到上帝的頭上的問(wèn)題。

            2. 騎到上帝的頭上?

            為了解決是否可以騎到上帝的頭上這個(gè)問(wèn)題,不妨先假設(shè)存在比上帝高的樓層,也就是存在打破宿命論的方法。

            宿命論的本質(zhì)原因是因?yàn)闀r(shí)間是單向運(yùn)行,不可逆轉(zhuǎn)造成的。如果你找到一種可以使時(shí)間逆轉(zhuǎn)的方法,那么你就打破了宿命論,爬到了比上帝還高的樓層。

            看到這里,你也許會(huì)擺脫剛才陷于宿命論的困惑情緒,變得充滿希望般高興起來(lái)。不過(guò),如果你的邏輯思維能力足夠好,仔細(xì)思考一下,會(huì)發(fā)現(xiàn)存在一個(gè)邏輯上的悖論。

            在你找到時(shí)間逆轉(zhuǎn)的方法之前,顯然這個(gè)世界仍然是需要服從宿命論的,也就是說(shuō)你能不能找到打破宿命論的方法是事先注定的。假設(shè)你在某個(gè)時(shí)間點(diǎn)t0處找到了打破宿命論的方法,你在打破宿命論后,想利用時(shí)間逆轉(zhuǎn)的方法回到某個(gè)時(shí)間點(diǎn)t2。下面來(lái)看看你到底能不能回到時(shí)間點(diǎn)t2。

            取位于t0和t2之間的任意一個(gè)時(shí)間點(diǎn)t1,你在回到時(shí)間點(diǎn)t2之前,必須先經(jīng)過(guò)時(shí)間點(diǎn)t1,考慮你到達(dá)t1的那一時(shí)刻,由于t1比t0要早,這個(gè)時(shí)間點(diǎn)上你還沒(méi)有找到時(shí)間逆轉(zhuǎn)的方法,所以到了時(shí)間t1點(diǎn)后,你無(wú)法再使用時(shí)間逆轉(zhuǎn)的能力回到時(shí)間點(diǎn)t2去,所以你永遠(yuǎn)也回不到時(shí)間點(diǎn)t2,由于時(shí)間點(diǎn)t2是任意取的,因此,你永遠(yuǎn)也無(wú)法使時(shí)間逆轉(zhuǎn),或者說(shuō)你根本就沒(méi)打破過(guò)宿命論,這與你在時(shí)間點(diǎn)t0打破了宿命論產(chǎn)生了矛盾。

            上面這段話看起來(lái)似乎有點(diǎn)像“人永遠(yuǎn)邁不出一步”的詭辯一樣,你可能會(huì)想返回到時(shí)間點(diǎn)t1時(shí),仍然可以擁有時(shí)間逆轉(zhuǎn)能力啊。不過(guò)你又會(huì)發(fā)現(xiàn)一個(gè)新的問(wèn)題,時(shí)間點(diǎn)t1本來(lái)是沒(méi)有時(shí)間逆轉(zhuǎn)能力的,現(xiàn)在又認(rèn)為時(shí)間點(diǎn)t1又有時(shí)間逆轉(zhuǎn)能力,那時(shí)間點(diǎn)t1到底是有還是沒(méi)有時(shí)間逆轉(zhuǎn)能力呢?或者說(shuō)在時(shí)間點(diǎn)t0前,宿命論注定了時(shí)間點(diǎn)t1是沒(méi)有時(shí)間逆轉(zhuǎn)能力的,現(xiàn)在你又認(rèn)為時(shí)間點(diǎn)t1具有時(shí)間逆轉(zhuǎn)能力,那么這兩個(gè)時(shí)間點(diǎn)t1究竟是不是同一個(gè)時(shí)間點(diǎn)?如果不是同一個(gè)時(shí)間點(diǎn),說(shuō)明你沒(méi)有回到過(guò)去;如果是同一個(gè)時(shí)間點(diǎn)的話,豈不是自相矛盾嗎?

            為了說(shuō)得更形象一些,不妨假設(shè)你坐一艘超光速飛船,準(zhǔn)備從時(shí)間點(diǎn)t0回到時(shí)間點(diǎn)t2去,假設(shè)你回到t2后,隨著時(shí)間的流逝,又達(dá)到了時(shí)間點(diǎn)t0,如果這時(shí)你又再次坐超光速飛船返回時(shí)間點(diǎn)t2,那么一個(gè)值得思考的問(wèn)題就出現(xiàn)了,“你在時(shí)間點(diǎn)t2能不能看到上次返回時(shí)間點(diǎn)t2的飛船?”

            如果回答不能看到飛船,那么上次返回的飛船那里去了呢?顯然很難解釋通。如果回答能看到飛船,那么你可以到達(dá)時(shí)間點(diǎn)t2后,下次時(shí)間到達(dá)t0時(shí),你又坐飛船返回t2,這次你將可以看到上兩次的兩艘飛船。如果這樣一直循環(huán)下去,最后你會(huì)發(fā)現(xiàn)你可以在時(shí)間點(diǎn)t2看到無(wú)窮多的飛船。用程序員的術(shù)語(yǔ)說(shuō),叫做“程序陷入了死循環(huán)”,最后系統(tǒng)必然會(huì)出現(xiàn)“Out of Memory”現(xiàn)象而崩潰。

            當(dāng)然,你也可以認(rèn)為有其他的方法,不需要飛船,可以一次性從時(shí)間點(diǎn)t0直接跳躍到時(shí)間點(diǎn)t2,并不需要經(jīng)過(guò)時(shí)間點(diǎn)t1。下面不妨來(lái)分析一下這個(gè)方法是否可行。

            既然是直接跳躍到時(shí)間點(diǎn)t2,那么你必然是在一個(gè)無(wú)窮小的時(shí)間里出現(xiàn)在時(shí)間點(diǎn)t2的某個(gè)空間里,例如你要在時(shí)間點(diǎn)t2回到某個(gè)廣場(chǎng)上。首先說(shuō)明一下為什么是無(wú)窮小的時(shí)間里出現(xiàn)的,因?yàn)槿绻皇菬o(wú)窮小的時(shí)間里出現(xiàn)的話,那么必然可以取到一個(gè)時(shí)間點(diǎn)t1,會(huì)導(dǎo)致前面所說(shuō)的時(shí)間點(diǎn)t1上出現(xiàn)悖論。

            你在廣場(chǎng)上出現(xiàn)的時(shí),廣場(chǎng)上的空氣必然要為你讓開(kāi)空間,而這是在無(wú)窮小的時(shí)間里完成的,那么很容易推導(dǎo)出你周圍的空氣獲得的加速度和速度都是無(wú)窮大,因而它具有的動(dòng)能也是無(wú)窮大,無(wú)窮大的能量和無(wú)窮大的速度意味著什么?一只鳥(niǎo)都可以將飛機(jī)撞下來(lái),如果宇宙是有限大的話,它可以讓這個(gè)宇宙炸毀無(wú)窮次;即使宇宙是無(wú)限大,它也足以讓宇宙炸毀一次。宇宙都?xì)缌耍趾蝸?lái)的時(shí)間?還能說(shuō)你回到了時(shí)間點(diǎn)t2嗎?

            也許上面說(shuō)的這些你仍然難以相信,不妨再說(shuō)得更現(xiàn)實(shí)一些,假設(shè)你要回到100年前的一個(gè)時(shí)間點(diǎn),這100年中,天上有多少流星湮滅了?有多少新星生成了?宇宙膨脹了多少?你有能力讓湮滅的流星復(fù)原、生成的新星重新返回未生成前的狀態(tài),膨脹的宇宙收縮回去嗎?如果這些東西的狀態(tài)沒(méi)有回復(fù)到100年前,又怎么能說(shuō)明你回到的是100年前的時(shí)間點(diǎn)呢?

            根據(jù)上面的推導(dǎo)和分析,個(gè)人認(rèn)為使時(shí)間逆轉(zhuǎn)的方法是不存在的,所以第12層樓是不存在的,自然沒(méi)有人可以騎到“上帝”的頭上。

            宿命論將在有時(shí)間的時(shí)間里永遠(yuǎn)統(tǒng)治這個(gè)世界。

             

            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xjbx/archive/2009/02/08/3869314.aspx

            posted @ 2010-02-20 15:18 糯米 閱讀(351) | 評(píng)論 (0)編輯 收藏

            POJ 1945 Power Hungry Cows 終極打表

            這道題是一道智力題
            所以想了n久,都想不出什么“數(shù)學(xué)方法”。甚至都想不出什么比較好的剪枝方法。
            測(cè)了一下,普通的bfs比較慢。算到18步就開(kāi)始就龜速了。
            要算到21步才能得出1~20000的每一個(gè)答案。然而算到21步,在T8100 cpu的本本上都要跑半分鐘,囧。。
            所以沒(méi)辦法了,只能打表了。看了一下status。發(fā)現(xiàn)排在第一頁(yè)的人打表的不少呢!哈哈。

            但是問(wèn)題來(lái)了。20000大小的數(shù)組,每個(gè)元素在1~21之間,如果這樣表示出來(lái)
            int arr = {1, 2, 3, ....}
            那不得40k+左右嗎。顯然poj是不允許提交這么大的代碼的!
            但是status里面那些打表的人,代碼都在20k~30k左右。這是怎么回事呢?
            我有點(diǎn)懷疑別人看了答案,呵呵。但又不排除有方法能把代碼長(zhǎng)度控制好。
            所以,考慮了下面幾個(gè)方法:


            1. 元素的范圍是在 1~21 之間。所以要盡量用4bit表示一個(gè)元素。
            統(tǒng)計(jì)了下,發(fā)現(xiàn)16以上的元素占了70%左右。所以規(guī)定:
            >=16的元素,表示為 u4 arr[] = { (val&0xf) + 1 } 占用4bit
            < 16的元素,表示為 u4 arr[] = { 0, val } 占用8bit
            將它稱之為"halfbyte"壓縮
            2. 霍夫曼壓縮,lz77壓縮
            3. base64編碼

            這兩天實(shí)在是閑的蛋疼。于是就把這個(gè)幾個(gè)玩意寫(xiě)了一下。
            經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)用 lz77 是獲得的代碼長(zhǎng)度是最短的!僅9k!
            統(tǒng)計(jì)如下:

            === generate: e:\test\1945_base64.cpp
            base64 encode: 20032 -> 26712 133.35%
            total: 20032 -> 26712 133.35%
            file size: 27.22K

            === generate: e:\test\1945_halfbyte_base64.cpp
            halfbyte encode: 20032 -> 11842 59.12%
            base64 encode: 11842 -> 15792 133.36%
            total: 20032 -> 15792 78.83%
            file size: 17.15K

            === generate: e:\test\1945_halfbyte_huffman_base64.cpp
            halfbyte encode: 20032 -> 11842 59.12%
            huffman encode: 11842 -> 5964 50.36%
            base64 encode: 5964 -> 7952 133.33%
            total: 20032 -> 7952 39.70%
            file size: 11.42K

            === generate: e:\test\1945_halfbyte_huffman_lz77_base64.cpp
            halfbyte encode: 20032 -> 11842 59.12%
            huffman encode: 11842 -> 5964 50.36%
            lz77 encode: 5964 -> 8838 148.19%
            base64 encode: 8838 -> 11784 133.33%
            total: 20032 -> 11784 58.83%
            file size: 15.78K

            === generate: e:\test\1945_huffman_base64.cpp
            huffman encode: 20032 -> 6644 33.17%
            base64 encode: 6644 -> 8860 133.35%
            total: 20032 -> 8860 44.23%
            file size: 11.71K

            === generate: e:\test\1945_huffman_lz77_base64.cpp
            huffman encode: 20032 -> 6644 33.17%
            lz77 encode: 6644 -> 8097 121.87%
            base64 encode: 8097 -> 10796 133.33%
            total: 20032 -> 10796 53.89%
            file size: 14.21K

            === generate: e:\test\1945_lz77_base64.cpp
            lz77 encode: 20032 -> 5422 27.07%
            base64 encode: 5422 -> 7232 133.38%
            total: 20032 -> 7232 36.10%
            file size: 8.81K

            所有方法都是0~32ms AC。
            呵呵,代碼太長(zhǎng)了,就不貼了,給個(gè)下載:

            /Files/varg-vikernes/1945.rar

            posted @ 2010-02-18 16:53 糯米 閱讀(2831) | 評(píng)論 (2)編輯 收藏

            POJ 2187 Beauty Contest 凸包直徑

                 摘要: 題目大意:給一堆點(diǎn),求直線距離最遠(yuǎn)的兩個(gè)點(diǎn)。思路:就是求“凸多邊形的直徑”。google一下,很多結(jié)果的啦。首先要求出凸包,然后用一個(gè)比較牛逼的算法貌似可以在O(N)時(shí)間內(nèi)求出凸包直徑。但是那算法太復(fù)雜啦,看了半天都看不懂,所以就枚舉凸包每?jī)蓚€(gè)點(diǎn)之間的距離了。還是能200+ms過(guò),因?yàn)橥拱蟪鰜?lái)以后,N就大大減小了。#include <stdio.h>...  閱讀全文

            posted @ 2010-02-16 14:05 糯米 閱讀(452) | 評(píng)論 (0)編輯 收藏

            POJ 2184 Cow Exhibition 背包

            題目大意:
            有100頭牛,每頭牛有Fi, Si兩個(gè)值。Fi, Si 范圍是-1000~1000
            選出一些牛,確保這些牛的 Sum{Fi} + Sum{Si} 最大 
            同時(shí) Sum{Fi},Sum{Si} 都不能為負(fù)

            思路:
            一開(kāi)始看到范圍那么大,首先就否決背包了!想了一個(gè)不大靈光的解法,結(jié)果wa啦。。
            后來(lái)看了Discuss。發(fā)現(xiàn)都是用背包過(guò)的,是最簡(jiǎn)單的一維背包!居然還有人是搜索過(guò)的!
            但是,如果數(shù)據(jù)bt點(diǎn)的話,背包是不可能過(guò)的!但是USACO的題目感覺(jué)數(shù)據(jù)都弱一點(diǎn),哈哈!

            代碼爛,63ms

            #include <stdio.h>

            struct {
                
            int val, used;
            }
             _slot[100024*2], *slot = &_slot[100024];
            int up, down;

            int main()
            {
                
            int n, s, f, i;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&n);
                up 
            = down = 0;
                
            while (n--{
                    scanf(
            "%d%d"&s, &f);
                    
            if (s < 0 && f < 0)
                        
            continue;
                    
            if (s < 0{
                        
            for (i = down; i <= up; i++{
                            
            if (!slot[i].used)
                                
            continue;
                            
            if (!slot[i + s].used || f + slot[i].val > slot[i + s].val) {
                                slot[i 
            + s].used = 1;
                                slot[i 
            + s].val = f + slot[i].val;
                            }

                        }

                        down 
            += s;
                    }
             else {
                        
            for (i = up; i >= down; i--{
                            
            if (!slot[i].used)
                                
            continue;
                            
            if (!slot[i + s].used || f + slot[i].val > slot[i + s].val) {
                                slot[i 
            + s].used = 1;
                                slot[i 
            + s].val = f + slot[i].val;
                            }

                        }

                        up 
            += s;
                    }

                    
            if (!slot[s].used || slot[s].val < f) {
                        slot[s].used 
            = 1;
                        slot[s].val 
            = f;
                    }

                }


                s 
            = 0;
                
            for (i = 0; i <= up; i++{
                    
            if (slot[i].used && slot[i].val >= 0 && slot[i].val + i > s)
                        s 
            = slot[i].val + i;
                }

                printf(
            "%d\n", s);
                
                
            return 0;
            }


            posted @ 2010-02-16 10:59 糯米 閱讀(853) | 評(píng)論 (0)編輯 收藏

            POJ 3670 Eating Together 動(dòng)態(tài)規(guī)劃

            題目大意:
            給出一個(gè)序列,序列里的數(shù)字都是1~3,比如:
            1 3 2 1 1
            你可以改變?nèi)我庖粋€(gè)數(shù)字。
            問(wèn):最少改變多少次,能使序列變成升序序列或者降序序列。
            比如第一個(gè)1改成3,使它變成 3 3 2 1 1,就變成降序序列了。

            思路:
            從后往前推,先考慮變成升序序列的情況。
            定義:
            f[3][i] = 最后一個(gè)元素到第i個(gè)元素全部改變?yōu)?所需要的次數(shù)
            f[2][i] = 最后一個(gè)元素到第i個(gè)元素改變?yōu)?2222...33333...所需要的最小次數(shù)
            f[1][i] = 最后一個(gè)元素到第i個(gè)元素改變?yōu)?1111...22222...33333所需要的最小次數(shù)
            那么 f[1][1] 就是答案了。
            可見(jiàn),對(duì)于第i個(gè)元素:
            f[3]很容易計(jì)算出來(lái)
            f[2] = min{ f[3][i-1], (第i個(gè)元素 == 2) + f[2][i-1] }
            f[1] = min{ f[2][i-1], (第i個(gè)元素 == 1) + f[1][i-1] }
            那么復(fù)雜度就是 O(N) 了。降序序列一樣處理,從前往后推。

            優(yōu)化:
            輸入序列里面的一長(zhǎng)串一樣的元素可以一段一段處理
            f數(shù)組可以變成滾動(dòng)數(shù)組

            代碼:
            這個(gè)算法應(yīng)該還算可以的,看到Disscuss里面有人說(shuō)用“最長(zhǎng)不降子序列”來(lái)做,還不知道用那個(gè)怎么做。。
            最長(zhǎng)不降子序列,好像求出長(zhǎng)度的貪心算法是 O(NlgN),求出序列的動(dòng)規(guī)算法是 O(N^2)。
            但是好像那些人提交的代碼都挺快的,0ms
            我的代碼比較爛,32ms。。想不通啊。。


            #include <stdio.h>
            #include 
            <string.h>

            struct {
                
            int val, len;
            }
             in[30024];
            int in_cnt;
            int num_cnt[4], f[4][2];

            __inline 
            int min(int a, int b)
            {
                
            return a < b ? a : b;
            }



            int main()
            {
                
            int i, n, val, a, b;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&n);
                
            for (i = 0; i < n; i++{
                    scanf(
            "%d"&val);
                    
            if (val != in[in_cnt].val) 
                        
            in[++in_cnt].val = val;
                    
            in[in_cnt].len++;
                }


                
            for (i = in_cnt; i >= 1; i--{
                    num_cnt[
            in[i].val] += in[i].len;
                    f[
            3][i&1= num_cnt[2+ num_cnt[1];
                    f[
            2][i&1= min(f[3][i&1], (in[i].val!=2)*in[i].len + f[2][(i-1)&1]);
                    f[
            1][i&1= min(f[2][i&1], (in[i].val!=1)*in[i].len + f[1][(i-1)&1]);
                }

                a 
            = f[1][(i-1)&1];

                memset(num_cnt, 
            0sizeof(num_cnt));
                memset(f, 
            0sizeof(f));
                
            for (i = 1; i <= in_cnt; i++{
                    num_cnt[
            in[i].val] += in[i].len;
                    f[
            3][i&1= num_cnt[2+ num_cnt[1];
                    f[
            2][i&1= min(f[3][i&1], (in[i].val!=2)*in[i].len + f[2][(i-1)&1]);
                    f[
            1][i&1= min(f[2][i&1], (in[i].val!=1)*in[i].len + f[1][(i-1)&1]);
                }

                b 
            = f[1][(i-1)&1];

                printf(
            "%d\n", min(a, b));

                
            return 0;
            }




            posted @ 2010-02-15 10:29 糯米 閱讀(474) | 評(píng)論 (0)編輯 收藏

            POJ 3668 Game of Lines 哈希

            題目大意:
            給出n個(gè)點(diǎn),問(wèn)你最多能連多少條線,保證這些線都不平行

            思路:
            計(jì)算每?jī)牲c(diǎn)斜率,用分?jǐn)?shù)的形式表示,然后哈希判重。要考慮斜率不存在和斜率為0的情況

            #include <stdio.h>

            int hash[2][2024][2064/32], hori, vert;
            struct node {
                
            int x, y;
            }
             points[256];
            int N, line_cnt;

            __inline 
            int gcd(int a, int b)
            {
                
            int r;

                
            if (a < b) {
                    r 
            = a;
                    a 
            = b;
                    b 
            = r;
                }


                
            while (1{
                    r 
            = a % b;
                    
            if (!r)
                        
            return b;
                    a 
            = b;
                    b 
            = r;
                }

            }


            __inline 
            int test_bit(int *arr, int idx)
            {
                
            return arr[idx >> 5& (1 << (idx & 0x1f));
            }


            __inline 
            int set_bit(int *arr, int idx)
            {
                
            return arr[idx >> 5|= (1 << (idx & 0x1f));
            }


            __inline 
            int abs(int i)
            {
                
            return i < 0 ? -i : i;
            }


            __inline 
            void gril(struct node *pa, struct node *pb)
            {
                
            int dx, dy, neg, r;

                dx 
            = pa->- pb->x;
                dy 
            = pa->- pb->y;
                
            if (!dx) {
                    
            if (vert)
                        
            return ;
                    vert 
            = 1;
                    line_cnt
            ++;
                    
            return ;
                }

                
            if (!dy) {
                    
            if (hori)
                        
            return ;
                    hori 
            = 1;
                    line_cnt
            ++;
                    
            return ;
                }

                neg 
            = dx*dy < 0;
                dx 
            = abs(dx);
                dy 
            = abs(dy);
                r 
            = gcd(dx, dy);
                dx 
            /= r;
                dy 
            /= r;
                
            if (test_bit(hash[neg][dx], dy))
                    
            return ;

                set_bit(hash[neg][dx], dy);
                line_cnt
            ++;
            }


            int main()
            {
                
            int i, j;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&N);
                
            for (i = 0; i < N; i++
                    scanf(
            "%d%d"&points[i].x, &points[i].y);

                
            for (i = 0; i < N - 1; i++{
                    
            for (j = i + 1; j < N; j++{
                        gril(
            &points[i], &points[j]);
                    }

                }

                printf(
            "%d\n", line_cnt);

                
            return 0;
            }

            posted @ 2010-02-14 22:29 糯米 閱讀(449) | 評(píng)論 (0)編輯 收藏

            POJ 3669 Meteor Shower 寬搜

            題目大意:
            一個(gè)杯具男在地上躲隕石。用坐標(biāo)軸的第一象限表示他的位置。
            初始時(shí)刻他位于坐標(biāo)軸原點(diǎn)。單位時(shí)間內(nèi)他只能移動(dòng)一格。
            有很多塊隕石在不同時(shí)刻砸下來(lái),隕石砸的時(shí)候會(huì)把上下左右和中間的格子砸壞。
            格子一旦砸壞了就不能再經(jīng)過(guò)了。
            問(wèn),杯具男要怎么走才能在最短時(shí)間內(nèi)走到一個(gè)安全地點(diǎn)---隕石不會(huì)落下的地方。

            思路:
            BFS搜索。如果走到某個(gè)地方,發(fā)現(xiàn)隕石已經(jīng)掉下來(lái)了,就不繼續(xù)走了。很常規(guī)的思路,呵呵。
            代碼速度還行。根據(jù)排行來(lái)看~

            注意:
            Disscuss里有人說(shuō),此題數(shù)組要開(kāi)到400。

            #include <stdio.h>

            int map[450][450];
            char visited[450][450];

            struct node {
                
            struct {
                    
            int x, y;
                }
             arr[8192];
                
            int cnt;
            }
             _queue[2], *cur, *nxt;

            __inline 
            int in_range(int x, int y)
            {
                
            return !(x < 0 || y < 0);
            }


            __inline 
            void insert(struct node *n, int x, int y)
            {
                
            if (!in_range(x, y) || visited[x][y])
                    
            return ;
                n
            ->arr[n->cnt].x = x;
                n
            ->arr[n->cnt].y = y;
                visited[x][y] 
            = 1;
                n
            ->cnt++;
            }


            __inline 
            void crash(int x, int y, int t)
            {
                
            if (!in_range(x, y))
                    
            return ;
                
            if (!map[x][y] || t + 1 < map[x][y])
                    map[x][y] 
            = t + 1;
            }


            int solve()
            {
                
            int x, y, step, i, t;

                _queue[
            0].cnt = 1;
                visited[
            0][0= 1;
                
            for (step = 0; ; step++{
                    cur 
            = &_queue[step & 1];
                    nxt 
            = &_queue[(step + 1& 1];
                    
            if (!cur->cnt)
                        
            return -1;
                    nxt
            ->cnt = 0;
                    
            for (i = 0; i < cur->cnt; i++{
                        x 
            = cur->arr[i].x;
                        y 
            = cur->arr[i].y;
                        t 
            = map[x][y];
                        
            if (!t) {
                            
            //printf("step %d (%d,%d) %d\n", step, x, y, t);
                            return step;
                        }

                        
            if (step + 1 >= t)
                            
            continue;
                        
            //printf("step %d (%d,%d) %d\n", step, x, y, t);
                        insert(nxt, x - 1, y);
                        insert(nxt, x 
            + 1, y);
                        insert(nxt, x, y 
            + 1);
                        insert(nxt, x, y 
            - 1);
                    }

                }

            }


            int main()
            {
                
            int m, x, y, t;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&m);
                
            while (m--{
                    scanf(
            "%d%d%d"&x, &y, &t);
                    crash(x, y, t);
                    crash(x 
            + 1, y, t);
                    crash(x 
            - 1, y, t);
                    crash(x, y 
            + 1, t);
                    crash(x, y 
            - 1, t);
                }

                printf(
            "%d\n", solve());

                
            return 0;
            }

            posted @ 2010-02-14 21:08 糯米 閱讀(1370) | 評(píng)論 (0)編輯 收藏

            POJ 3740 Easy Finding 剪枝+位操作

            題目大意:
            Given a M×N matrix A. Aij ∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.


            代碼寫(xiě)得不好看,速度一般,200+ms
            #include <stdio.h>
            #include 
            <string.h>

            int M, N, T;
            unsigned 
            short arr[320];

            int dfs(int idx, unsigned short ban, unsigned short sel)
            {
                
            int i;
                unsigned 
            short mask;

                
            if (idx == N)
                    
            return 1;

                mask 
            = sel & arr[idx];
                
            if (mask & (mask - 1))
                    
            return 0;
                
            if (mask)
                    
            return dfs(idx + 1, (ban | arr[idx]) & ~mask, sel);

                
            for (i = 0; i < M; i++{
                    mask 
            = 1 << i;
                    
            if (ban & mask)
                        
            continue;
                    
            if (!(arr[idx] & mask))
                        
            continue;
                    
            if (dfs(idx + 1, (ban | arr[idx]) & ~mask, sel | mask))
                        
            return 1;
                }


                
            return 0;
            }


            int main()
            {
                
            int i, n, m;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                
            while (scanf("%d%d"&M, &N) != EOF) {
                    memset(arr, 
            0, N*2);
                    
            for (m = 0; m < M; m++{
                        
            for (n = 0; n < N; n++{
                            scanf(
            "%d"&i);
                            
            if (i)
                                arr[n] 
            |= 1 << m;
                        }

                    }

                    printf(dfs(
            000? "Yes, I found it\n" : "It is impossible\n");
                }


                
            return 0;
            }

            posted @ 2010-02-14 16:23 糯米 閱讀(271) | 評(píng)論 (0)編輯 收藏

            POJ 1063 Flip and Shift 智力題

            一個(gè)小游戲。挺好玩的。
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1063

            flip 和 shift 兩種操作結(jié)合起來(lái)可以將任意的黑子向任意方向移動(dòng)偶數(shù)步。

            分兩種情況:


            1.有奇數(shù)個(gè)槽時(shí):
            位于奇數(shù)位置的黑子也可以移動(dòng)到偶數(shù)位置中,因?yàn)榭梢詢蓚€(gè)方向移動(dòng)。
            所以可以將任意黑子移動(dòng)到任意位置。
            所以無(wú)論什么情況都能達(dá)到goal

            2.有偶數(shù)個(gè)槽時(shí):
            位于奇數(shù)位置的黑子永遠(yuǎn)位于奇數(shù)位置
            位于偶數(shù)位置的黑子永遠(yuǎn)位于偶數(shù)位置
            所以奇數(shù)位置的黑子和偶數(shù)位置的黑子相差1的時(shí)候可以達(dá)到goal


            #include <stdio.h>
            #include 
            <math.h>

            int main()
            {
                
            int t, n, i, j, arr[2];

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&t);
                
            while (t--{
                    scanf(
            "%d"&n);
                    arr[
            0= arr[1= 0;
                    
            for (i = 0; i < n; i++{
                        scanf(
            "%d"&j);
                        arr[i 
            & 1+= j;
                    }

                    printf(
            "%s\n", (n & 1|| abs(arr[0- arr[1]) <= 1 ? "YES" : "NO");
                }


                
            return 0;
            }



            posted @ 2010-02-14 01:12 糯米 閱讀(461) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共17頁(yè): First 9 10 11 12 13 14 15 16 17 
            久久综合狠狠综合久久综合88| 久久无码国产| 久久大香萑太香蕉av| 一本色道久久88加勒比—综合| 国产午夜精品久久久久免费视| 国产A三级久久精品| 精品人妻伦九区久久AAA片69| 精品久久久久久国产91| 久久国产精品无码HDAV| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲欧美日韩精品久久亚洲区| 欧美激情精品久久久久久久九九九 | 精品久久久久中文字幕一区| 美女写真久久影院| 精品亚洲综合久久中文字幕| 99久久无码一区人妻a黑| 91精品国产高清91久久久久久 | 中文字幕热久久久久久久| 亚洲欧美成人综合久久久| 精品久久久久久中文字幕人妻最新 | 国内精品久久久久影院网站| 久久亚洲色一区二区三区| 久久亚洲国产成人精品无码区| 性欧美大战久久久久久久 | 狠狠色丁香婷婷久久综合| 国产亚洲精品久久久久秋霞| 久久精品国产亚洲AV无码娇色 | 国产精品久久久久9999高清| 久久综合九色综合97_久久久| 久久99精品久久久久久不卡| 亚洲七七久久精品中文国产| 精产国品久久一二三产区区别| 亚洲αv久久久噜噜噜噜噜| 色综合久久综合网观看| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国内精品久久久久久中文字幕| 亚洲国产成人久久一区WWW| 麻豆AV一区二区三区久久| 久久99热这里只有精品国产| 久久天天躁狠狠躁夜夜躁2014| 精品久久久久久中文字幕人妻最新|