當前位置:首頁 » 編程軟體 » 編程珠璣答案

編程珠璣答案

發布時間: 2022-12-31 03:32:06

① C\C++程序員需要掌握什麼書籍

c/c++程序員需要掌握的書籍大概可以分成幾個方面:

  1. 計算機基礎類書籍,這類書籍包括計算機組成原理、計算機網路、資料庫、操作系統、數據結構與演算法

  2. c/c++類專業書籍,這類書籍包括基礎的C語言程序設計、C++primer。

  3. 擴展類書籍,c/c++相關擴展類,推薦的有C陷阱與缺陷、深度探索C++對象模型、effective C++。

  4. 平台擴展類書籍,這類就要看你在哪類系統下做開發,一般常用的系統平台是嵌入式、windows、Unix及ios(object C++),這類書籍就比較多了,可以按照個人需求選擇。

按照上述推薦的理由是:

  1. 學習計算機語言需要一定的基礎,這類基礎是非常重要但是很無聊的,後續在做開發的時候會覺得非常實用。

  2. 學好語言其實不是非常麻煩的部分,一般的教材類書籍即可,重要而麻煩的是在敲代碼的過程中去熟練掌握、運用和創新。

  3. 擴展類書籍3可以幫助你更深入的理解你所學到的東西,而深入理解是程序員進階的必經之路。

  4. 平台類書籍略有區別,但是標准C++是一樣的,只是針對各自平台做了相應擴展(objectc++除外)。如果需要在某個平台下做開發,或者學習再去學習使用即可。

② C語言基礎的已經學了,然後也會像圖書管理系統這種程度的編程,想要更進一步,之後應該看什麼書具體

如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本, 你會選擇哪本書呢?我希望這個書單列表內容豐富,可以涵蓋很多東西。」
1、《代碼大全》 史蒂夫·邁克康奈爾
推薦數:1684
「優秀的編程實踐的網路全書,《代碼大全》注重個人技術,其中所有東西加起來, 就是我們本能所說的「編寫整潔的代碼」。這本書有50頁在談論代碼布局。」 —— Joel Spolsky
對於新手來說,這本書中的觀念有點高階了。到你准備閱讀此書時,你應該已經知道並實踐過書中99%的觀念。– esac
Steve McConnell的原作《代碼大全》(第1版)是公認的關於編程的最佳實踐指南之一, 在過去的十多年間,本書一直在幫助開發人員編寫更好的軟體。
現在,作者將這本經典著作全新演繹,融入了最前沿的實踐技術,加入了上百個嶄新的代碼示例, 充分展示了軟體構建的藝術性和科學性。 McConnell匯集了來自研究機構、學術界以及業界日常實踐的主要知識, 把最高效的技術和最重要的原理交織融會為這本既清晰又實用的指南。
無論您的經驗水平如何,也不管您在怎樣的開發環境中工作,也無論項目是大是小, 本書都將激發您的思維並幫助您構建高品質的代碼。
《代碼大全(第2版))》做了全面的更新,增加了很多與時俱進的內容,包括對新語言、新的開發過程與方法論的討論等等。

2、《程序員修煉之道》
推薦數:1504
對於那些已經學習過編程機制的程序員來說,這是一本卓越的書。 或許他們還是在校生,但對要自己做什麼,還感覺不是很安全。
就像草圖和架構之間的差別。雖然你在學校課堂上學到的是畫圖,你也可以畫的很漂亮, 但如果你覺得你不太知道從哪兒下手,如果某人要你獨自畫一個P2P的音樂交換網路圖,那這本書就適合你了。—— Joel
《程序員修煉之道:從小工到專家》內容簡介:《程序員修煉之道》由一系列獨立的部分組成, 涵蓋的主題從個人責任、職業發展,知道用於使代碼保持靈活、並且易於改編和復用的各種架構技術, 利用許多富有娛樂性的奇聞軼事、有思想性的例子及有趣的類比, 全面闡釋了軟體開發的許多不同方面的最佳實踐和重大陷阱。
無論你是初學者,是有經驗的程序員,還是軟體項目經理,《程序員修煉之道:從小工到專家》都適合你閱讀。

3、《計算機程序的構造和解釋》
推薦數:916
就個人而言,這本書目前為止對我影響醉倒的一本編程書。
《代碼大全》、《重構》和《設計模式》這些經典書會教給你高效的工作習慣和交易細節。 其他像《人件集》、《計算機編程心理學》和《人月神話》這些書會深入軟體開發的心理層面。 其他書籍則處理演算法。這些書都有自己所屬的位置。
然而《計算機程序的構造和解釋》與這些不同。 這是一本會啟發你的書,它會燃起你編寫出色程序的熱情; 它還將教會你認識並欣賞美; 它會讓你有種敬畏,讓你難以抑制地渴望學習更多的東西。
其他書或許會讓你成為一位更出色的程序員,但此書將一定會讓你成為一名程序員。
同時,你將會學到其他東西,函數式編程(第三章)、惰性計算、元編程、虛擬機、解釋器和編譯器。
一些人認為此書不適合新手。 個人認為,雖然我並不完全認同要有一些編程經驗才能讀此書,但我還是一定推薦給初學者。 畢竟這本書是寫給著名的6.001,是麻省理工學院的入門編程課程。 此書或許需要多做努力(尤其你在做練習的時候,你也應當如此),但這個價是對得起這本書的。

4、《C程序設計語言》
推薦數:774
這本書簡潔易讀,會教給你三件事:C 編程語言;如何像程序員一樣思考;底層計算模型。 (這對理解「底層」非常重要)—— Nathan
《C程序設計語言》(第2版新版)講述深入淺出,配合典型例證,通俗易懂,實用性強, 適合作為大專院校計算機專業或非計算機專業的C語言教材,也可以作為從事計算機相關軟硬體開發的技術人員的參考書。
《C程序設計語言》(第2版新版)原著即為C語言的設計者之一Dennis M.Ritchie和著名的計算機科學家Brian W.Kernighan合著的 一本介紹C語言的權威經典著作。 我們現在見到的大量論述C語言程序設計的教材和專著均以此書為藍本。 原著第1版中介紹的C語言成為後來廣泛使用的C語言版本——標准C的基礎。
人們熟知的「hello,world」程序就是由本書首次引入的,現在,這一程序已經成為所有程序設計語言入門的第一課。

5、《演算法導論》
推薦數:671
《代碼大全》教你如何正確編程; 《人月神話》教你如何正確管理; 《設計模式》教你如何正確設計……
在我看來,代碼只是一個工具,並非精髓。 開發軟體的主要部分是創建新演算法或重新實現現有演算法。 其他部分則像重新組裝樂高磚塊或創建「管理」層。
我依然夢想這樣的工作,我的大部分時間(>50%)是在寫演算法,其他「管理」細節則留給其他人…… —— Ran Biron
經典的演算法書,被亞馬遜網,《程序員》等評選為2006年最受讀者喜愛的十大IT圖書之一。
演算法領域的標准教材,全球多所知名大學選用
MIT名師聯手鑄就,被譽為「計算機演算法的聖經」
編寫上採用了「五個一」,即一章介紹一個演算法、一種設計技術、一個應用領域和一個相關話題。

6、《重構:改善既有代碼的設計》
推薦數:617
《重構:改善既有代碼的設計》清晰地揭示了重構的過程,解釋了重構的原理和最佳實踐方式, 並給出了何時以及何地應該開始挖掘代碼以求改善。 書中給出了70多個可行的重構,每個重構都介紹了一種經過驗證的代碼變換手法的動機和技術。
《重構:改善既有代碼的設計》提出的重構准則將幫助你一次一小步地修改你的代碼,從而減少了開發過程中的風險。
《重構:改善既有代碼的設計》適合軟體開發人員、項目管理人員等閱讀, 也可作為高等院校計算機及相關專業師生的參考讀物。
我想我不得不推薦《重構》:改進現有代碼的設計。—— Martin
我必須承認,我最喜歡的編程語錄是出自這本書:任何一個傻瓜都能寫出計算機能理解的程序, 而優秀的程序員卻能寫出別人能讀得懂的程序。—— Martin Fowler

