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

演算法類論文

發布時間: 2022-05-24 20:21:29

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

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

B. 演算法類的論文都能發在哪些的SCI檢索期刊

國內檢索的就知網吧,是最權威的,但是知網也有省級國家級的期刊論文的。看你具體是要找什麼樣子的期刊或者論文,資料庫不單一收錄期刊的。論文發表有問題可以找原上草論文了解。

C. 計算機類論文怎麼寫

作為一個著重研究信息系統開發、應用的專業,計算機畢業論文的寫作應該更貼合實際出來,可能有很多剛拿到題目的學生不知道改如何著手,下面我們就來了解一下計算機畢業論文怎麼寫?

一、計算機畢業論文的寫作方法

1、前言部分

前言部分也常用"引論"、"概論"、"問題背景"等做標題,在這部分中,主要介紹論文的選題。

首先要闡明選題的背景和選題的意義。選題需強調實際背景,說明在計算機研究中或部門信息化建設、企業管理現代化等工作中引發該問題的原因,問題出現的環境和條件,解決該問題後能起什麼作用。結合問題背景的闡述,要使讀者感受到此選題確有實用價值和學術價值,因而有研究和開發的必要性。

前言部分常起到畫龍點睛的作用。選題實際又有新意,表明作者的研究方向正確,設計開發工作有價值。對一篇論文來說,前言寫好了,就會吸引讀者,使他們對作者的選題感興趣,願意進一步了解作者的工作成果。



2、綜述部分

任何一個課題的研究或開發都是有學科基礎或技術基礎的。綜述部分主要闡述選題在相應學科領域中的發展進程和研究方向,特別是近年來的發展趨勢和最新成果。通過與中外研究成果的比較和評論,說明自己的選題是符合當前的研究方向並有所進展,或採用了當前的最新技術並有所改進,目的是使讀者進一步了解選題的意義。

綜述部分能反映出畢業設計學生多方面的能力。首先是結合課題任務獨立查閱中外文獻資料的能力,通過查閱文獻資料,收集各種信息,了解同行的研究水平,在工作和論文中有效地運用文獻,這不僅能避免簡單的重復研究,而且也能使論文工作有一個高起點。

其次,還能反映出綜合分析的能力。從大量的文獻中找到可以借鑒和參考的信息,這不僅要有一定的專業知識水平,還要有一定的綜合能力。對同行研究成果是否能抓住要點,優缺點的評述是否符合實際,恰到好處,這和一個人的分析理解能力是有關的。

值得注意的是,要做好一篇畢業論文,必須閱讀一定量(2~3篇)的近期外文資料,這不僅反映自己的外文閱讀能力,而且有助於體現論文的先進性。

3、方案論證

在明確了所要解決的問題和課題綜述後,很自然地就要提出自己解決問題的思路和方案。在寫作方法上,一是要通過比較,顯示自己方案的價值,二是讓讀者了解方案的獨到之處或有創新點的思路、演算法和關鍵技術。

在與文獻資料中的方案進行比較時,首先要闡述自己的設計方案,說明為什麼要選擇或設計這樣的方案,前面評述的優點在此方案中如何體現,不足之處又是如何得到了克服,最後完成的工作能達到什麼性能水平,有什麼創新之處(或有新意)。如果自己的題目是總方案的一部分,一定要明確說明自己承擔的部分,以及對整個任務的貢獻。

4、論文主體

在這部分中,要將整個研究開發工作的內容,包括理論分析、總體設計、模塊劃分、實現方法等進行詳細的論述。論文主體部分要佔4/5左右。主體部分的寫法,視選題的不同可以多樣,研究型論文和應用開發型論文的寫法就有明顯的不同。

研究型的論文,主體部分一般應包括:理論基礎,數學模型,演算法推導,形式化描述,求解方法,軟硬體系統的實現及調試,測試數據的分析及結論。

要強調的是,研究型論文絕不是從推理到推理的空洞文章。研究型論文也應有實際背景,也應有到企業和實際部門調研的過程,並在實際調查研究中獲取信息,發現問題,收集數據和資料。在研究分析的基礎上,提出解決實際問題的、富有創建性的結論。

應用開發型的論文,主體部分應包括:總體設計,模塊劃分,演算法描述,編程模型,數據結構,實現技術,實例測試及性能分析。

以上內容根據任務所處的階段不同,可以有所側重。在整個任務初期的論文,可側重於研究與設計,在任務後期的論文可側重於實現與應用。但作為一篇完整的論文應讓讀者從課題的原理設計,問題的解決方法,關鍵技術以及性能測試都有全面的了解,以便能准確地評判論文的質量。

論文主體部分的內容一般要分成幾個章節來描述。在寫作上,除了用文字描述外,還要善於利用各種原理圖、流程圖、表格、曲線等來說明問題,一篇條理清晰,圖文並茂的論文才是一篇好的論文。

5、測試及性能分析

對理工專業的畢業設計論文,測試數據是性能評價的基礎,必須真實可靠。通過測試數據,論文工作的成效可一目瞭然。根據課題的要求,可以在實驗室環境下測試,也可以在工作現場測試。

