讓理科生沉默,讓文科生流淚的綜合題詳解(轉,即原來有園友發過的程式設計師試題)...

weixin_34279184發表於2011-05-12

這套題就是前兩天在校內上看到的,原作者是上海交通大學的李垚同學,原文在 這裡 。於是考據癖大發作,就耗了7個小時寫了下面這些東西。答案只是我自己寫的,也並不是 官方的正確答案 ,括號裡附上了一些說明,主要是之所以選這個答案的理由,因為自己不是學純理工的,所以對程式設計這方面比較陌生,基本上以“考”為主,想當然的成分會少一些。

最後的主觀題也都是純介紹論述性的文字,就當長見識啦。很多沒註明來源的都是來自維基百科和百度百科,另外過程中也求助了一些學程式的朋友,總之一併謝過。

一,選擇題(皆為單選):

1. 以下誰是二進位制思想的最早提出者?

a,伏羲; b,姬昌; c,萊布尼茨;d,柏拉圖。

答案: a,伏羲

詳解: 伏羲創造了八卦陣,亦稱先天八卦。八卦陣在國內被普遍稱為最早的二進位制記錄制:陽爻(—)為1,陰爻(--)為0,八卦剛好記錄了三位二進位制數的8種組合。不過也有人說八卦的基礎並不是二進位制[1],在數學上屬於八階矩陣[0]云云。姬昌創造“文王八卦”,亦稱後天八卦。萊布尼茨是二進位制的開拓者,柏拉圖跟二進位制沒啥關係,勉強扯得上聯絡的是柏拉圖主義,被分類而形而上學的二元論。

根據英文維基記述,大約在公元前5至公元2世紀,印度詩人Pingala著述了數學描述音韻方法,並且對二進位制進行了描述。之後是邵雍在《皇極經世》中記載了八卦圖樣(最早的八卦是無圖無真相的——筆者注),才有了先天八卦圖的流傳。關於萊布尼茲在1679年創造了現代二進位制系統的時候,維基上是這樣說的:作為一箇中國迷,萊布尼茨是在聽說邵雍的八卦陣後,發現這個圖形正好奇妙地對應了二進位制的0到111111,並且稱讚說這顯示了中國人在此類數學哲學中的主要成就。

【實際上認真說這題應該無正確答案。】

2. 以下哪個概念和公孫龍的《指物論》中的“指”字含義相近?

a,變數;b,陣列;c,物件;d,指標。

答案: a,變數

詳解: 《指物論》是公孫龍在《漢書•藝文志》中殘存的《公孫龍子》6篇中的第3篇,記述的是關於客觀存在的實物和我們對它們認識的關係。在“指物論”中,“指”是名詞,指廣義的認識(即名詞性的符號——筆者注)[3]。而通篇文章中的指有名詞意有動詞意,不過《指物論》指稱理論的集中體現是所有的物件都是通過符號來稱呼的,符號代表事物[4]。而與此同時,指標是一個用來指示一個記憶體地址的計算機語言的變數[5],即指標就是地址,可以理解為指標是變數的一個真子集。

變數與“指”的共通點就是:對某個存在(Object,物件)賦予一個可以指稱它的名詞(Refer)。

PS:陣列就是一堆變數的集合

3,藺相如,司馬相如;魏無忌,長孫無忌。下列哪一組對應關係與此類似?

a,PHP,Python;b,JSP,servlet;c,Java,Javascript;d,C,C++。

答案: c,Java,Javascript

詳解: 藺相如(前329年—前259年),戰國時趙國上卿;司馬相如(約前179年—???),字長卿,漢族,蜀郡(今四川省成都人)。魏無忌(?-前243),魏昭王少子,安釐王的異母弟,戰國時期魏國著名的軍事家。;長孫無忌(約597年-659年),字輔機,河南省洛陽人[0]。共通點的話,就是名字雖然都有相似的地方,但是卻完全不是一碼事,誰也不挨著誰。

PHP是在前端伺服器執行使用的指令碼語言,Python是程式開發使用的物件導向的程式設計語言。JSP是動態網頁技術標準,servlet是伺服器端的Java應用程式。Java是一種程式設計語言,Javascript是物件導向的動態型別的區分大小寫的客戶端指令碼語言[0]。C++最早作為C的增強版,現在則是相互比較獨立的兩種程式語言。

總的來說,c 選項的相似程度更高一些。

4,秦始皇吞併六國採用了以下哪種演算法思想?

a, 遞迴;b,分治;c,迭代;d,模擬。

答案: b,分治

詳解: 秦始皇主要的吞併方法是:遠交近攻,逐個擊破,包括分化離間、連橫的策略。