7、《設計模式》
推薦數:617
自1995年出版以來,本書一直名列Amazon和各大書店銷售榜前列。 近10年後,本書仍是Addison-Wesley公司2003年最暢銷的圖書之一。 中文版銷售逾4萬冊。
就我而言,我認為四人幫編著的《設計模式》是一本極為有用的書。 雖然此書並不像其他建議一樣有關「元」編程,但它強調封裝諸如模式一類的優秀編程技術, 因而鼓勵其他人提出新模式和反模式(antipatterns),並運用於編程對話中。—— Chris Jester-Young

8、《人月神話》
推薦數:588
在軟體領域,很少能有像《人月神話》一樣具有深遠影響力並且暢銷不衰的著作。
Brooks博士為人們管理復雜項目提供了最具洞察力的見解。 既有很多發人深省的觀點,又有大量軟體工程的實踐。 本書內容來自Brooks博士在IBM公司System/360家族和OS/360中的項目管理經驗。
該書英文原版一經面世,即引起業內人士的強烈反響,後又譯為德、法、日、俄中等多種語言,全球銷量數百萬冊。 確立了其在行業內的經典地位。

9、《計算機程序設計藝術》
推薦數:542
《計算機程序設計藝術》系列著作對計算機領域產生了深遠的影響。 這一系列堪稱一項浩大的工程,自1962年開始編寫,計劃出版7卷,目前已經出版了4卷。
《美國科學家》雜志曾將這套書與愛因斯坦的《相對論》等書並列稱為20世紀最重要的12本物理學著作。 目前Knuth正將畢生精力投入到這部史詩性著作的撰寫中。
這是高德納傾注心血寫的一本書。—— Peter Coulton

10、《編譯原理》(龍書)
推薦數:462
我很奇怪,居然沒人提到龍書。(或許已有推薦,我沒有看到)。 我從沒忘過此書的第一版封面。 此書讓我知道了編譯器是多麼地神奇絕妙。- DB

11、《深入淺出設計模式》
推薦數:445
強大的寫作陣容。
《Head First設計模式》(中文版) 作者Eric Freeman;
ElElisabeth Freeman是作家、講師和技術顧問。
Eric擁有耶魯大學的計算機科學博士學位,E1isabath擁有耶魯大學的計算機科學碩士學位。
Kathy Sierra(javaranch.com的創始人)FHBert Bates是暢銷的HeadFirst系列書籍的創立者,也是Sun公司Java開發員認證考試的開發者。
本書的產品設計應用神經生物學、認知科學,以及學習理論,這使得這本書能夠將這些知識深深地印在你的腦海里, 不容易被遺忘。
本書的編寫方式採用引導式教學,不直接告訴你該怎麼做,而是利用故事當作引子,帶領讀者思考並想辦法解決問題。 解決問題的過程中又會產生一些新的問題,再繼續思考、繼續解決問題,這樣可以加深體會。
作者以大量的生活化故事當背景,例如第1章是鴨子,第2章是氣象站,第3章是咖啡店, 書中搭配大量的插圖(幾乎每一頁都有圖),所以閱讀起來生動有趣,不會感覺到昏昏欲睡。
作者還利用歪歪斜斜的手寫字體,增加「現場感」。 精心設計許多爆笑的對白,讓學習過程不會太枯燥。 還有模式告白節目,將設計模式擬人化成節目來賓,暢談其內在的一切。 每一章都有數目不等的測驗題。 每章最後有一頁要點整理,這也是精華所在,我都是利用這一頁做復習。
我知道四人幫的《設計模式》是一本標准書,但倒不如先看看這部大部頭,此書更為簡易。 一旦你了解了解了基本原則,可以去看四人幫的那本聖經了。- Calanus

12、《哥德爾、艾舍爾、巴赫書:集異璧之大成》
推薦數:437
如果下昂真正深入閱讀,我推薦道格拉斯·侯世達(Douglas Hofstadter)的《哥德爾、艾舍爾、巴赫書》。 他極為深入研究了程序員每日都要面對的問題:遞歸、驗證、證明和布爾代數。 這是一本很出色的讀物,難度不大,偶爾有挑戰,一旦你要鏖戰到底,將是非常值得的。 – Jonik

13、《代碼整潔之道》
推薦數:329
細節之中自有天地,整潔成就卓越代碼
盡管糟糕的代碼也能運行,但如果代碼不整潔,會使整個開發團隊泥足深陷, 寫得不好的代碼每年都要耗費難以計數的時間和資源。 然而這種情況並非無法避免。
著名軟體專家RoberfC.Marlin在《代碼整潔之道》中為你呈現出了革命性的視野。 Martin攜同ObjectMetltor公司的同事,從他們有關整潔代碼的最佳敏捷實踐中提煉出軟體技藝的價值觀, 以饗讀者,讓你成為更優秀的程序員——只要你著手研讀《代碼整潔之道》。
閱讀《代碼整潔之道》需要你做些什麼呢?你將閱讀代碼——大量代碼。 《代碼整潔之道》促使你思考代碼中何謂正確,何謂錯誤。 更重要的是,《代碼整潔之道》將促使你重新評估自己的專業價值觀,以及對自己技藝的承諾。
從《代碼整潔之道》中可以學到:
好代碼和糟糕的代碼之間的區別;
如何編寫好代碼,如何將糟糕的代碼轉化為好代碼;
如何創建好名稱、好函數、好對象和好類;
如何格式化代碼以實現其可讀性的最大化;
如何在不妨礙代碼邏輯的前提下充分實現錯誤處理;
如何進行單元測試和測試驅動開發。
雖然《代碼整潔之道》和《代碼大全》有很多共同之處,但它有更為簡潔更為實際的清晰例子。 – Craig P. Motlin

14、《Effective C++》和《More Effective C++》
推薦數:297
在我職業生涯早期,Scott Meyer的《Effective C++》和後續的《More Effective C++》都對我的編程能力有著直接影響。 正如當時的一位朋友所說,這些書縮短你培養編程技能的過程,而其他人可能要花費數年。
去年對我影響最大的一本書是《大教堂與市集》,該書教會我很有關開源開發過程如何運作,和如何處理我代碼中的Bug。 – John Channing

15、《編程珠璣》
推薦數:282
多年以來,當程序員們推選出最心愛的計算機圖書時,《編程珠璣》總是位列前列。 正如自然界里珍珠出自細沙對牡蠣的磨礪,計算機科學大師Jon Bentley以其獨有的洞察力和創造力, 從磨礪程序員的實際問題中凝結出一篇篇不朽的編程「珠璣」, 成為世界計算機界名刊《ACM通訊》歷史上最受歡迎的專欄, 最終結集為兩部不朽的計算機科學經典名著,影響和激勵著一代又一代程序員和計算機科學工作者。
本書為第一卷,主要討論計算機科學中最本質的問題:如何正確選擇和高效地實現演算法。
盡管我不得不羞愧地承認,書中一半的東西我都沒有理解,但我真的推薦《編程珠璣》,書中有些令人驚奇的東西。 – Matt Warren