在論文中,要將測試時的環境和條件列出,因為任何測試數據都與測試環境和條件相關,不說明測試條件的數據是不可比的,因此也是無意義的。

測試一般包括功能測試和性能測試。功能測試是將課題完成的計算機軟硬體系統(子系統)或應用系統所要求達到的功能逐一進行測試。性能測試一般是在系統(子系統)的運行狀態下,記錄實例運行的數據,然後,歸納和計算這些數據,以此來分析系統運行的性能。

測試實例可以自己設計編寫,也可以選擇學科領域內公認的、有一定權威性的測試實例或測試集。原則是通過所選擇(設計)的實例的運行,既能准確反映系統運行的功能和性能,與同類系統又有可比性。只有這樣,論文最後為自己工作所做的結論才有說服力。

6、結束語

這一節篇幅不大,首先對整個論文工作做一個簡單小結,然後將自己在研究開發工作中所做的貢獻,或獨立研究的成果列舉出來,再對自己工作的進展、水平做一個實事求是的評論。但在用"首次提出"、"重大突破"、"重要價值"等自我評語時要慎重。

7、後記

在後記中,主要表達對導師和其他有關教師和同學的感謝之意。對此,仍要實事求是,過分的頌揚反而會帶來消極影響。這一節也可用"致謝"做標題。

8、參考文獻

中外文的參考文獻應按照規范列舉在論文最後。這一部分的編寫反映作者的學術作風。編寫參考文獻要注意:(1)要嚴格按照規范編寫,特別是外文文獻,不要漏寫、錯寫;(2)論文內容和參考文獻要前後對應,正文中凡引用參考文獻的地方應加註;(3)列出的文獻資料應與論文課題相關,無關的文獻只會使讀者感到作者的研究目標很分散;(4)選擇的參考文獻應主要是近期的。

二、計算機寫作注意事項

1、設計(論文)題目:按照小題目。封面XXXXX學院畢業設計(論文)、 屆 分院(系)

2、摘要:不要主語,英文中無法表達時可用被動語態

3、關鍵詞:體現設計(論文)主要工作的詞語

4、目錄:自動生成,1.1.1的格式,最多到1.1.1.1 5、正文中文獻引用要客觀,別人的成果要說明,不要據為己有;自己的成果要突出。不清楚的圖必須修改(可用word畫或者AutoCAD畫),表格盡量採用三線表

6、參考文獻:至少要有兩篇英文文獻

7、致謝(不是致辭)

8、附錄(若多於一個附錄,可用附錄一、附錄二,……)

9、各部分格式要求,嚴格按照畢業設計手冊執行

三、計算機論文編輯技巧

1、文檔結構圖的妙用 格式修改時可先將全文設置為正文格式(新羅馬與宋體的博弈),然後將三級標題以上標題按照三級標題提出來,再將二級標題以上標題按照二級標題提出來,最後將一級標題提出來。提出標題時注意使用大綱級別。 提出大綱級別後,可用文檔結構圖輕松導航文檔。還可自動生成目錄(插入-引用-索引和目錄-目錄)。

2、圖的裁剪與組合(建議採用浮於文字上方的方式)、文本框的妙用、公式的編輯(變數用斜體、下標用的i、j、k用斜體,其餘用正體。公式中出現漢字怎麼辦?用拼音加加輸入法輸入漢字)

3、表格的編輯

4、上下標的使用(自定義word菜單)

5、分節符的使用

6、目錄自動生成(頁碼的問題),目錄可單獨取文件名(寫字板的運用),也可放到正文前面

7、樣式與格式的自動更新功能

8、頁眉設置(去掉橫線)

9、文檔的備份(防止病毒感染、U盤丟失、計算機故障)

D. 如何在半個月內發表至少兩篇計算機演算法類論文,有沒有什麼推薦的

你好,你是要發表學術論文?時間緊張,可以考慮發表《信息與電腦》雜志《計算機關盤軟硬與應用》雜志 但是半月之內 肯定是拿不到書的,最起碼的等兩個月左右。

E. 有哪些計算機演算法技術領域的論文資料

