當前位置:首頁 » 操作系統 » 演算法設計的論文

演算法設計的論文

發布時間: 2023-10-06 15:16:15

① 計算機論文範文3000字

學術堂整理了一篇3000字的計算機論文範文,供大家參考:


範文題目:關於新工程教育計算機專業離散數學實驗教學研究


摘要: 立足新工科對計算機類專業應用實踐能力培養的要求,分析了目前離散數學教學存在的關鍵問題,指明了開展離散數學實驗教學的必要性。在此基礎上,介紹了實驗教學內容的設計思路和設計原則,給出了相應的實驗項目,並闡述了實驗教學的實施過程和教學效果。


關鍵詞:新工科教育;離散數學;計算機專業;實驗教學


引言


新工科教育是以新理念、新模式培養具有可持續競爭力的創新型卓越工程科技人才,既重視前沿知識和交叉知識體系的構建,又強調實踐創新創業能力的培養。計算機類是新工科體系中的一個龐大專業類,按照新工科教育的要求,計算機類專業的學生應該有很好的邏輯推理能力和實踐創新能力,具有較好的數學基礎和數學知識的應用能力。作為計算機類專業的核心基礎課,離散數學的教學目標在於培養學生邏輯思維、計算思維能力以及分析問題和解決問題的能力。但長期以來「定義-定理-證明」這種純數學的教學模式,導致學生意識不到該課程的重要性,從而缺乏學習興趣,嚴重影響學生實踐能力的培養。因此,打破原有的教學模式,結合計算機學科的應用背景,通過開展實驗教學來加深學生對於離散數學知識的深度理解是實現離散數學教學目標的重要手段。


1.實驗項目設計


圍繞鞏固課堂教學知識,培養學生實踐創新能力兩個目標,遵循實用性和可行性原則,設計了基礎性、應用性、研究性和創新性四個層次的實驗項目。


(1) 基礎性實驗


針對離散數學的一些基本問題,如基本的定義、性質、計算方法等設計了7個基礎性實驗項目,如表1所示。這類實驗要求學生利用所學基礎知識,完成演算法設計並編寫程序。通過實驗將抽象的離散數學知識與編程結合起來,能激發學生學習離散數學的積極性,提高教學效率,進而培養學生的編程實踐能力。

(5) 利用網路教學平台


為了拓展學生學習的空間和時間,建立了離散數學學習網站,學習網站主要包括資源下載、在線視頻、在線測試、知識拓展和站內論壇五個部分模塊,其中知識拓展模塊包含背景知識、應用案例和實驗教學三部分內容。通過學習網站,學生不僅可以了解離散數學各知識點的典型應用,還可以根據自己的興趣選擇並完成一些實驗項目。在教學實踐中,規定學生至少完成1-2個應用性實驗項目並納入期中或平時考試成績中,從而激發學生的學習興趣。


4.結束語


針對新工科教育對計算機類專業實踐創新能力的要求,在離散數學教學實踐中進行了多方位、多層次的實驗教學,使學生了解到離散數學的重要


性,激發了學生的學習興趣,提高了學生程序設計能力和創新能力,取得了較好的教學效果。教學團隊將進一步挖掘離散數學的相關知識點在計算機學科領域的應用,完善離散數學實驗教學體系,使學生實踐能力和創新思維得以協同培養,適應未來工程需要。


參考文獻:


[1]徐曉飛,丁效華.面向可持續競爭力的新工科人才培養模式改革探索[J].中國大學教學,2017(6).


[2]鍾登華.新工科建設的內涵與行動[J].高等工程教育研究,2017(3).


[3]蔣宗禮.新工科建設背景下的計算機類專業改革養[J].中國大學教學,2018( 11) .


[4]The Joint IEEE Computer Society/ACM Task Force onComputing Curricula Computing Curricula 2001 ComputerScience[DB / OL]. http:/ / WWW. acm. org / ecation /curric_vols / cc2001. pdf,2001.


[5]ACM/IEEE - CS Joint Task Force on Computing Curricula.2013. Computer Science Curricula 2013[DB / OL]. ACMPress and IEEE Computer Society Press. DOI: http: / / dx.doi. org /10. 1145 /2534860.


[6]中國計算機科學與技術學科教程2002研究組.中國計算機科學與技術學科教程2002[M].北京: 清華大學出版社,2002.


[7]張劍妹,李艷玲,吳海霞.結合計算機應用的離散數學教學研究[J].數學學習與研究,2014(1) .


[8]莫願斌.凸顯計算機專業特色的離散數學教學研究與實踐[J].計算機教育,2010(14)

② 在FPGA上快速實現MD5演算法的新方法論文

在FPGA上快速實現MD5演算法的新方法論文

摘 要 文章介紹了一種在FPGA上快速實現MD5演算法的新方法,給出了優化設計的原理、實現的具體方法及其重要模塊的設計實現方案。

