卡耐基 梅隆大學的程式設計難題

2021-08-08 14:25:50 字數 1507 閱讀 4969

卡耐基-梅隆大學(cmu)的電腦科學系曾經有乙個常規性的小型程式設計競賽,參賽物件是剛入學的研究生。競賽的目的是讓這些新的研究人員得到一些關於電腦科學系的直接經驗,並讓他們展示自己的強大潛力。cmu在計算機領域的研究歷史悠久,可以追溯到計算機的先驅時代,它在這個領域所取得的成就可以說是非同凡響。所以對於cmu舉辦的程式設計競賽,其水準可想而知。

比賽的形式每年都不一樣,其中有一年非常簡單。參賽者必須讀入乙個檔案(檔案的內容是一些數值),並列印這些數值的平均值。只有兩個規則:

1:程式的執行速度要盡可能的快。

2:程式必須用pascal或c編寫。

參賽選手的程式集中之後由一名系工作人員分批上交。學生們可以自願上交盡可能多的作品,這可以鼓勵非確定性隨機演算法(就是猜測某些資料集的特徵,利用猜測結果獲得盡可能快的效率)的使用。決定性的規則是:執行時間最短的程式將獲得優勝。

這些研究生們紛紛鑽進各個角落,開始折騰各種各樣的程式,他們中的絕大多數都準備了3到4個程式參加競賽。

大多數人都猜想最大的贏家一定採用了**優化措施,不管是顯式地在**中使用,或是通過正確設定編譯器選項隱式地使用。標準的**優化技巧包括:消除迴圈、函式**就地擴充套件、公共子表示式消除、改進暫存器分配、省略執行時對陣列邊界的檢查、迴圈不變數**移動、操作符長度削減(把指數操作轉換成乘法操作,把乘法操作轉換成一位操作或加法操作)等。

資料檔案大約包含了1000個數值,假定讀入和處理每個數需要一毫秒(當時的系統差不多就是這個速度)最快的程式也要用10秒左右。

實際結果非常令人吃驚。其中最快的乙個程式,作業系統報告用時為-3秒。確實如此——優勝程式的執行時間是負數!第二快的程式大約用了幾毫秒,而第三名的作品恰好比預期的10秒稍微好一點。顯然,獲勝者在程式設計中做了弊,但他是怎樣作弊的呢?評委們在對優勝程式進行仔細審查後,答案揭曉了。

這個執行時間為負的程式充分利用了作業系統。程式設計師知道程序控制塊相對於堆疊底部的儲存位置,他用乙個指標來訪問程序控制塊,並用乙個非常大的值覆蓋「cpu已使用時間」字段。作業系統未曾想到cpu時間會有如此之大,因此錯誤地以二進位制補碼方案把這個非常大的數解釋為負數。

至於那個費時僅幾毫秒的亞軍得主同樣狡猾,他用的方法有所不同。他使用的是競爭規則而不是怪異的編碼。他提交了兩個不同的程式,其中乙個讀入資料,用正常的方法計算機平均值,並將答案寫入到乙個檔案中。第二個程式絕大部分時間處於睡眠狀態,它每隔幾秒醒來一次檢查答案檔案是否已存在,如果存在,就列印其結果。第二個程式總共只占用了幾毫秒的cpu時間。由於競賽者允許遞交多件作品,所以這個用時極少的程式就把他推上了亞軍的位置。

季軍作品所花的時間比預期的最小時間還要稍少一些。該程式的構思最為周詳,程式設計師殫精竭慮,用優化機器**來解決問題,並把指令作為整型陣列儲存在程式中。由於在程式中覆蓋堆疊上的返回位址是非常容易的,所以程式可以跳轉到這個整型陣列並逐條執行這些指令。所記錄的時間如實反映了這些指令解決問題的時間。

當這些策略被揭露後,轟動了全系。有些專家贊成對獲勝者進行嚴厲批評;一群年輕教授則相反,他們建議給他們額外的獎勵以表彰他們的天才。最後,雙方達成妥協。既沒有頒獎,也未對他們進行懲罰,結果不了了之。令人悲哀的是,這個競賽成了強烈感情的犧牲品。從此以後,這個競賽再未舉行。

與卡耐基梅隆大學博士交流筆記

cmu博士畢業要求 有的導師對文章要求比較高,學生需要在頂級會議上發表三四篇 或者在頂級雜誌上發表一兩篇 才能畢業。有的導師拿的是為期幾年的工程專案,這類專案驗收嚴格,要求整個系統能有效工作,那麼學生的主要任務就是把專案做好,發不發文章無關緊要。這種情況對學生的學術生涯不利,但是如果學生畢業後找到了...

卡耐基梅隆大學贏得DARPA網路挑戰賽

當地時間 8 月 5 日晚,在經歷 10 個小時的 安全大逃殺 後,由卡耐基梅隆大學 forallsecure 團隊打造的 mayhem 自動攻擊系統 在經歷 95 輪的挑戰後,終於在美國國防部高階研究計畫局 darpa 發起的 網路挑戰賽 cyber grand challenge 中拔得頭籌。共...

大學的程式設計學習

1.大學生活豐富多彩,會令你一生都難忘,但難忘有很多種,你可以學了很多東西而難忘,也會因為什麼都沒學到而難忘!2.計算機專業是乙個很枯燥的專業,但即來之 則安之,只要你努力學,也會發現其中的樂趣的。3.記住 萬丈高樓平地起!基礎很重要,尤其是專業基礎課,只有打好基礎才能學得更深。4.c語言是基礎,很...