計算機學術論文是學術論文的一種。計算機學術論文的一般格局是:
(一)題目。題目是論文的窗戶,它應是論文內容的高度概括。好的論文題目能大體反映出作者研究的方向、成果、內容、意義。題目引用語要確切、簡潔、精煉、通俗和新穎。確定題目時,題目要專一,開掘要透,道理要深,立意要新。
(二)內容提要。就是將文章的主要內容簡要地概括出來,使讀者了解論文概貌,以確定其有無閱讀價值。提要以二三百字為宜,不要過長。一般較短的論文(三千字以下)可不寫提要。
(三)緒論(引論、引言、前言、序言)。概述研究該課題的動機,目的、意義和主要方法,指出前人或旁人做了哪些工作,進展到何種程度,哪些尚未解決,說明自己研究這個問題的主要成果和貢獻。這部分佔比例要小,起簡介作用。文字要簡潔、明確、具體,使人看到緒論,就知道本文的基本價值。
(四)本論(正文)。這部分佔論文的絕大部分篇幅,具有極其重要的地位,是作者表達研究成果的部分。這部分的關鍵在於論證,即證明作者所提出的論題。這里包括課題的提出,對解決問題的設想、研究過程(研究中出現的問題及解決問題的方法。手段、主要數據)、研究結果等。寫這部分要注意理論的運用和邏輯推理,注意段與段之間的過渡銜接,注意主次,抓住本質。如果內容多,可加小標題。也可使用由大到小的不同序碼。
(五)結論。是整個研究的結晶,是論證得到的結果,即對本論進行分析、比較、歸納、綜合、概括而得出的結論,審視整個課題的答案。寫結論時,措詞要嚴謹,邏輯要嚴密,文字要簡明具體,使讀者看到作者的獨到見解。不得使用「大概」、「可能」之類含混不清的字眼。不能得出明確結論時,要說明有待進一步探討。
(六)參考文獻。在文章的最後註明寫作論文時所參考的文獻;引用別人原話或原文時還需註明出處,以便查找。這樣做反映作者科學態度和求實精神,表示作者對他人成果的尊重。

F. 演算法類論文一定要做實驗嗎

不一定非要用實驗。
論文並不一定需要做實驗來驗證。但是,一定要有一定的依據和想法,只有這樣才能夠讓人覺得這篇論文有一定的可行性,從而讓別人認可和欣賞這篇論文。不然的話,既沒有實驗證實,也沒有一定的依據,那寫出來的論文,別人也是不會欣賞的。

G. 演算法的應用類論文怎麼寫

參考各個排序演算法的優缺點,即各種排序的計算復雜度,以及最好情況,最壞情況,平均情況下的分析吧。

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

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

I. 求演算法相關的論文

史豐收計演算法
演練實例一







Example
of
Rapid
Calculation
in
Practice
○史豐收速演算法易學易用,演算法是從高位數算起,記著史教授總結了的26句口訣(這些口訣不需死背,而是合乎科學規律,相互連系),用來表示一位數乘多位數的進位規律,掌握了這些口訣和一些具體法則,就能快速進行加、減、乘、除、乘方、開方、分數、函數、對數…等運算。
□本文針對乘法舉例說明
○速演算法和傳統乘法一樣,均需逐位地處理乘數的每位數字,我們把被乘數中正在處理的那個數位稱為「本位」,而從本位右側第一位到最末位所表示的數稱「後位數」。本位被乘以後,只取乘積的個位數,此即「本個」,而本位的後位數與乘數相乘後要進位的數就是「後進」。
○乘積的每位數是由「本個加後進」和的個位數即--
□本位積=(本個十後進)之和的個位數
○那麼我們演算時要由左而右地逐位求本個與後進,然後相加再取其個位數。現在,就以右例具體說明演算時的思維活動。
(例題)
被乘數首位前補0,列出算式:
0847536×2=1695072
乘數為2的進位規律是「2滿5進1」
0×2本個0,後位8,後進1,得1
8×2本個6,後位4,不進,得6
4×2本個8,後位7,滿5進1,
8十1得9
7×2本個4,後位5,滿5進1,
4十1得5
5×2本個0,後位3不進,得0
3×2本個6,後位6,滿5進1,
6十1得7
6×2本個2,無後位,得2
在此我們只舉最簡單的例子供讀者參考,至於乘3、4……至乘9也均有一定的進位規律,限於篇幅,在此未能一一羅列。
「史豐收速演算法」即以這些進位規律為基礎,逐步發展而成,只要運用熟練,舉凡加減乘除四則多位數運算,均可達到快速准確的目的。

J. 寫一篇《論演算法設計中的分治與增量》的學術論文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、在求解並得到各個子問題的解後,應能夠採用某種方式、方法合並或構造出原問題的解。
不難發現,在分治策略中,由於子問題與原問題在結構和解法是的相似性,用分治方法解決的問題,大都採用了遞歸的形式。在各種排序方法中,如歸並排序、堆排序、快速排序等,都存在有分治的思想。

熱點內容
浙江伺服器dns地址雲空間 發布:2024-10-27 03:31:19 瀏覽:676
編譯器的讀音 發布:2024-10-27 03:31:11 瀏覽:473
逆水寒和魔獸哪個配置高 發布:2024-10-27 03:30:35 瀏覽:907
java可變長度數組 發布:2024-10-27 03:30:35 瀏覽:400
linux查詢命令的版本 發布:2024-10-27 03:24:38 瀏覽:976
編程3次方 發布:2024-10-27 03:19:48 瀏覽:19
如何提取手機緩存視頻 發布:2024-10-27 02:55:26 瀏覽:370
php二維數組求和 發布:2024-10-27 02:53:56 瀏覽:734
c語言如何被編譯器編成可執行 發布:2024-10-27 02:33:27 瀏覽:555
解壓蜂巢 發布:2024-10-27 02:32:45 瀏覽:184