遞迴指的是一個過程:函式不斷引用自身,直到引用的物件已知。分治,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題。迭代是通過從一個初始估計出發尋找一系列近似解來解決問題的過程,為實現這一過程所使用的方法統稱為迭代法。迭代演算法是用計算機解決問題的一種基本方法。讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值。模擬是用計算機程式將原本的事務或流程,予以系統化與公式化,產生可重現預期結果[0]

5,雅典王子忒修斯勇闖克里特島斬殺米諾牛的時候採用了以下哪種演算法?

a,動態規劃;b,窮舉;c,記憶化搜尋;d,Dijkstra演算法。

答案: b,窮舉

詳解: 動態規劃是一種在數學和電腦科學中使用的,用於求解包含重疊子問題的最優化問題的方法。窮舉就是根據某一公式(一般是遞推)列出所有可能的組合並驗證是否為所需解。記憶化搜尋的實質是動態規劃,效率也和動態規劃接近,形式是搜尋,簡單直觀,程式碼也容易編寫,不需要進行什麼拓撲排序。Dijkstra演算法解決的是有向圖中任意兩個頂點之間的最短路徑問題。

而這段傳說是忒修斯作為被進貢童男童女中的一員,前往克里特島的迷宮深處討伐米諾陶洛斯(半人半牛的怪物,所以人贈暱稱米諾牛),在克里特島遇到了美麗的公主阿里阿德涅,公主對他一見傾心而贈與線團以便他可以離開迷宮。

關於忒修斯是如何抵達迷宮中央斬殺米諾牛的,維基中是這樣記錄的:在忒修斯進入迷宮之後,他解開了線團的一端並系在門把上,然後將為了躲避門衛而藏起來的劍從衣服裡拿出來揮舞。忒修斯跟著阿里阿德涅公主給出的代達羅斯的指示,一直向前走,絕不轉彎。忒修斯來到迷宮中央並接近沉睡中的米諾陶洛斯。怪獸甦醒並開始了一場惡鬥。忒修斯用他的力量制服了怪獸,並用利劍刺穿對方的喉嚨。

根據所有選項和傳說描述似乎沒有一個是相符的,但是在邏輯學上有一個術語叫“阿里阿德涅的線”,也就是窮舉法。

6,印度電影《寶萊塢機器人之戀》中的機器人七弟採用的智慧演算法最有可能是以下哪一種?

a,神經網路;b,遺傳演算法;c,模擬退火;d,窮舉演算法。

答案: a,神經網路

詳解: 沒看過電影的筆者悲劇了,只能在豆瓣上看了一下影評,然後下了一個字幕檔案[7],在第876句臺詞的時候,開發七弟的博士說“你們瞭解七弟的神經模式嗎”。

七弟在經過簡單學習之後就有了完全可以通過圖靈測試的能力,算是比較典型的學習型人工智慧,神經網路作為一種運算模型,而其網路自身通常都是對自然界某種演算法或者函式的逼近,也可能是對一種邏輯策略的表達。

PS:遺傳演算法作為一種最優搜尋演算法,對於一個最優化問題,一定數量的候選解(稱為個體)的抽象表示(稱為染色體)的種群向更好的解進化。

7,《公孫龍子》記載:“齊王之謂尹文曰:‘寡人甚好士,以齊國無士,何也?’尹文曰:‘願聞大王之所謂士者。’齊王無以應。”這說明了齊王:

a,昏庸無道;b,是個結巴;c,不會下定義;d,不會定義自己的需求。

答案: d,不會定義自己的需求

詳解: 齊王問尹文說:“寡人特別喜歡士,但是齊國沒有士,怎麼辦?”尹文說:“想聽聽大王所謂的士是什麼。”齊王不知道要怎麼回答。(定義了自己想要的人是“士”,但是無法定義“士”)

8,惠施曾提出過“卵有毛”的命題,以下哪一項是導致這個錯誤命題的原因:

a,混淆了名稱空間;b,引入了錯誤的包;c,衍生類未過載;d,呼叫了危險的指標。

答案: c,衍生類未過載

詳解: 卵有毛”這個命題如今就只剩這個名字了,出自《莊子•天下篇》。關於惠施本人的著作,則無存。“卵有毛”的大意就是,蛋能孵出雞,雞有毛,所以蛋有毛(這裡的蛋嚴格定義為尚未開始分化的蛋)。

所給的四個選項是分別把毛、雞和蛋(在蛋中的雞)視為了不同的屬性、類或包,蛋是不具有“毛”的屬性(或類、子類)的,把這樣的思路分別還原到四個選項中。名稱空間是區別同名不同指的識別符號所用,和題述無關。引入了錯誤的包實際上其中類並未被真正編譯。衍生類未過載,是指將蛋視為雞的子類的時候,其屬性的變化並未得以體現(題述中實際是反向操作了)。

9,下面哪種物件導向的方法可以讓你變得富有?