16、《修改代碼的藝術》by Michael Feathers
本書是繼《重構》和《重構與模式》之後探討修改代碼技術的又一里程碑式的著作, 而且從涵蓋面和深度上都超過了前兩部經典。 書中不僅講述面向對象語言(Java、C#和C++)代碼,也有專章討論C這樣的過程式語言。
作者將理解、測試和修改代碼的原理、技術和最新工具(自動化重構工具、單元測試框架、仿對象、集成測試框架等), 與解依賴技術和大量開發和設計優秀代碼的原則、最佳實踐相結合,許多內容非常深入,而且常常發前人所未發。
書中處處體現出作者獨到的洞察力,以及多年開發和指導軟體項目所積累的豐富經驗和深厚功力。 通過這部集大成之作,你不僅能掌握最頂尖的修改代碼技術,還可以大大提高對代碼和軟體開發的領悟力。
我認為沒有任何一本書能向這本書一樣影響了我的編程觀點。 它明確地告訴你如何處理其他人的代碼,含蓄地教會你避免哪些(以及為什麼要避免)。- Wolfbyte
同意。很多開發人員討論用干凈的石板來編寫軟體。 但我想幾乎所有開發人員的某些時候是在吃其他開發人員的狗食。– Bernard Dy

17、《編碼:隱匿在計算機軟硬體背後的語言》
這是一本講述計算機工作原理的書。
不過,你千萬不要因為「工作原理」之類的字眼就武斷地認為,它是晦澀而難懂的。 作者用豐富的想像和清晰的筆墨將看似繁雜的理論闡述得通俗易懂,你絲毫不會感到枯燥和生硬。 更重要的是,你會因此而獲得對計算機工作原理較深刻的理解。 這種理解不是抽象層面上的,而是具有一定深度的,這種深度甚至不遜於「電氣工程師」和「程序員」的理解。
不管你是計算機高手,還是對這個神奇的機器充滿敬畏之心的菜鳥, 都不妨翻閱一下《編碼:隱匿在計算機軟硬體背後的語言》,讀一讀大師的經典作品,必然會有收獲。
我推薦Charles Petzold的《編碼》。 在這個充滿工具和IDE的年代,很多復雜度已經從程序員那「抽取」走了,這本書一本開眼之作。 – hemil

18、《禪與摩托車維修藝術 / Zen and the Art of Motorcycle Maintenance》
對我影響最大的那本書是 Robert Pirsig 的《禪與摩托車維修藝術》。 不管你做什麼事,總是要力求完美,徹底了解你手中的工具和任務,更為重要的是, 要有樂趣(因為如果你做事有樂趣,一切將自發引向更好的結果)。 – akr

19、《Peopleware / 人件集:人性化的軟體開發》
Demarco 和 Lister 表明,軟體開發中的首要問題是人,並非技術。 他們的答案並不簡單,只是令人難以置信的成功。 第二版新增加了八章內容。 – Eardo Molteni

20、《Coders at Work / 編程人生》
這是一本訪談筆錄,記錄了當今最具個人魅力的15位軟體先驅的編程生涯。 包括DonaldKnuth、Jamie Zawinski、Joshua Bloch、Ken Thompson等在內的業界傳奇人物,為我們講述了 他們是怎麼學習編程的,在編程過程中發現了什麼以及他們對未來的看法, 並對諸如應該如何設計軟體等長久以來一直困擾很多程序員的問題談了自己的觀點。
一本非常有影響力的書,可以從中學到一些業界頂級人士的經驗,了解他們如何思考並工作。 – Jahanzeb Farooq

21、《Surely You』re Joking, Mr. Feynman! / 別鬧了,費曼先生!》
雖然這本書可能有點偏題,但不管你信不信,這本書曾在計算機科學專業課程的閱讀列表之上。 一個優秀的角色模型,一本有關好奇心的優秀書籍。 – mike511

22、《Effective Java 中文版》
此書第二版教你如何編寫漂亮並高效的代碼,雖然這是一本Java書,但其中有很多跨語言的理念。 – Marcio Aguiar

23、《Patterns of Enterprise Application Architecture / 企業應用架構模式》
很奇怪,還沒人推薦 Martin Fowler 的《企業應用架構模式》- levi rosol

24、《The Little Schemer》和《The Seasoned Schemer》 nmiranda
這兩本是LISP的英文書,尚無中文版。 美國東北大學網站上也有電子版。

25、《交互設計之路》英文名:《The Inmates Are Running The Asylum: Why High Tech Procts Drive Us Crazy and How to Restore the Sanity》該書作者:Alan Cooper,人稱Visual Basic之父,交互設計之父。
本書是基於眾多商務案例,講述如何創建更好的、高客戶忠誠度的軟體產品和基於軟體的高科技產品的書。 本書列舉了很多真實可信的實際例子,說明目前在軟體產品和基於軟體的高科技產品中,普遍存在著「難用」的問題。
作者認為,「難用」問題是由這些產品中存在著的高度「認知摩擦」引起的, 而產生這個問題的根源在於現今軟體開發過程中欠缺了一個為用戶利益著想的前期「交互設計」階段。 「難用」的產品不僅損害了用戶的利益,最終也將導致企業的失敗。
本書通過一些生動的實例,讓人信服地講述了由作者倡導的「目標導向」交互設計方法在解決「難用」問題方面的有效性, 證實了只有改變現有觀念,才能有效地在開發過程中引入交互設計,將產品的設計引向成功。
本書雖然是一本面向商務人員而編寫的書,但也適合於所有參與軟體產品和基於軟體的高科技產品開發的專業人士, 以及關心軟體行業和高科技行業現狀與發展的人士閱讀。
他還有另一本中文版著作:《About Face 3 交互設計精髓》

26、《Why』s (Poignant) Guide to Ruby 》
如果你不是程序員,閱讀此書可能會很有趣,但如果你已經是個程序員,可能會有點乏味。

27、《Unix編程藝術》
It is useful regardless operating system you use. – J.F. Sebastian
不管你使用什麼操作系統,這本書都很有用。 – J.F. Sebastian

28、《高效程序員的45個習慣:敏捷開發修煉之道》
45個習慣,分為7個方面:工作態度、學習、軟體交付、反饋、編碼、調試和協作。
每一個具體的習慣里,一開始提出一個謬論,然後展開分析,之後有正隊性地提出正確的做法,並設身處地地講出了正確做法給你個人的「切身感受」,最後列出幾條注意事項,幫助你修正自己的做法(「平衡的藝術」)。

29、《測試驅動開發》
前面已經提到的很多書都啟發了我,並影響了我,但這本書每位程序員都應該讀。 它向我展示了單元測試和TDD的重要性,並讓我很快上手。 – Curro
我不關心你的代碼有多好或優雅。 如果你沒有測試,你或許就如同沒有編寫代碼。 這本書得到的推薦數應該更高些。 人們討論編寫用戶喜歡的軟體,或既設計出色並健壯的高效代碼,但如果你的軟體有一堆bug,談論那些東西毫無意義。– Adam Gent

30、《點石成金:訪客至上的網頁設計秘笈》
可用性設計是Web設計中最重要也是難度最大的一項任務。 《點石成金-訪客至上的網頁設計秘笈(原書第二版)》作者根據多年從業的經驗,剖析用戶的心理, 在用戶使用的模式、為掃描進行設計、導航設計、主頁布局、可用性測試等方面提出了許多獨特的觀點, 並給出了大量簡單、易行的可用性設計的建議。
本書短小精煉,語言輕松詼諧,書中穿插大量色彩豐富的屏幕截圖、趣味叢生的卡通插圖以及包含大量信息的圖表, 使枯燥的設計原理變得平易近人。
本書適合從事Web設計和Web開發的技術人員閱讀,特別適合為如何留住訪問者而苦惱的網站/網頁設計人員閱讀。 這是一本關於Web設計原則而不是Web設計技術的書。
本書作者是Web設計專家,具有豐富的實踐經驗。 他用幽默的語言為你揭示Web設計中重要但卻容易被忽視的問題,只需幾個小時, 你便能對照書中講授的設計原則找到網站設計的症結所在,令你的網站煥然一新。

③ 常見的數據分析師筆試題目及答案

常見的數據分析師筆試題目及答案

導讀:探索性數據分析側重於在數據之中發現新的特徵,而驗證性數據分析則側重於已有假設的證實或證偽。以下是由我J.L為您整理推薦的實用的應聘筆試題目和經驗,歡迎參考閱讀。

1、海量日誌數據,提取出某日訪問網路次數最多的那個IP。

首先是這一天,並且是訪問網路的日誌中的IP取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用映射的方 法,比如模1000,把整個大文件映射為1000個小文件,再找出每個小文中出現頻率最大的IP(可以採用hash_map進行頻率統計,然後再找出頻率 最大的幾個)及相應的頻率。然後再在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。

或者如下闡述:

演算法思想:分而治之+Hash

1.IP地址最多有2^32=4G種取值情況,所以不能完全載入到內存中處理;

2.可以考慮採用“分而治之”的思想,按照IP地址的Hash(IP)24值,把海量IP日誌分別存儲到1024個小文件中。這樣,每個小文件最多包含4MB個IP地址;

3.對於每一個小文件,可以構建一個IP為key,出現次數為value的Hash map,同時記錄當前出現次數最多的那個IP地址;

4.可以得到1024個小文件中的出現次數最多的IP,再依據常規的排序演算法得到總體上出現次數最多的'IP;

2、搜索引擎會通過日誌文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。

假設目前有一千萬個記錄(這些查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復後,不超過3百萬個。一個查詢串的重復度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G。

典型的Top K演算法,還是在這篇文章里頭有所闡述,

文中,給出的最終演算法是:

第一步、先對這批海量數據預處理,在O(N)的時間內用Hash表完成統計(之前寫成了排序,特此訂正。July、2011.04.27);

第二步、藉助堆這個數據結構,找出Top K,時間復雜度為N‘logK。

即,藉助堆結構,我們可以在log量級的時間內查找和調整/移動。因此,維護一個K(該題目中是10)大小的小根堆,然後遍歷300萬的 Query, 分別和根元素進行對比所以,我們最終的時間復雜度是:O(N) + N’*O(logK),(N為1000萬,N’為300萬)。ok,更多,詳情,請參考原文。

或者:採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0。最後用10個元素的最小推來對出現頻率進行排序。

3、有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16位元組,內存限制大小是1M。返回頻數最高的100個詞。

方案:順序讀文件中,對於每個詞x,取hash(x)P00,然後按照該值存到5000個小文件(記為x0,x1,…x4999)中。這樣每個文件大概是200k左右。

如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續往下分,直到分解得到的小文件的大小都不超過1M。

對每個小文件,統計每個文件中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含 100 個結點的最小堆),並把100個詞及相應的頻率存入文件,這樣又得到了5000個文件。下一步就是把這5000個文件進行歸並(類似與歸並排序) 的過程了。

4、有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序。

還是典型的TOP K演算法,解決方案如下:

方案1:

順序讀取10個文件,按照hash(query)的結果將query寫入到另外10個文件(記為)中。這樣新生成的文件每個的大小大約也1G(假設hash函數是隨機的)。

找一台內存在2G左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸並排序按照出現次數進行排序。將排序好的query和對應的 query_cout輸出到文件中。這樣得到了10個排好序的文件(記為)。

對這10個文件進行歸並排序(內排序與外排序相結合)。

方案2:

一般query的總量是有限的,只是重復的次數比較多而已,可能對於所有的query,一次性就可以加入到內存了。這樣,我們就可以採用trie樹/hash_map等直接來統計每個query出現的次數,然後按出現次數做快速/堆/歸並排序就可以了。

方案3:

與方案1類似,但在做完hash,分成多個文件後,可以交給多個文件來處理,採用分布式的架構來處理(比如MapRece),最後再進行合並。

5、 給定a、b兩個文件,各存放50億個url,每個url各佔64位元組,內存限制是4G,讓你找出a、b文件共同的url?

方案1:可以估計每個文件安的大小為5G×64=320G,遠遠大於內存限制的4G。所以不可能將其完全載入到內存中處理。考慮採取分而治之的方法。

遍歷文件a,對每個url求取hash(url)00,然後根據所取得的值將url分別存儲到1000個小文件(記為a0,a1,…,a999)中。這樣每個小文件的大約為300M。

遍歷文件b,採取和a相同的方式將url分別存儲到1000小文件(記為b0,b1,…,b999)。這樣處理後,所有可能相同的url都在對應的小 文件(a0vsb0,a1vsb1,…,a999vsb999)中,不對應的小文件不可能有相同的url。然後我們只要求出1000對小文件中相同的 url即可。

求每對小文件中相同的url時,可以把其中一個小文件的url存儲到hash_set中。然後遍歷另一個小文件的每個url,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到文件裡面就可以了。

方案2:如果允許有一定的錯誤率,可以使用Bloom filter,4G內存大概可以表示340億bit。將其中一個文件中的url使用 Bloom filter映射為這340億bit,然後挨個讀取另外一個文件的url,檢查是否與Bloom filter,如果是,那麼該url應該是共同的url(注意會有一定的錯誤率)。

Bloom filter日後會在本BLOG內詳細闡述。

6、在2.5億個整數中找出不重復的整數,注,內存不足以容納這2.5億個整數。

方案1:採用2-Bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需內存 2^32 * 2 bit=1 GB內存,還可以接受。然後掃描這2.5億個整數,查看Bitmap中相對應位,如果是00變01,01變10,10保持不變。所描完事後,查看 bitmap,把對應位是01的整數輸出即可。

方案2:也可採用與第1題類似的方法,進行劃分小文件的方法。然後在小文件中找出不重復的整數,並排序。然後再進行歸並,注意去除重復的元素。

7、騰訊面試題:給40億個不重復的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中?

與上第6題類似,我的第一反應時快速排序+二分查找。以下是其它更好的方法:

方案1:oo,申請512M的內存,一個bit位代表一個unsigned int值。讀入40億個數,設置相應的bit位,讀入要查詢的數,查看相應bit位是否為1,為1表示存在,為0表示不存在。

方案2:這個問題在《編程珠璣》里有很好的描述,大家可以參考下面的思路,探討一下:

又因為2^32為40億多,所以給定一個數可能在,也可能不在其中;

這里我們把40億個數中的每一個用32位的二進制來表示

假設這40億個數開始放在一個文件中。

;

④ 軟考程序員考試下午題如何解答

做一份工作,實際就是追尋夢想的過程,而為了完成夢想,必須有一個長期規劃,從而指導我們選擇工作。它是擇業過程中最本質和最原始的參考借鑒。下載鏈接

為此,小雲為你精選一份程序員面試書單,分為職業規劃、編程技能兩部分,適合剛畢業的大學生、正准備換工作的程序員們,涵蓋演算法工程師、Java工程師、測試等多個領域。

軟技能 代碼之外的生存指南約翰 Z.森梅茲 著

這是一本真正從「人」(而非技術也非管理)的角度關注軟體開發人員自身發展的書。書中論述的內容既涉及生活習慣,又包括思維方式,凸顯技術中「人」的因素,全面講解軟體行業從業人員所需知道的所有「軟技能」。

本書聚焦於軟體開發人員生活的方方面面,從揭秘面試的流程到精耕細作出一份殺手級簡歷,從創建大受歡迎的博客到打造你,從提高自己工作效率到與如何與「拖延症」做斗爭,甚至包括如何投資不動產,如何關注自己的健康。

編程珠璣(第2版)喬恩·本特利(Jon Bentley) 著

作者雖然沒有給出解決這些問題的具體代碼,但始終非常富有洞察力和創造力地圍繞著這些折磨程序員的實際問題展開討論,從而引導讀者理解問題並學會解決問題的技能,這些都是程序員實際編程生涯中的基本技能。

為此,本書給出了一些精心設計的有趣而且頗具指導意義的程序,這些程序能夠為那些復雜的編程問題提供清晰而且完備的解決思路,書中還充滿了對實用程序設計技巧及基本設計原則的清晰而睿智的描述。

PS:本書在第一版的基礎上增加了3個方面的新內容:測試、調試和計量,集合表示,字元串問題,並對第一版的所有程序都進行了改寫,生成了等量的新代碼。

重構 改善既有代碼的設計馬丁·福勒(Martin Fowler) 著

軟體開發的不朽經典,生動闡述重構原理和具體做法,普通程序員進階到編程高手必須修煉的秘笈。

重構,一言以蔽之,就是在不改變外部行為的前提下,有條不紊地改善代碼。多年前,正是《重構:改善既有代碼的設計》原版的出版,使重構終於從編程高手們的小圈子走出,成為眾多普通程序員日常開發工作中不可或缺的一部分。《重構:改善既有代碼的設計》也因此成為與《設計模式》齊名的經典著作,被譯為中、德、俄、日等眾多語言,在世界范圍內暢銷不衰。

《重構:改善既有代碼的設計》凝聚了軟體開發社區專家多年摸索而獲得的寶貴經驗,擁有不因時光流逝而磨滅的價值。今天,無論是重構本身,業界對重構的理解,還是開發工具對重構的支持力度,都與《重構:改善既有代碼的設計》最初出版時不可同日而語,但書中所蘊涵的意味和精華,依然值得反復咀嚼,而且往往能夠常讀常新。

C和C++程序員面試秘籍董山海 著

眾多高級語言都從C/C++有所借鑒,所以說C/C++的語言基礎對從事軟體開發的人員來說非常重要。

本書是一本解析C/C++面試題的書,可以幫助求職者更好地准備面試。《C和C++程序員面試秘笈》共包含12章,囊括了目前企業中常見的面試題類型和考點,包括C/C++程序基礎,預處理、const、static與sizeof,引用和指針,字元串,位運算與嵌入式編程,C++面向對象,C++繼承和多態,數據結構,排序,泛型編程,STL,演算法和邏輯思維等最常見的面試題。《C和C++程序員面試秘笈》通過技術點解析、代碼輔佐的方式讓讀者能深刻領會每個考點背後的技術。

本書緊扣面試精髓,對各種技術的剖析一針見血,是目前想找工作的C/C++程序員和剛畢業的大學生的面試寶典。

Java程序員面試寶典楊磊 著

本書對程序設計面試中Java常見的題型和常用解答技巧進行了介紹,對現代職業人如何有效求職、面試考官如何關注求職者動態等做了詳細解說。本書將為您揭開知名IT企業面試、筆試的核心機密;傳授程序員崗位求職的關鍵技巧。

編程之法:面試和演算法心得July 著

本書涉及面試、演算法、機器學習三個主題。書中的每道編程題目都給出了多種思路、多種解法,不斷優化、逐層遞進。本書第1章至第6章分別闡述字元串、數組、樹、查找、動態規劃、海量數據處理等相關的編程面試題和演算法,第7章介紹機器學習的兩個演算法—K近鄰和SVM。此外,每一章都有「舉一反三」和「習題」,以便讀者及時運用所學的方法解決相似的問題,且在附錄中收錄了語言、鏈表、概率等其他題型。

書中的每一道題都是面試的高頻題目,反復出現在最近5年各大公司的筆試和面試中,對面試備考有著極強的參考價值。全書邏輯清晰、通俗易懂,適合熱愛編程、演算法、機器學習,以及准備IT筆試和面試,即將求職、找工作的讀者閱讀。

C#與.NET程序員面試秘笈靳華 著

《C#與.NET程序員面試寶典》取材於各大IT公司的歷年面試題252個(包括研發類筆試及口試題目、情商及智商類題目),詳細分析了應聘C#與.NET程序員職位的常見考點。《C#與.NET程序員面試寶典》主要內容包括:面試流程、基礎語法和技術框架、數據訪問及XML應用、高級特性及應用進階、測試及質量保證、跨國公司經典面試題等。

軟體測試工程師面試指導蔡為東 著

對於想要得到一份軟體測試工程師職位的朋友來說,可能會有一些疑問,如軟體測試這個行業究竟怎麼樣?什麼樣的人適合做軟體測試?面試當中要注意什麼?軟體測試的基本知識點都有哪些?筆試都會涉及哪些內容?等等。本書將解答以上所有的疑問。

本書共6章內容,主要包括軟體測試行業概貌、軟體測試從業人員的基本要求、如何找工作、軟體測試技術基礎、典型的測試工程師筆試題等。本書內容豐富,講解深入淺出,能讓讀者朋友在短時間內掌握基本的測試技術,了解求職過程的各個環節,熟悉各種類型的筆試題,領會面試技巧。本書後附有一些實用的附錄,例如簡歷模板、新人工作指南等,尤其是「我在微軟做軟體測試外包」這一部分內容,寓故事性和知識性於一體,講述了作者在國際軟體巨頭——微軟公司做軟體測試外包的親身經歷,相信對於廣大的讀者朋友有閱讀和參考的價值。

本書適合想要從事軟體測試工作的朋友,也可供初級軟體測試工程師學習之用,另外也可作為大專院校軟體測試培訓的教材之一。

Android高薪之路李寧 著

《Android高薪之路:Android程序員面試寶典》取材於各大IT公司面試真題,所給出的試題盡可能地覆蓋了Android應用開發的各個方面,而且大多數試題都有解析部分,讀者可以通過這部分更深入地理解試題中所包含的技術內容,希望真正做到由點成線,舉一反三。

《Android高薪之路:Android程序員面試寶典》中還將Android中涉及的各個常用技術問題進行篩選、分類。這樣讀者可以有的放矢,對自己還沒有掌握的Android技術進行重點攻破,從而起到事半功倍的效果。除了對每道題目都有詳細的解析和回答外,對相關知識點還有擴展說明。

《Android高薪之路:Android程序員面試寶典》對面試中Android常見的題型和常用解答技巧進行了介紹,它不僅能幫助求職者快速復習相關知識點,也對現代職業人如何有效求職做了詳細解說。《Android高薪之路:Android程序員面試寶典》對於讀者從求職就業到提升計算機專業知識都有顯著的幫助。

編程之美《編程之美小組》

《編程之美—— 微軟 技術面試心得》收集了約60道演算法和 程序設計題目,這些題目大部分在近年的筆試,面試中出現過,或者是被微軟員工熱烈討論過。作者試圖從書中各種有趣的問題出發,引導讀者發現問題,分析問題,解決問題,尋找更優的解法。

書中絕大部分題目都提供了詳細的解說。 每道題目後面還有一至兩道擴展問題,供讀者進一步鑽研。

書中還講述了面試的各種小故事,告訴讀者微軟需要什麼樣的技術人才,重視什麼樣的能力,如何甄別人才。回答讀者關於IT業面試,招聘, 職業發展的疑問。 這本書的很多題目會出現在IT 行業的各種筆試,面試中。但本書更深層的意義在於引導讀者思考,和讀者共享思考之樂,編程之美。

⑤ 求高人給個計算機學習指導。

一、廣泛了解,從科普書籍開始

選擇計算機專業的同學,也許是因為原先有一定的基礎,也許是因為一時的激情,但更多的人,可能對自己的選擇沒有深刻的認識,或多或少對計算機專業有一些神秘的感覺。自己究竟是否喜歡這個學科?才華能夠在哪個分支領域有所施展?抑或是真的不適合這個專業?諸多疑問,解決的方法首先便是了解和認識我們的學科。濃厚的興趣是學好任何學科的源泉;而廣泛的了解則是獲得興趣的途徑。當今我們對於信息的獲取已非難事,其中「閱讀」是一個簡潔而有效的方法。

也許你認為閱讀專業書籍對於剛剛步入大學的自己來說有點困難,也很枯燥,那麼不妨先從科普書籍看起。科普書籍是了解理論、獲得應用知識最好的途徑。相信不少理工科的同學被量子物理和相對論搞得頭昏腦脹過。究其原因,是我們的現實生活與抽象的數學模型之間存在思想意識上的鴻溝。然而要是讀讀斯蒂芬•霍金的《時間簡史》,你就會被書中有趣的故事和例證所吸引,從而對抽象的理論有了感性的認識——即使仍然沒有讀懂,你也至少了解了這個學科研究的領域和目標是什麼,也必然有所收獲。所有理工學科都有這樣的性質,計算機專業也不例外。

我們知道,計算機理論是建立在數學基礎之上的。大學計算機專業對數學的要求較高,其重要性不必多言。數學令不少同學頭痛,除了其「繁」與「難」外,很大程度上是因為他們沒有理解這些抽象理論的實際應用方向。與本科數學專業的課程設置相比,計算機專業的數學課程大都偏重實用性。比如我們的離散數學課程中涉及到的邏輯代數奠定了計算機一切運算的基礎,形式語言構成了計算機程序編譯的模型,代數系統則是當前各類資料庫系統的理論依據等等。因此,如果能夠提前地了解到並簡單地學習一下這些數學知識的具體應用,對理解理論是很有益處的。此外,電子學、信號與系統、控制理論等也是計算機專業學生必修的公共課,然而不少同學往往認為它們與計算機專業的關系不大,從而放鬆了學習。事實上這些學科是計算機硬體與網路通信的基礎,學好這方面知識的前提是認識它們的現實應用及其與計算機的密切聯系。

也許你將來學習圖論的時候,對「歐拉路」的概念會很清晰,這是因為你在小時候的圖畫書上玩過「一筆畫」的游戲;然而「二分圖」、「生成樹」這些概念又是怎麼回事呢?你的理解可能就不是那麼深刻了——因為你一時難以找到一些生活中的實例,並從中抽取出特性。在這種情況下,翻閱一些涉及這些知識的科普書籍就十分有必要了。我曾讀過一套《數學游戲》(《科學美國人》雜志匯編,中文版:科學技術文獻出版社),它將圖論、邏輯代數、自動機理論等領域的抽象的概念具體化為一個個有趣的故事,引導讀者了解這些知識的現實應用,啟發讀者將抽象思維與感性生活有機結合。我還讀過一本《編碼的奧秘》(《CODE》,中文版:機械工業出版社),它則將邏輯代數、數字電路、匯編語言等知識以實物和簡單電路的形式進行類比,揭示其中的原理,並引導讀者動手實踐。事實上這類與計算機專業相關的科普書籍還有很多,在學習課本的間隙閱讀一下,絕對能起到催化劑的作用。

談到科普書籍,相關的另一個問題便是計算機科學與計算機技術之間的關系。也許不少同學選擇計算機專業,是源於對計算機令人眼花繚亂的應用的認識。所謂計算機技術,一般是指包括文字處理、信息管理、多媒體、網站建設等在內的計算機應用技術;而所謂計算機科學,一般指數據結構、組成原理、操作系統、編譯原理等計算機內部實現機制。前者是計算機在各行各業提高生產力的體現,屬於各類職業教育和專科教育的范疇;而後者是研究是計算機本身的理論,是本科計算機教學的重點。市面上大多數計算機書籍與雜志是計算機應用技術方面的,屬「技術普及型」,從受眾角度來看與科普書籍有著類似的性質。適當地涉獵一些自己感興趣的應用技術,對培養學習興趣、增強實踐能力、了解業界行情是很有好處的。不過如果確實想在計算機行業長期做下去,仍然應當將主要精力放在對計算機科學的學習方面。畢竟用科學的理論指導實踐是大學教育的意義所在。

總之,廣泛了解計算機學科基礎科普知識,在今後學習具體理論的時候才會少一些盲目,多一些頓悟。

二、把握全局,學習計算機導論

當你對計算機學科涉及的領域有所了解後,就應該著手展開專業學習了。初讀本專業的教學計劃與課程設置,你或許會被諸如離散數學、編譯原理、介面技術等生疏的課程名稱弄得一頭霧水。這些課程都是研究什麼的?它們各自與我們面前的計算機有哪方面的聯系?要回答這類問題,首先需要把握全局,從整體上認識計算機科學。

國內高等院校一般都為大一學生開設計算機基礎課程。這類課程的受眾面廣,主要涉及計算機基礎應用知識。各種版本的計算機基礎教程幾乎都以計算機科學導論作為開篇。對於把計算機作為應用工具的其他專業的學生而言,導論只算是「內容概要」,他們往往更注重後面的應用型知識;而對於把計算機作為研究對象的我們,則決不能忽略這類指導性的內容。專門地、有意識地學好計算機科學導論,能夠使你對計算機科學有一個大局觀,清楚地認識到每一個分支學科的研究領域與重要意義,從而在今後的具體學習中明確方向,加深理解。

依我個人的學習經驗,建議初學者閱讀一些國外優秀計算機基礎與導論教材。與國內大多數講解軟硬體具體使用的同類教材相比,國外教材更偏重以應用為切入點,深入淺出地闡述計算機科學原理。諸如《計算機文化(第8版)》(《New Perspectives on Computer Concepts》,中文版,機械工業出版社)、《計算機科學導論》(《Foundations of Computer Science: From Data Manipulation to Theory of Computation》,中文版,機械工業出版社):前者適合於各種信息類專業的學生或計算機愛好者閱讀。該書圖文並茂,語言生動,從應用角度出發,廣泛涉及計算機軟體、硬體、網路的基本原理,同時概述了計算機學科的歷史背景與行業現狀。隨書的光碟中給出了不少影音材料,在學習的同時還可以提高計算機專業英語聽說能力。後者在風格上與前者類似,但內容更適合計算機專業學生閱讀,被美國不少高校定為計算機專業學生的入門課。它以實例作為出發點,系統地講解了計算機組成、計算機網路、操作系統、數據結構、演算法設計等分支學科的研究領域、基本原理和應用方向,而幾乎不涉及晦澀的數學模型與實現細節。閱讀此類書籍,可以在潛移默化中理清初學者對於計算機科學學習的思路。

計算機科學是一個有機聯系的整體,每個分支都或多或少地與其它分支存在依賴關系。如果死板地依照教學計劃線性地進行學習,往往會遇到知識理解上的問題。例如演算法分析課程與程序設計課程分屬理論與實踐;組成原理課程與體系結構課程是對計算機系統不同層面的剖析。我們不能簡單地找出它們的先修、後修關系,這樣難以建立完整的知識體系。因此在把握大局之後,我們仍有必要簡單了解一下每個分支學科的基礎知識。在這方面,推薦大家閱讀《編程卓越之道(第一卷):深入理解計算機》(《WRITE GREAT CODE: Volume 1:Understanding the Machine》,中文版,電子工業出版社)這本書。分開來看每一章節,其內容編排結構與國內高校計算機課程體制相近,涵蓋了邏輯代數、數字電路、機器指令、體系結構、存儲器管理等方面的基礎知識和實現方法,特別是闡明了各個分支學科之間的本質聯系。有了這些基礎之後,在遇到更高階的問題時,你至少會明白這個問題應該在哪個分支學科中尋找答案了。

當你有了一定的計算機理論基礎,尤其是程序設計基礎後,想更加深入地把握計算機科學的脈絡,不妨看看這本書:《深入理解計算機系統(修訂版)》(《Computer Systems A Programmer's Perspective》,中文版,中國電力出版社)。它與《編程卓越之道》系列的共同特點是從程序員的視角觀察計算機系統。而這本書作為國外數十所高校的計算機系統導論教材,其組織更加嚴密,風格更加嚴謹。它以「程序在計算機中如何執行」為主線,全面闡述計算機系統內部實現的諸多細節。當你在學習數據結構、組成原理和體系結構等課程和時候,翻閱一下此書的相應章節,同時編程實現其中的例子,一定會對課本上單純的文字型理論有更加感性的認識——原來它們是這樣活生生地存在於我的計算機里的!

正所謂「會當凌絕頂,一覽眾山小」,從計算機科學全局的高度整體把握其分支學科,在頭腦中率先構建計算機科學的整體框架並為其夯實最基層的結構,就能夠為你在未來每一步的學習中掃清迷霧,指明方向。

三、運籌帷幄,掌握編程的思想

程序設計與開發是計算機學習的一個關鍵環節,編程能力是衡量一名計算機專業人員素質的重要考核點。這是因為程序是連接理論與實踐的紐帶,是計算機科學與計算機技術相交融的領域。作為一名計算機專業學生,我們一方面有別於其它專業將計算機作為工具的應用型人才,不能僅僅利用計算機,而要為他人利用計算機提供平台;另一方面我們暫時達不到計算機科學家的水平,不能做出理論研究成果,但能為理論學習鋪墊實踐基礎。因此,只有具備足夠的程序設計與開發能力,才能真正體現我們的智慧,同時充分發揮計算機的潛力。

學習編程,首先應掌握至少一門程序設計語言。C語言作為一種語法清晰、功能強大、應用廣泛的高級語言,長期以來被國內大多數高校的定為程序設計必修課。全面理解和掌握C語言的脈絡的重要意義這里毋庸多言。市面上C語言的教程多如牛毛,但最經典的當數C語言的設計者Kernighan與Ritchie合著的權威白皮書——《C程序設計語言(第2版)》(《The C Programming Language》,中文版,機械工業出版社)。書雖不厚,但絕對全面而准確。其語言簡潔,例證通俗,實用性強。相比之下國內的一些C語言教材在學習曲線可能比前者平滑,但它們往往以考試為導向,過多地糾纏語法死角,同時大都未遵從ANSI標准。對於計算機專業學生來說,前者能夠讓我們看到更加嚴謹與實務的態度。當你的語言功底達到一定程度後,就需要從一個更高的視角來探察語言的本質,不妨看看這本:《計算機程序的構造和解釋(第2版)》(《Structure and Interpretation of Computer Programs》,中文版,機械工業出版社)。它闡述了編程語言本身的機制與實現,同時引入了一門對於大多數中國學生來說不甚了解的語言——LISP。LISP是很多美國高校計算機專業的入門語言,也是一種結構上與C、Pascal、Java、Basic等完全不同的非馮•諾依曼語言。研讀SICP,體味LISP,給你耳目一新的感覺之後更多地可以加深對編程思想本質的理解。

大學的各類程序設計與開發課程旨在培養我們兩方面的能力——演算法設計能力與應用開發能力。前者偏重計算機科學,後者偏重計算機技術。演算法是用計算機思維解決現實問題的理論,具有較強的數學性。演算法學的曠世巨著應數Knuth的《計算機程序設計藝術》(《The Art of Computer Programming》,中文版,清華、機工、國防等出版社皆有授權),不過要徹底讀懂這個大部頭需要相當的數學理論基礎與編程實踐經驗積累。對於初學者,建議首先培養使用常規演算法解決小規模問題的能力,並行地提高駕馭語言的水平與抽象問題的思維。針對這個目的,結合程序設計實踐一類的課程,可以讀讀這幾本書:《編程珠璣(第2版)》(《Programming Pearls》,中文版,中國電力出版社)、《程序設計實踐》(《The Practice of Programming》,中文版,機械工業出版社)、《代碼閱讀方法與實踐》(《Code Reading: The Open Source Perspective》,中文版,清華大學出版社)、《C專家編程》(《Expert C Programming》,中文版,人民郵電出版社)。它們的側重點各有不同,但對於通過實踐來學習演算法與數據結構都是很有益處的。

應用開發方面,實踐是第一要務,然而高效的實踐是建立在科學的程序設計方法之上的。以C語言為代表的結構化程序設計方法是規范的程序邏輯的基礎,目前主要使用在系統級開發中,前面所提到的諸多書籍都或多或少有所涉及。而以Java、C++為代表的面向對象程序設計方法廣泛應用於實用項目開發,這方面的經典之作中,推薦閱讀Bruce Eckel的《Java編程思想(第3版)》(《Thinking in Java》,中文版,機械工業出版社)與《C++編程思想(第2版)》(《Thinking in C++》,中文版,機械工業出版社)。此外軟體架構設計、編碼規范與風格、代碼除錯與質量管理以及軟體工程的各類原則在實際項目開發中都是及其重要的,在具備了一定的編程經驗、准備投入一些實際項目開發的時候務必要了解。建議閱讀《代碼大全(第2版)》(《Code Complete》,中文版,電子工業出版社)這本大而全的軟體構建綜合性寶典,它在從總體上指導軟體開發的各個環節的同時也引入了一些細節問題(諸如goto的使用)的討論,引導我們對一些司空見慣的程序設計理念不但要知其然,而且要知所以然。

有一位熱衷於游戲的同學告訴我,游戲給予他滿足控制欲的空間。但是請放眼看看,游戲的控制范圍不外乎一個特定進程中他人預先設定好的一系列數據,並以有限的圖像與聲音形式體現出來。然而如果你掌握了編程這一強大的武器,就能夠面對眼前的計算機游刃有餘,在硬體條件允許的情況下盡你所能將控制欲升華為創造力,方便自己的同時造福他人。運籌帷幄,掌握編程的思想,無論走向科學研究或是應用開發,這都將為你奠定堅實的基礎!

四、理性思辨,體味計算機哲學

Bill Gates對計算機事業充滿激情——「每天早晨醒來,一想到所從事的工作和所開發的技術將會給人類生活帶來的巨大影響和變化,我就會無比興奮和激動。」自由軟體運動的精神領袖Richard Stallman幾十年如一日,將打破知識壟斷、共享人類智慧作為己任,帶領著數以萬計的軟體志願者推動著開源世界的發展。但並非每個計算機業者都能有Gates那樣豪邁的氣度和Stallman那種堅定的信仰,計算機及其相關技術對於大多數業者來說僅僅是興趣愛好或者謀生的工具。計算機行業半個多世紀以來形成了其獨有的文化氛圍,作為一名計算機專業學生,了解專業文化,體味專業哲學,對於學習和從業都是具有指導意義的。

首先必須承認,計算機世界中存在著形形色色的意識理念差異。諸如微軟帝國與開源世界的明爭暗鬥,不僅僅是一場商戰,更多的是兩種哲學的搏擊。當代大學生多數是在微軟Windows光環照耀下認識計算機的。在這種環境下,多接觸一些開源世界的事物,對於理解計算機的本質不無裨益。《共創未來:打造自由軟體神話》(《Free for All: How Linux and the Free Software Movement Undercut the High-Tech Titans》,中文版,上海科技教育出版社)是一本講述開源世界發展史的書,你可以從中了解自由軟體運動及其領袖人物的傳奇故事,從而對GNU、Linux、OpenSource這些概念蘊生人性化的理解。清華大學王垠的《完全用GNU/Linux工作,擯棄Windows——你我共勉》、蘭州大學黃平的《自由,你忘記了嗎?》等長篇文章則是國人對開源運動的慷慨陳辭。盡管這些文章常常被指為「偏激」,但沒有調查就沒有發言權,無論支持還是反對,客觀的認識是第一位的。

其次,我們應該用平和的心態對待知識與技術,衡准專業學習在生活中的位置。一些同學出於種種原因,成為了「先進技術」的追隨者:通曉各類流行的編程語言,一有新版本的工具推出立即安裝學習,一有新的技術論戰立即關注其走向。還有一些同學成為了某些技術的忠實信徒:看準了Java就對.NET的東西置之不理。這些追隨者和信徒們往往為突飛猛進的技術所累,以至於有感於學習的空虛。過分追捧技術可謂捨本逐末,死扣某一知識也顯得目光短淺。一方面百變的技術離不開計算機科學的本源,在實踐過程中深入理解基礎知識是關鍵;另一方面任何技術都有統領其實現細節的思想精髓,觀其形不如知其神。我們不妨甩開冗繁的技術,換個角度靜下心來讀幾部計算機文化與哲學作品:

程序人生方面:《編程之道》(《The Tao of Programming》,雙語版,電子工業出版社)一書出自一位對東方道家與禪宗思想有著獨特理解的美國軟體工程師之手,全書由一則則短小而富有哲理故事組成,以類似寓言的形式生動地反映了程序員群體的生活以及計算機文明的演進。閑暇時隨手翻閱,即使不能立刻體會到每個故事的真諦,但隨著自身閱歷的增長,相信你會領悟程序人生的「道法自然」。

設計理念方面:開源軟體界的「鬥士」級元老Eric Raymond所著的《Unix編程藝術》(《The Art of Unix Programming》,中文版,電子工業出版社)一書,以Unix系統的設計原則為主線,展示了Unix所開啟的「KISS」(Keep It Simple, Stupid!)編程文化與思維方式。對於很多干啃千篇一律的課本、禁錮於Windows開發的計算機專業學生來說,這本書一定能夠使你眼界大開——「結構化」並非真理,「面向對象」也不是王道;而對於有一定Unix/Linux使用或開發經驗的同學,這本書也一定會使你豁然明朗——原來一個程序的設計竟可以如此精巧!

管理哲學方面:對於有志於軟體工程,想涉足項目管理的同學,《人月神話》(《The Mythical Man-Month》,中文版,清華大學出版社)這本書就有必要讀一讀了。它拿真實案例說事,彷彿一部實例化的軟體工程課本。如果你在團隊開發的道路上陷入了困境,不如參考一下前輩們是如何處理「人」與「月」二者之矛盾的吧。事實上不僅是軟體工程,任何事業的成功,往往技術不是關鍵,社會科學的因素才是埋頭技術的朋友們更應當關注的。

歸根結底,計算機的哲學依舊是人的哲學。拋開理念之爭議,超越技術的形式,以人為本地認識我們的行業與自身的地位,或許會使將來的發展道路走得更舒心一些。

⑥ 學數據結構(C++)有什麼值得推薦的好書

遠標老師以前推薦我看《數據結構》可以拿來入門。然後可以根據自己的實際情況來安排怎麼樣學習數據結構。很多人是看一遍書,然後在遇到演算法之後再去實現它。在這里列出一些我知道的演算法書籍,以供參考。(我也只看過演算法導論,編程之美)

1. CLRS 演算法導論
演算法網路全書,只做了前面十幾章的習題,便感覺受益無窮。
2. Algorithms 演算法概論
短小精悍,別據一格,准經典之作。一個壞消息: 同演算法導論,該書沒有習題答案。好消息:習題很經典,難度也適中,只需花點點時間自己也都能做出來。不好也不壞的消息:我正在寫習題的答案,已完成前三章,還剩九章約二百道題,順利的話二個月之後發布。另有中文版名《演算法概論》,我沒看過,不知道翻譯得怎麼樣。如果有心的話,還是盡量看原版吧,其實看原版與看中文版花費時間不會相差很大,因為大部分時間其實都花費在做習題上了。
dr. dobb's essential books on Algorithm and daba structure
3. Algorithm Design 演算法設計
很經典的一本書,很久之前看的,遺憾的是現在除了就記得它很經典之外其它都忘光了。
4. SICP 計算機程序的構造和解釋
六星之書無需多言,雖然這不是一本講演算法的書,但看完此書有助於你更深入的理解什麼是遞歸。我一直很強調習題,看完此書後你至少應該做完前四章的太部分習題。否則那是你的遺憾,也是作者的遺憾。
5. Concrete Mathematics 具體數學
有人說看TAOCP之前應該先弄清楚這本書的內容,要真是如此的話那我恐怕是看不到TAOCP了。零零碎碎的看了一大半,很多東西都沒有時間來好好消化。如果你是剛進大學不久的本科生,有著大把的可自由支配時間,那你幸運又幸福了,花上幾個月時間好好的讀一下此書吧,收獲絕對大於你的期望值。
6. Introction to The Design and Analysis of Algorithms 演算法設計與分析基礎
很有趣的一本演算法書,有許多在別的書上找不到的趣題,看完此書絕對能讓你大開眼界,實在是一本居家旅行,面試裝逼的必備佳作。
7. 編程之美--微軟技術面試心得
雖說是一本面試書,但如果把前面十幾頁扯掉的話,我更願意把它看作是一本講解題思維的演算法小品。在書中,作者通常是給出一個平常解法,然後再一次又一次的優化改進,你可以很清楚的看到基本的演算法設計思想是如何得到運用以解決實際問題的。如果你已經有了一些演算法的基礎,看完本書應該能使你的演算法應用能力得到一定的提高。另外,本書生動有趣,也同樣適合於初學者。
8. Fundamentals of Algorithmics 演算法基礎
也是很久之前在學校圖書館借來看的,內容記不太清楚了,只隱約記得此書的動態規劃章節猶為出彩。應該是很經典的一本書,個人以為足以和演算法導論等所謂當世經典平分秋色,但是怎麼好像被人提到的不多,或許是我孤陋寡聞了。
9. How to solve it 怎樣解題
二十世紀最偉大的數學思想家之一波利亞的力作,講一般性的解題方法:怎麼認識問題,怎麼轉換問題,怎麼解決問題,如何在問題中得到啟發,如何找到一個通往答案的方向。
10. Programming interviews exposed 程序員面試攻略
一本消遣之作。個人以為要比國內的某「XXX面試寶典」純粹一些,至少也有一些啟發性的內容,而不單單是面試題解庫。
11. Programming Pearls 編程珠璣
學習演算法不僅需要像Alogrithms,演算法導論這樣的重量級的內功心法,像《編程之美》、《編程珠璣》這樣的輕量級的輕功身法也必不可少。前些年網上不是很流行像「給你10億個數,找到最大的n個」或者「給你10億個數,找出現次數最多的那個數」之類的網路面試題嗎?看了此書你就知道怎麼解決了。相比於《編程之美》來說,本書中的示例技巧性略低一些,但是也更有實際應用價值一些。
12. 演算法藝術與信息學競賽
如果演算法導論是九陽神功,那這本無疑就是九陰真經。本書是專為參加一些諸如ACM之類程序設計比賽的同學而寫的,江湖人稱「黑書」。裡面講的都是一些在編程比賽中常用的演算法、數據結構,以及一些數論和計算幾何等。我雖然並不搞競賽,但也從此書中受益頗多。
13. An Introction to Probability Theory and Its Applications
准備看的,現在才發現概率論有多麼重要,可惜本科的時候沒有好好學。前不久一個同學問我個問題,我半天弄了一個程序給他,他說:這里就不是相關系數么,Excel一下就完事!我暈,我還真不知道那就是相關系數。
14. Numerical Analysis
這本的作者是Richard L. Burden,J. Douglas Faires
數值分析,討論各種數值演算法,比如插值、擬合、積分、微分方程的求解、線性和非線性方程組求解等。准備詳細看。
15. TAOCP 計算機程序設計藝術
傳說中的TAOCP,說的人多,看的人少。TAOCP四卷堪稱是演算法藏經閣中的易筋經或者是少林七十二絕技。天下武學,盡出少林,天下演算法,盡出TAOCP也。這點你可以順便翻開一本演算法書看看他的引用文獻就知道了。我只讀了第四卷的部分章節,前三卷暫時還沒敢看,還在讀書計劃表中被無限期擱置。

⑦ 編程珠璣的目錄

第一部分基礎第1章開篇1.1一次友好的對話1.2准確的問題描述1.3程序設計1.4實現概要1.5原理1.6習題1.7深入閱讀第2章啊哈!演算法2.1三個問題2.2無處不在的二分搜索2.3基本操作的威力2.4排序2.5原理2.6習題2.7深入閱讀2.8變位詞程序的實現(邊欄)第3章數據決定程序結構3.1一個調查程序.3.2格式信函編程3.3一組示例3.4結構化數據3.5用於特殊數據的強大工具3.6原理3.7習題3.8深入閱讀第4章編寫正確的程序4.1二分搜索的挑戰4.2編寫程序4.3理解程序4.4原理4.5程序驗證的角色4.6習題4.7深入閱讀第5章編程小事5.1從偽代碼到c程序5.2測試工具5.3斷言的藝術5.4自動測試5.5計時5.6完整的程序5.7原理5.8習題5.9深入閱讀5.10調試(邊欄)第二部分性能第6章程序性能分析6.1實例研究6.2設計層面6.3原理6.4習題6.5深入閱讀第7章粗略估算7.1基本技巧7.2性能估計7.3安全系數7.4little定律7.5原理7.6習題7.7深入閱讀7.8日常生活中的速算(邊欄)第8章演算法設計技術8.1問題及簡單演算法8.2兩個平方演算法8.3分治演算法8.4掃描演算法8.5實際運行時間8.6原理8.7習題8.8深入閱讀第9章代碼調優9.1典型的故事9.2急救方案集錦9.3大手術——二分搜索9.4原理9.5習題9.6深入閱讀第10章節省空間10.1關鍵在於簡單10.2示例問題10.3數據空間技術10.4代碼空間技術10.5原理10.6習題10.7深入閱讀10.8巨大的節省(邊欄)第三部分應用第11章排序11.1插入排序11.2一種簡單的快速排序11.3更好的幾種快速排序11.4原理11.5習題11.6深入閱讀第12章取樣問題12.1問題12.2一種解決方案12.3設計空間12.4原理12.5習題12.6深入閱讀第13章搜索13.1介面13.2線性結構13.3二分搜索樹13.4用於整數的結構13.5原理13.6習題13.7深入閱讀13.8一個實際搜索問題(邊欄)第14章堆14.1數據結構14.2兩個關鍵函數14.3優先順序隊列14.4一種排序演算法14.5原理14.6習題14.7深入閱讀第15章字元串15.1單詞15.2短語15.3生成文本15.4原理15.5習題15.6深入閱讀第1版跋第2版跋附錄a演算法分類附錄b估算測試附錄c時空開銷模型附錄d代碼調優法則附錄e用於搜索的c++類部分習題提示部分習題答案索引

熱點內容
叉叉助手刪除腳本 發布:2025-09-18 03:21:24 瀏覽:847
深圳ug五軸編程培訓 發布:2025-09-18 03:13:35 瀏覽:193
安卓軟體殘留怎麼清理 發布:2025-09-18 03:02:02 瀏覽:339
centos7apachephp7 發布:2025-09-18 03:01:47 瀏覽:651
安卓如何實現點擊彈出列表 發布:2025-09-18 02:47:25 瀏覽:52
python文件函數 發布:2025-09-18 02:47:23 瀏覽:568
pythonwrap 發布:2025-09-18 02:46:32 瀏覽:326
伺服器與計算機有什麼區別 發布:2025-09-18 02:07:26 瀏覽:931
python不支持的數據類型有 發布:2025-09-18 01:50:23 瀏覽:643
長江存儲科技招聘 發布:2025-09-18 01:44:48 瀏覽:767