關鍵詞 MD5;FPGA;Verilog語言;集成電路;關鍵路徑

1 引言

隨著電子商務和網路通信的發展,網路信息安全的重要性越來越顯著,信息加密、數字簽名、數據的完整性認證、身份驗證等成為信息安全領域的重要內容。MD5演算法本身是為數字簽名應用而設計的,隨後也應用在信息驗證技術當中。作為應用最廣泛的安全散列演算法,MD5演算法的高效實現就成為研究的需要,MD5演算法本身可以採用軟體實現,但其性能受到處理器件性能的制約不能滿足網路通信帶寬日益增長的要求,因而通過硬體實現高速MD5 運算就成為需要。

2 MD5演算法介紹

MD5 演算法可以對任何長度不超過 264二進制位的消息產生128 位的單向散列消息摘要輸出, RFC1321 標准中的MD5 演算法主要步驟如下:

在一些初始化處理後,MD5以512位分組來處理輸入文本,每一分組又劃分為16個32位子分組。演算法的輸出由四個32位分組組成,將它們級聯形成一個128位散列值。

(1)附加填充比特:填充消息使其長度恰好為一個比512位的倍數僅小64位的數。即對報文進行填充使報文的長度(比特數)與448模512同餘。填充方法是附一個1在消息後面接所要求的多個比特0。

(2)附加長度值:在其後附上64位的消息長度(填充前)。如果消息長度大於 264,僅使用該長度的低64比特。這樣,該域包含的長度值為初始長度模264 的值。

這兩步的作用是使消息長度恰好是512位的整數倍(演算法的其餘部分要求如此),同時確保不同的消息在填充後不相同。

(3)初始化寄存器:四個32位初始化變數為:

它們也被稱為鏈接變數(chaining variable)

(4)進行演算法的主循環:這一步是演算法的核心,它是一個包含四個大循環的64步函數,四個大循環結構相同,但每次使用的邏輯函數不同,每一個大循環由對512比特的16步操作組成,即每16步為一輪大循環。

每次操作如下(設 Ai+1、Bi+1 、Ci+1 、Di+1 為第 +1個時鍾周期時打入寄存器的值):

以一下是每輪中用到的四個非線性函數(每輪一個)。

常數ti可以如下選擇:在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。Wi是512位消息分組中的一個,Si是每次循環移位的次數。對每次而言也是固定的常數。

(5)結果輸出:所有64步完成之後,將第64步的輸出加到四個初始化變數上作為新的初始化變數,進行下一個512比特分組的運算,直到所有分組處理完畢,單次操作圖如下:

圖1. MD5演算法單步操作圖

3 演算法優化

由上圖可以看到,硬體實現時,MD5演算法每一步操作中的關鍵路徑在於B的求取(其他三個變數都是直接傳遞),這個關鍵路徑包括了四個模 232加法運算、三輸入變數的邏輯運算、"兩個查找表運算及一個循環左移運算,而在FPGA設計中,加法運算最為耗時,四個加法運算至少需要三個加法器級聯完成,加法運算嚴重製約了整個操作的速度,可見要加快演算法運行速度就必須在簡化這一關鍵路徑上下工夫,經過觀察我們發現,在

中 對每個周期都是已知的常數,是輸入的512比特的一個32位分組,這樣,在512比特輸入初始化完成後,也可看作固定常數,