a,繼承;b,封裝;c,多型;d,抽象。

答案: a,繼承

詳解: 繼承可以繼承父類的屬性和行為。封裝是隻提供介面並隱藏內部過程的行為。多型是指因繼承產生的相關不同類,但是因為我沒有多人讓我繼承,我也沒有兄弟姐妹(就算有,他們是否富有也與我無關)。抽象是一種簡化複雜現實問題的途徑。簡單來說就是富二代了…

10,明朝時期張居正改革的一條鞭法的主要思想是:

a,程式導向;b,萬物皆數;c,統一介面;d,泛型程式設計。

答案: c,統一介面

詳解: 一條鞭法的主要思想是“稅以銀徵收”,取消了原本的田賦、力役和其他雜稅,促進自然經濟的瓦解和商品經濟的發展。

程式導向是指以過程為中心的程式設計思想,形成模組化特點。萬物皆數是畢達哥拉斯學派的數學哲學理念(特指有理數),屬於世界觀的一種。泛型程式設計是一種語言機制,能夠幫助實現一個通用的標準容器庫。所謂通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能型別的物件這樣的事;泛型程式設計讓你編寫完全一般化並可重複使用的演算法,其效率與針對某特定資料型別而設計的演算法相同。泛型即是指具有在多種資料型別上皆可操作的含意,與模板有些相似。

一條鞭法的主要思想並不是以徵稅過程為中心的思想,同時也不是在多種型別上的操作。

二、匹配題(分析A中的句子所體現的演算法,和B中的演算法一一匹配)

A:

1,江南可採蓮,蓮葉何田田,魚戲蓮葉間。魚戲蓮葉東,魚戲蓮葉西,魚戲蓮葉南,魚戲蓮葉北。——漢樂府《江南》

2,眾裡尋他千百度,驀然回首,那人卻在燈火闌珊處。——辛棄疾《青玉案》

3,從前有座山,山裡有座廟,廟裡有個老和尚,再給小和尚講故事,故事內容是:從前有座山,山裡有座廟,廟裡有個老和尚,再給小和尚講故事,故事內容是:從前有座山,山裡有座廟,廟裡有個老和尚,再給小和尚講故事,故事內容是……

4,只勸樓臺追後主,不愁弓矢下殘唐。——孔尚任《桃花扇》

5,飛鳥之影,未嘗動也。——《莊子》

B:

1,貪心;2,回溯;3,窮舉;4,分治;5,遞迴;

答案: A1→窮舉; A2→回溯;A3→遞迴; A4→貪心;A5→分治。

詳解: 窮舉和遞迴就不講了。回溯演算法是一種試探法,基本思路是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。這正符合辛棄疾《青玉案》的筆意。4是《桃花扇》續四十出《餘韻》中的唱詞【秣陵秋】,選句前兩句說的是“中興朝市繁華續,遺孽兒孫氣焰張”,事出馬士英、阮大鋮出於一己的私心,迎立福王朱由崧,建立了南明弘光小朝廷。他們唆使朱由崧徵歌選舞,聲色犬馬,荒淫佚樂,做個“無愁天子”,過著紙醉金迷的生活[8],是比較典型的區域性最優策略,不從整體最優考慮,這就是貪心演算法啦。

5是極限理念的一個體現,是說每一秒飛鳥的影子都是固定的,因此每一秒連續起來,影子仍舊是固定的,極限的時間被割裂成互不相干的個體探討了,所以算是分治。

三、閱讀理解(閱讀下文,回答後面的問題)

美國的貝爾實驗室設計了最初的C語言;
刻在UNIX作業系統距今已有三四十年;
你在螢幕前凝視資料的繾綣;
我卻在旁輕輕敲打鍵盤,把你的夢想展現。
迴圈遞迴貪心動規是誰的從前,
喜歡在匈牙利演算法中你我牽手的畫面,
經過MSRA門前,我以大牛之名許願。
思念像斐波那契數列般漫延,
當軟工淪落在設計的文件間,演算法依舊是永垂不朽的詩篇。
我給你的愛寫在程式間,深藏在最長不下降子序列裡面,
幾萬組資料流過後發現我的心依然不變。
我給你的愛寫在程式間,深藏在最長不下降子序列裡面,
用無盡的程式碼刻下了永遠。
那已儲存千年的誓言一切又重演,
我算了很多遍,時間複雜度還是趨於無限,
我只想要這樣永遠連結在你的身邊。

1,題目中的MSRA是什麼的縮寫?

微軟亞洲研究院(Microsoft Research Asia)。其他意象包括了沉船、組織、軟體。

2,試賞析“思念像斐波那契數列般漫延”一句。

主觀題。斐波納契數列是指後一項為前兩項之和所列成的數列,比較典型的示例是 1 1 2 3 5 8…屬於比較典型的遞迴問題。趨向於無窮大的數列有很多,而斐波納契數列比較特殊的一點就是數列上的相鄰兩個數的比例會趨近於黃金分割比,在自然界中的很多動植物的構成都滿足斐波納契數列的特點,可以說這是一個最接近自然,最優美的數列。當然將每一次的增長視為帶著黃金的香氣也未嘗不可。同時斐波納契數列也是程式設計學習中比較常用的一個範例數列,主要涉及輸入、輸出、迴圈語句的使用和對變數的理解。

3,請結合時代背景,談談你對“當軟工淪落在設計的文件間,演算法依舊是永垂不朽的詩篇”一句的理解。

【搞軟體工程,文件是爹,設計是媽,只有演算法才能讓你有個幸福的家。】 演算法作為程式的核心,一個好的演算法替代相對較差演算法有時甚至會勝於硬體升級所帶來的好處[9]。所以說演算法永遠是不朽的詩篇啊,計算機最富藝術性的部分大概也就在這了。

4,“幾萬組資料流過後發現,我的心依然不變”一句體現了演算法的什麼特性?

Donald Knuth在他的著作《計算機程式設計藝術》裡對演算法下的定義中,演算法應該具有這5項特性:輸入、輸出、明確性、有限性和有效性。 資料流過證明有輸入有輸出,至於我心不變,也不知道是編譯成功了沒,不過暫時一切沒有變化證明它至少是明確的。

5,就“喜歡在匈牙利演算法中你我牽手的畫面”一句,談談你對匈牙利演算法的理解。

匈牙利演算法是眾多用於解決線性任務分配問題的演算法之一,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的經典演算法。

二分圖是指若干個頂點和頂點之間所連的邊,若所有頂點可以分成兩個不相交的集合,並且在同一個集合內的頂點沒有公用邊,則稱這樣的圖為二分圖(小學時候做的連線作業那樣的圖就是啦,另外在學習加法原理和乘法原理的時候所畫的圖也是二分圖),最大匹配是指這個二分圖中邊數最多的情況[10]。“匈牙利演算法中你我牽手的畫面”則證明“你我”已經形成了一個匹配。

附註:

[0](1234) 均來自維基百科和百度百科
[1]《中國方術考(修訂本)》作者:李零

—— P66 現已發現的商周卦畫(既占卜結果的記錄——筆者注),一律使用數字表示(豎寫)。所用數字包括十進數位中的一、五、六、七、八、九六個數字,省去二、三、四(因卦畫豎寫,難以分辨),未見十,並且既有作三爻者,也有作六爻者。它與《周易》用陰陽二爻表示六、七、八、九這四數中的九、六是不大一樣的。 ——P67 再晚,屬於西漢初,地下出土的馬王堆帛書《周易》和雙古堆漢簡《周易》則為探索今本《周易》的形成和它在漢代的傳授帶來了希望。這兩種《周易》,前一種經文的卦序與今本不同,是分為八組,每組拈取八卦中的一卦為下卦,上卦則按八卦排列。這種卦序,經分析,與宋儒所謂“先天卦位”相近,但又有所不同。實際是將“先天卦位”的四正卦保持不動,四隅卦右旋一位而成。經後所附《易傳》也與今本有較大差距,缺乏講“大衍之數五十”的一章(大衍之數五十,其用四十有九,分而為二以象兩,掛一以象三,揲之以四以象四時,歸奇於扐以象閏,五歲再閏,故再扐而後掛。可以解釋為一種十進位制的“數位組合”)。其性質應屬儒門所傳之易。……另外,比較值得注意的是,這兩種《周易》都是用一、八兩個數字表示陰陽二爻,可以反映早期卦畫向今本的過渡。 ——P146 第二章五、式圖解析(下):配數與配物(一)配數原理

[2]http://en.wikipedia.org/wiki/Binary_numeral_system#cite_ref-7
[3]http://www.confucius2000.com/zhuzibaijia/zhwlshj.htm
[4]http://www.lw23.com/paper_62089441/
[5]http://zh.wikipedia.org/wiki/%E6%8C%87%E9%92%88_(%E4%BF%A1%E6%81%AF%E5%AD%A6)
[6]http://en.wikipedia.org/wiki/Theseus#Minotaur
[7]http://shooter.cn/xml/sub/168/168817.xml WTF字幕組王別墅@douban非常大囧統@柔情痴漢分隊版
[8]http://gx.guoshi.com/index.php/%E3%80%8A%E6%A1%83%E8%8A%B1%E6%89%87%E3%80%8B%E7%9A%84%E5%85%B4%E4%BA%A1%E4%B9%8B%E6%84%9F
[9]http://developers.solidot.org/article.pl?sid=10/12/26/0655213
[10]http://imlazy.ycool.com/post.1603708.html

相關文章