Ai是第i時鍾周期里寄存器D 的值,而 Di的值又是第i-1周期里的Ci-1 ,即Ai 的`值是第i-1周期里Ci-1的值。

若在第i周期設中間寄存器變數 ,並令

那麼在第i+1周期,

就可以表示為

操作就可以用下面幾個式子代替:

其中, Ai+1沒有參與任何運算,因此上式可以接著化簡為

這樣一來,原來一個周期內需要完成三級加法和相應的組合邏輯,現在只需要完成兩級加法和部分組合邏輯就行了,大大提高了演算法速度,只要在運算開始時加-個周期的初始化即可,簡化後的系統框圖如下:

圖2. 改進後的單步操作圖

4 結果比較

由上文中的演算法分析部分不難看出,傳統的實現方式關鍵路徑是3級32比特加法器延遲和組合邏輯的延遲,而改進的實現方式減少了一級加法器的延遲,並把組合邏輯的延遲分散到不同路徑上,因此,採用改進的實現方式大約可以將速度提高到原來的1.5倍左右。同時,為了實現數據的初始化,需要提前一個周期計算出寄存器A的值,因此整個演算法的實現需要65個周期。我們採用 VerilogHDL 描述,選擇Altera Stratix II EP2S15F672C5 FBGA晶元,在QuartusII6.0上驗證通過。由於在FPGA中,連線延時也很關鍵,而這部分延時不能像加法延時那樣通過預先計算並存儲在寄存器中來消除一部分,所以實際的MD5改進演算法與傳統型相比較,速度的提高約為1.3,資源方面由於只是增加了一個時鍾節拍,寄存器數量和組合邏輯並沒有增加,所以改進型在資源方面和傳統型相當。下表為演算法改進前後在資源、頻率、流量上的比較。

表1. 改進前後資源比較

5 結束語

由表1可見,改進型MD5演算法實現,使用的資源並沒有明顯增加,但速度的改善十分明顯,基本實現了用較少的資源得到較高速率的目標,證明了結構的正確性和合理性。實驗結果也說明,這種利用寄存器來減少加法器級聯從而減少關鍵路徑的實現方法也可用於一般的FPGA硬體設計中。

參考文獻

[1] R.Rivest. The MD5 Message-Digest Algorithm,RFC1321 1992。

[2] Jarvinen K, Tommiska M,Skytta J.Hardware implementation analysis of the MD5 hash algorithm.System Sciences,2005.HICSS』05.Proceedings of the 38th Annual Hawaii International conference on 03-06 Jan.2005:298

[3] Bruce Schneier. 應用密碼學.北京:機械工業出版社,2000:188~194

[4] William Stallings. 密碼編碼學與網路安全:原理與實踐.北京:電子工業出版社,2001: 216~222。

[5] 夏宇聞.Verilog 數字系統設計教程.航空航天大學出版社,2005

;

③ 演算法與程序設計論文3000字

1、論點(證明什麼)論點應該是作者看法的完整表述,在形式上是個完整的簡潔明確的句子。從全文看,它必能統攝全文。表述形式往往是個表示肯定或否定的判斷句,是明確的表態性的句子。
A.把握文章的論點。 中心論點只有一個(統率分論點)⑴明確:分論點可以有N個(補充和證明中心論點)
⑵方法①從位置上找:如標題、開篇、中間、結尾。②分析文章的論據。(可用於檢驗預想的論點是否恰當)③摘錄法(只有分論點,而無中心論點)
B.分析論點是怎樣提出的:①擺事實講道理後歸結論點;②開門見山,提出中心論點;③針對生活中存在的現象,提出論題,通過分析論述,歸結出中心論點;④敘述作者的一段經歷後,歸結出中心論點;⑤作者從故事中提出問題,然後一步步分析推論,最後得出結論,提出中心論點。
2、論據(用什麼證明)⑴論據的類型:①事實論據(舉例後要總結,概述論據要緊扣論點);②道理論據(引用名言要分析)。
⑵論據要真實、可靠,典型(學科、國別、古今等)。⑶次序安排(照應論點);⑷判斷論據能否證明論點;⑸補充論據(要能證明論點)。
3、論證(怎樣證明)
⑴論證方法 (須為四個字)①舉例論證(例證法)事實論據記敘②道理論證(引證法和說理)道理論據 議論
③對比論證(其本身也可以是舉例論證和道理論證)④比喻論證 比喻在說明文中為打比方,散文中為比喻。
⑵分析論證過程:①論點是怎樣提出的;②論點是怎樣被證明的(用了哪些道理和事實,是否有正反兩面的分析說理);③聯系全文的結構,是否有總結。
⑶論證的完整性(答:使論證更加全面完整,避免產生誤解)
⑷分析論證的作用:證明該段的論點。
4、議論文的結構⑴一般形式:①引論(提出問題)―――②本論(分析問題)―――③結論(解決問題)。
⑵類型:①並列式②總分總式③總分式④分總式⑤遞進式。
6、駁論文的閱讀
⑴作者要批駁的錯誤觀點是什麼?
⑵作者是怎樣進行批駁的,用了哪些道理和論據;
⑶由此,作者樹立的正確的觀點是什麼?

④ 計算機專業C與C++程序設計研究論文

計算機專業C與C++程序設計研究論文

摘要 :首先介紹了目前高校計算機學院C族語言相關程序設計課程的建設狀況。然後從C族語言的相互衍生關系出發,提出了在高校計算機課程體系中去除C語言的基礎課程,將其綜合成一門C++程序設計課程來供學生學習,並對課程內容、參考教材和課時安排上給出了自己的建議。

關鍵詞 :C語言;C++語言;程序設計

高校的C族語言教學總是按照先學C語言,再學C++的順序進行,這種學習順序隨著C++標準的不斷升級改革後變得越來越不適用。早期的C++屬於多面性語言,即可以像C一樣進行模塊化的面向過程的編程設計,也可以像Java一樣進行抽象的面向對象程序設計。那時的教學者考慮的是學生應當從較為便於理解的面向過程的編程思路入門學習C語言編程,然後在熟練了面向過程的編程方式後再從C語言延伸到C++,轉而學習面向對象的程序設計。可是隨著面向對象的程序設計在應用市場上佔領了絕對的主導地位後,再讓學生從面向過程著手就等於是浪費學習時間。加上C++和C兩門語言的初級語法思想是完全一致的,開設兩門課程浪費了學時,也耽誤後續更重要的核心課程的學習。

1程序設計語言C與C++的比較

1.1C與C++的共性。一般簡要的介紹是把C++當作C的加強版,這種認知當然是錯誤的,C++語言的設計者在設計之初為了保障自家語言會受到開發者的關注,所以兼容了的C的語法,這就自然使得C++可以使用C的編程方式進行程序設計,所以也導致了很多人對這兩種語言的關系產生了錯誤的認知。同時由於C語言本身設定上的優越性,所以C++在進行自我定義的時候也沿用了C語言很多優良的性質。基礎數據結構一致,C與C++的基礎數據類型都是以變數和常量作為基本屬性劃分,類型上有字元型、整型、長整型、單精度浮點型和雙精度浮點型,不過C++額外增設了布爾型。復合型數據結構上也都同時具有數組、多維數組、結構體、枚舉類型和共同體,但是C++增設了字元串類型以替代C語言中的字元數組,功能上更加強大,也更加便捷。在語法方面,聲明、賦值、循環、選擇的結構和實現都是一致的,並且C++雖然提倡使用類和對象的概念去設計程序結構,可也同樣支持函數體結構的程序設計結構。並且C語言中函數的賦值都是間接調用,在使用C語言函數時總是會在指針上出現各種紕漏,但是C++的函數體可以使用引用參數,這就使得C++的函數體比之C的更加好用。總的說來就是,C++標准下用戶可以完全使用C語法進行編程而不會出現任何BUG,同時C++自身的優越設定和標准使得其設計能力比C要強大數倍,是目前市場上大型程序開發的首選語言。

1.2C與C++的不同。上一節介紹了C++和C的.基礎語法上的區別,這些區別都是C++的作者在C的基礎之上修訂而來的結果,是為了讓C++標准下得面向過程的程序設計比之單純的C更加便捷方便。但是C++的誕生伊始,就是一門向上使用面對對象的程序設計思想的高級編程語言。它的封裝性、繼承性、多態性和對象唯一性才是C++成為強大高級語言的重要原因,這些特性都是C語言不可能擁有的。所以C能夠實現的程序,C++能夠實現並且實現的更為方便,C不能實現的程序,C++同樣可以實現。

1.3C++的特色。承接上一節,C++和C之間最大的不同,也是C++自身最值得誇耀的特性,就是面向對象程序設計思想。這種思想使得C++語言設計出來的程序,變成了類和對象的有機結合,這種結合的代碼比之面向過程的函數體架構的代碼更加易讀,共同開發起來容易上手,後續的維護者也不用費更多的腦筋去理解前人的代碼含義。而類和對象的設計思路,使得開發者合作時相互之間的工作變的更為獨立,雙方之間只需要知道對方所寫的類實現的功能和包含的數據就行。這種特性我們稱之為良好的封裝性,開發者之間不需要去知道對方的代碼是如何實現,甚至在此之上還可以保證良好的代碼健壯性。因為類的引入,更先進的作用域機制也被引入進來,類的書寫者往往會將自己類中的數據進行嚴格的作用域限定,防止其他合作者擅自去修改和使用自己類中的數據。合作者想要知道類中的數據或者使用類中的數據,只能通過類的書寫者定義的帶有檢查機制的方法才行。這樣會使得很多人合作開發的大型項目的穩定性和安全性比之用C語言開發時再上一個台階。同時類的概念中還有一個先進的設定就是繼承性,並且由這個繼承性還延伸出了介面的概念。有了可以繼承的介面和類,那麼開發者在對程序進行迭代的瀑布開發流程時,就可以很好的使用自己曾經開發的源代碼,或者借用其他項目的源代碼,因為只要學會科學的使用繼承機制,就不僅僅是節約程序員的代碼時間,也減少了程序員在回顧曾經代碼時發生的錯誤和歧義。而與繼承機制配合使用的是多態性,曾經C語言中定義的函數,其靈活度非常差,特定的函數只能滿足特定程序定義的需求,想要重用曾經的源代碼是幾乎不可能的事情。我們剛才提到的繼承機制使得C++開發者復用源代碼成為了一種習慣,但是復用時不可避免的修改問題又擺到了檯面上,多態機制順應而生了。多態機制使得類不僅可以繼承其他類,將父類的數據和方法都在本類體中自如的使用,同時還可以用本類中新的定義和代碼去覆蓋父類中的數據定義和方法。這就讓程序員變的更加自由,想用父類的數據和方法時就去繼承,但是不想全部使用時就加上多態機制去覆蓋。這樣代碼之間的重復利用率變得十分客觀,節約了大量的開發時間和開發成本。

2程序設計語言C與C++開設建議

C++課程的內容應當如下安排:第一部分,教授C++的基礎語法,讓學生可以編寫出在DOS命令行下輸入輸出的程序,了解編程的基本概念和思想。並且這時應當同時進行C和C++的雙向語法教學,為日後學生進入高年級後的方向選擇打下基礎。此部分使用半個學期最為適宜,並且此時並不灌輸學生何為面向對象何為面向過程,而主在讓學生使用基礎語法進行最基本的編程探索。第二部分,在學生有了基礎編程知識後,將數據結構的內容放入課程中去,用半學期的時間教授學生用C++實現的各類常見數據結構。並且結合實際開發項目中的代碼作為閱讀補充,讓學生明白數據結構的知識對程序開發的意義,然後將簡化後的小項目作為課堂的主要內容,用實際的代碼讓學生去理解那些枯燥的數學定理和概念。而且在實現數據結構的過程中,必然會面對一些更為高級的C++語法和概念。總的來說,用大一上的一個學期讓學生對於基礎編程有了良好的認知和深入,是十分值得和有效的。第三部分,在學生有了數據結構的基礎和C++的基本語法掌握後,應當面對一些實際的開發項目和問題。當然實際的問題還是需要老師進行簡化,其主要目的是讓學生掌握C++的高級特性和實際軟體開發的過程與思路,並且想學生傳授基礎的演算法。這一部分較為困難,應當使用一個學期讓學生慢慢的掌握和熟悉。第四部分,在學生算是對C++語言和數據結構與演算法都有了基礎的入門後,再進行課堂教學意義就不大了,應當再大二上學期開設一門課程設計實驗課,讓學生完成幾個難度從小到大的項目,循序漸進的掌握基本的實際開發技巧和思維。

參考文獻

[1]羅莉.計算機程序設計的多應用型開發與實現[J].產業與科技論壇,2015(14):54-55.

[2]鄧薇,何錇,錢俊彥,等.深度優先的多基因表達式程序設計[J].模式識別與人工智慧,2013(9):819-828.

[3]宛西原,汪霞.非計算機本科專業計算機程序設計課程的改革思考[J].計算機工程與科學,2014(z1):56-59.

;

⑤ 寫一篇《論演算法設計中的分治與增量》的學術論文1500字

一、動態規劃的基本思想

在比較基本的演算法設計思想里,動態規劃是比較難於理解,難於抽象的一種,但是卻又十分重要。動態規劃的實質是分治思想和解決冗餘,因此它與分治法和貪心法類似,它們都是將問題的實例分解為更小的、相似的子問題,但是動態規劃又有自己的特點。

貪心法的當前選擇可能要依賴於已經作出的選擇,但不依賴於還未做出的選擇和子問題,因此它的特徵是由頂向下,一步一步地做出貪心選擇,但不足的是,如果當前選擇可能要依賴子問題的解時,則難以通過局部的貪心策略達到全局最優解。相比而言,動態規劃則可以處理不具有貪心實質的問題。

在用分治法解決問題時,由於子問題的數目往往是問題規模的指數函數,因此對時間的消耗太大。動態規劃的思想在於,如果各個子問題不是獨立的,不同的子問題的個數只是多項式量級,如果我們能夠保存已經解決的子問題的答案,而在需要的時候再找出已求得的答案,這樣就可以避免大量的重復計算。由此而來的基本思路是,用一個表記錄所有已解決的子問題的答案,不管該問題以後是否被用到,只要它被計算過,就將其結果填入表中。

比較感性的說,其實動態規劃的思想是對貪心演算法和分治法的一種折衷,它所解決的問題往往不具有可愛的貪心實質,但是各個子問題又不是完全零散的,這時候我們用一定的空間來換取時間,就可以提高解題的效率。

二、動態規劃的基本步驟

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值(最大值或最小值)的那個解。設計一個動態規劃演算法,通常可以按以下幾個步驟進行:

(1)找出最優解的性質,並刻畫其結構特徵。

(2)遞歸地定義最優值。

(3)以自底向上的方式計算出最優值。

(4)根據計算最優值時得到的信息,構造一個最優解。

其中(1)——(3)步是動態規劃演算法的基本步驟。在只需要求出最優值的情形,步驟(4)可以省去。若需要求出問題的一個最優解,則必須執行步驟(4)。此時,在步驟(3)中計算最優值時,通常需記錄更多的信息,以便在步驟(4)中,根據所記錄的信息,快速構造出一個最優解。

三、典型的動態規劃舉例——矩陣連乘問題

作為經典的動態規劃演算法舉例,矩陣連乘問題很好地展現了動態規劃的特點和實用價值。給定n個矩陣{A1,A2,...,An},其中Ai與Ai+1是可乘的,i=1,2,...n-1。現在要計算這n個矩陣的連乘積。由於矩陣的乘法滿足結合律,所以通過加括弧可以使得計算矩陣的連乘積有許多不同的計算次序。然而採用不同的加擴號方式,所需要的總計算量是不一樣的。若A是一個p*q矩陣,B是一個q*r矩陣,則其乘積C=AB是一個p*r矩陣。如果用標准演算法計算C,總共需要pqr次數乘。

現在來看一個例子。A1,A2,A3分別是10*100,100*5和5*50的矩陣。如果按照((A1A2)A3)來計算,則計算所需的總數乘次數是10*100*5+10*5*50=7500。如果按照(A1(A2A3))來計算,則需要的數乘次數是100*5*50+10*100*50=75000,整整是前者的10倍。由此可見,在計算矩陣連乘積時,不同的加括弧方式所導致的不同的計算對計算量有很大的影響。如何確定計算矩陣連乘積A1A2,...,An的一個計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少便成為一個問題。

對於這個問題,窮舉法雖然易於入手,但是經過計算,它所需要的計算次數是n的指數函數,因此在效率上顯得過於低下。現在我們按照動態規劃的基本步驟來分析解決這個問題,並比較它與窮舉法在時間消耗上的差異。

(1)分析最優解的結構。

現在,將矩陣連乘積AiAi+1...Aj簡記為A[i:j]。對於A[1:n]的一個最優次序,設這個計算次序在矩陣Ak和Ak+1之間將矩陣鏈斷開(1<=k<n),那麼完全加括弧的方式為((A1...Ak)(Ak+1...An))。依此次序,我們應該先分別計算A[1:k]和A[k+1:n],然後將計算結果相乘得到A[1:n],總計算量為A[1:k]的計算量加上A[k+1:n]的計算量,再加上A[1:k]和A[k+1:n]相乘的計算量。

通過反證法可以證明,問題的關鍵特徵在於,計算A[1:n]的一個最優次序所包含的計算矩陣子鏈A[1:k]和A[k+1:n]的次序也是最優的。因此,矩陣連乘積計算次序問題的最優解包含著其子問題的最優解。這種最優子結構性質是該問題可以用動態規劃解決的重要特徵。

(2)建立遞歸關系定義最優值。

設計算A[i:j](1<=i<=j<=n)所需的最少數乘次數為m[i][j],則原問題的最優值為m[1][n]。而且易見,當i=j時,m[i][j]=0。

根據上述最優子結構性質,當i<j時,若計算A[i:j]的最優次序在Ak和Ak+1之間斷開,可以定義m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj(其中,Ai的維數為pi-1*pi)。從而有:

當i=j時,m[i][j]=0。

當i<j時,m[i][j]=min{m[i][k]+m[k+1][j]+pi-1*pk*pj} (i<=k<j)。

除此之外,若將對應於m[i][j]的斷開位置記為s[i][j],在計算出最優值m[i][j]後,可以遞歸地由s[i][j]構造出相應的最優解。

(3)計算最優值。

如果直接套用m[i][j]的計算公式,進行簡單的遞歸計算需要耗費指數計算時間。然而,實際上不同的子問題的個數只是n的平方項級(對於1<=i<=j<=n不同的有序對(i,j)對應於不同的子問題)。用動態規劃解決此問題,可依據其遞歸式以自底向上的方式進行計算。在計算過程中,保存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重復計算,最終得到多項式時間的演算法。下面給出計算m[i][j]的動態規劃演算法:

void matrixChain (int * p, int n, int * * m, int * * s)

{

for ( int i=1;i<=n;i++)

m[i][i]=0;

for ( int r=2;r<=n;r++) //鏈長度控制

for ( int i=1;i<=n-r+1;i++) //鏈起始位置控制

{

int j=i+r-1; //鏈終止位置

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];

s[i][j]=i;

for ( int k=i+1;k<j;k++)

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if (t<m[i][j])

{

m[i][j]=t;

s[i][j]=k;

}

}

}

}

演算法首先設定m[i][i]=0(i=1,2,...,n)。然後再根據遞歸式按矩陣鏈長的遞增方式依此計算出各個m[i][j],在計算某個固定的m[i][j]時,只用到已計算出的m[i][k]和m[k+1][j]。

稍加分析就可以得出,這個演算法以O(n^2)的空間消耗大大降低了時間復雜度,計算時間的上界為O(n^3)。

(4)構造最優解。

通過以上演算法的計算,我們知道了要計算所給矩陣連乘積所需的最少數乘次數,但是還不知道具體應該按照什麼順序來做矩陣乘法才能達到這個次數。然而,s[i][j]已經存儲了構造最優解所需要的足夠的信息。從s[1][n]記錄的信息可知計算A[1:n]的最優加括弧方式為(A[1:s[1][n]])(A[s[1][n]+1:n])。同理,每個部分的最優加括弧方式又可以根據數組s的相應元素得出。照此遞推下去,最終可以確定A[1:n]的最優完全加括弧方式,即構造出問題的一個最優解。

四、結語

本文簡單介紹了動態規劃的基本思想、步驟和簡單例題。以後筆者還會給大家介紹更多的例子,以及由動態歸劃衍生出來的備忘錄方法,使大家即使在不能清晰地分析出問題子結構的從屬關系時,仍能夠避免不必要的重復計算,快速地解決問題。
一、分治演算法
分治演算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。
分治法解題的一般步驟:
(1)分解,將要解決的問題劃分成若干規模較小的同類問題;
(2)求解,當子問題劃分得足夠小時,用較簡單的方法解決;
(3)合並,按原問題的要求,將子問題的解逐層合並構成原問題的解。
當我們求解某些問題時,由於這些問題要處理的數據相當多,或求解過程相當復雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。下面通過實例加以說明。
【例1】 [找出偽幣] 給你一個裝有1 6個硬幣的袋子。1 6個硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。為了幫助你完成這一任務,將提供一台可用來比較兩組硬幣重量的儀器,利用這台儀器,可以知道兩組硬幣的重量是否相同。比較硬幣1與硬幣2的重量。假如硬幣1比硬幣2輕,則硬幣1是偽造的;假如硬幣2比硬幣1輕,則硬幣2是偽造的。這樣就完成了任務。假如兩硬幣重量相等,則比較硬幣3和硬幣4。同樣,假如有一個硬幣輕一些,則尋找偽幣的任務完成。假如兩硬幣重量相等,則繼續比較硬幣5和硬幣6。按照這種方式,可以最多通過8次比較來判斷偽幣的存在並找出這一偽幣。
另外一種方法就是利用分而治之方法。假如把1 6硬幣的例子看成一個大的問題。第一步,把這一問題分成兩個小問題。隨機選擇8個硬幣作為第一組稱為A組,剩下的8個硬幣作為第二組稱為B組。這樣,就把1 6個硬幣的問題分成兩個8硬幣的問題來解決。第二步,判斷A和B組中是否有偽幣。可以利用儀器來比較A組硬幣和B組硬幣的重量。假如兩組硬幣重量相等,則可以判斷偽幣不存在。假如兩組硬幣重量不相等,則存在偽幣,並且可以判斷它位於較輕的那一組硬幣中。最後,在第三步中,用第二步的結果得出原先1 6個硬幣問題的答案。若僅僅判斷硬幣是否存在,則第三步非常簡單。無論A組還是B組中有偽幣,都可以推斷這1 6個硬幣中存在偽幣。因此,僅僅通過一次重量的比較,就可以判斷偽幣是否存在。
現在假設需要識別出這一偽幣。把兩個或三個硬幣的情況作為不可再分的小問題。注意如果只有一個硬幣,那麼不能判斷出它是否就是偽幣。在一個小問題中,通過將一個硬幣分別與其他兩個硬幣比較,最多比較兩次就可以找到偽幣。這樣,1 6硬幣的問題就被分為兩個8硬幣(A組和B組)的問題。通過比較這兩組硬幣的重量,可以判斷偽幣是否存在。如果沒有偽幣,則演算法終止。否則,繼續劃分這兩組硬幣來尋找偽幣。假設B是輕的那一組,因此再把它分成兩組,每組有4個硬幣。稱其中一組為B1,另一組為B2。比較這兩組,肯定有一組輕一些。如果B1輕,則偽幣在B1中,再將B1又分成兩組,每組有兩個硬幣,稱其中一組為B1a,另一組為B1b。比較這兩組,可以得到一個較輕的組。由於這個組只有兩個硬幣,因此不必再細分。比較組中兩個硬幣的重量,可以立即知道哪一個硬幣輕一些。較輕的硬幣就是所要找的偽幣。
【例2】在n個元素中找出最大元素和最小元素。我們可以把這n個元素放在一個數組中,用直接比較法求出。演算法如下:
void maxmin1(int A[],int n,int *max,int *min)
{ int i;
*min=*max=A[0];
for(i=2;i < n;i++)
{ if(A > *max) *max= A;
if(A < *min) *min= A;
}
}
上面這個演算法需比較2(n-1)次。能否找到更好的演算法呢?我們用分治策略來討論。
把n個元素分成兩組:
A1={A[1],...,A[int(n/2)]}和A2={A[INT(N/2)+1],...,A[N]}
分別求這兩組的最大值和最小值,然後分別將這兩組的最大值和最小值相比較,求出全部元素的最大值和最小值。如果A1和A2中的元素多於兩個,則再用上述方法各分為兩個子集。直至子集中元素至多兩個元素為止。
例如有下面一組元素:-13,13,9,-5,7,23,0,15。用分治策略比較的過程如下:
圖中每個方框中,左邊是最小值,右邊是最大值。從圖中看出,用這種方法一共比較了10次,比直接比較法的14次減少4次,即約減少了1/3。演算法如下:
void maxmin2(int A[],int i,int j,int *max,int *min)
/*A存放輸入的數據,i,j存放數據的范圍,初值為0,n-1,*max,int *min 存放最大和最小值*/
{ int mid,max1,max2,min1,min2;
if (j==i) {最大和最小值為同一個數;return;}
if (j-1==i) {將兩個數直接比較,求得最大會最小值;return;}
mid=(i+j)/2;
求i~mid之間的最大最小值分別為max1,min1;
求mid+1~j之間的最大最小值分別為max2,min2;
比較max1和max2,大的就是最大值;
比較min1和min2,小的就是最小值;
}
利用分治策略求解時,所需時間取決於分解後子問題的個數、子問題的規模大小等因素,而二分法,由於其劃分的簡單和均勻的特點,是經常採用的一種有效的方法,例如二分法檢索。運用分治策略解決的問題一般來說具有以下特點:
1、原問題可以分解為多個子問題,這些子問題與原問題相比,只是問題的規模有所降低,其結構和求解方法與原問題相同或相似。
2、原問題在分解過程中,遞歸地求解子問題,由於遞歸都必須有一個終止條件,因此,當分解後的子問題規模足夠小時,應能夠直接求解。
3、在求解並得到各個子問題的解後,應能夠採用某種方式、方法合並或構造出原問題的解。
不難發現,在分治策略中,由於子問題與原問題在結構和解法是的相似性,用分治方法解決的問題,大都採用了遞歸的形式。在各種排序方法中,如歸並排序、堆排序、快速排序等,都存在有分治的思想。

⑥ 演算法與程序設計論文2000字

數學上的演算法已是頭緒紛繁———加法,減法,乘法,除法,平方,開方,對數┉┉一連串的讀下來,已經讓人頭痛,那人生呢?如果我再問你人生的演算法是什麼呢?
人生中種種悲歡離合,喜怒哀樂,復雜至極,但我始終認為,人生的演算法應該是最基礎最平實的加法,是我們每個人對於演算法最初的映象,人生應該是一個加法算試。
做加法,需要我們向人生的算式中加入責任的數值,這是算式最基礎的幾個決定結果「份量」的大數字,你的人生會輸出一個兩位數,三位數還是四位數甚或以上的結果,決定於這個最「壓秤」的數值。
5.12汶川大地震後,網上漸漸開始痛批「范跑跑」,這名「老師」在地震到來時搶先沖出教室不管學生安危的做法激起人們強烈的反感。而當他在網上頗有幾分得意的宣揚那引人唾棄的「正常人都會這么做」理論時,在北川,一位悲慟的婦人正在丈夫靈堂上痛哭失「我聽人說有個老師撲在四個學生身上……死了……我就想可能是你……」這兩位老師,品行高下一望便知,他們人生的最後價值,取決於他們在算式中累加了多少責任,人民教師的職責的份量,使得一個人的生命重於泰山;而另一個,人生的結果只會約等於零。
做加法,還需要我們在算式中累加愛的數值。每一分每一秒的積累,在一個微笑,一次諒解,一個懷抱,一個親吻里尋它的影子,為自己也為他人疊加愛的份量,那麼到最後,當人生演算法即將窮盡時,就一定可以得出愛的真諦與生的喜悅。
哪位先哲說過「無論什麼樣的愛,無論多麼微小和難以察覺,都是偉大的。」在生命中積蘊愛的溫暖,對愛人,對親人,對朋友,乃至對每一朵漂亮的花兒,每一片金黃的葉,每一次的晨曦與晚霞。人生的算式,會有很大的變化,會有更美麗的過程與更深刻的結果。
做加法,不是讓人生加上壓力,金錢,權勢這些「虛數」,而是去發現和探索生活的美好,去恪守和尊重自己的職責,去不斷用真正的「實數」完善,填充這個算式,那麼到生命的盡頭,就會獲得一個很重的結果和一個很輕很輕的美麗心靈。
請嘗試著,在人生中做加法吧!那一個個不起眼的小小加號里,有最深刻的內含和最樸素的美麗。

熱點內容
御龍在天腳本輔助 發布:2025-01-23 11:57:16 瀏覽:886
我的世界電腦版伺服器號碼 發布:2025-01-23 11:57:14 瀏覽:980
小科編程 發布:2025-01-23 11:48:55 瀏覽:673
安卓手機如何禁止未知軟體安裝 發布:2025-01-23 11:47:31 瀏覽:690
腳本我是一 發布:2025-01-23 11:44:27 瀏覽:642
安卓的哈靈麻將哪裡下 發布:2025-01-23 11:26:17 瀏覽:230
全本免費閱讀器在哪緩存 發布:2025-01-23 11:14:54 瀏覽:440
傳輸數據加密 發布:2025-01-23 11:03:20 瀏覽:256
win7文件夾沒有共享 發布:2025-01-23 10:55:43 瀏覽:142
php原鏈接 發布:2025-01-23 10:49:56 瀏覽:515