人的記憶力會(huì)隨著歲月的流逝而衰退,,寫作可以彌補(bǔ)記憶的不足,將曾經(jīng)的人生經(jīng)歷和感悟記錄下來,,也便于保存一份美好的回憶,。范文書寫有哪些要求呢,?我們怎樣才能寫好一篇范文呢?接下來小編就給大家介紹一下優(yōu)秀的范文該怎么寫,,我們一起來看一看吧,。
數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析論文篇一
070401301507計(jì)本(3)班張浩
本學(xué)期開設(shè)的《數(shù)據(jù)結(jié)構(gòu)與算法》課程已經(jīng)告一段落,現(xiàn)就其知識(shí)點(diǎn)及其掌握情況,、學(xué)習(xí)體會(huì)以及對(duì)該門課程的教學(xué)建議等方面進(jìn)行學(xué)習(xí)總結(jié),。
一、《數(shù)據(jù)結(jié)構(gòu)與算法》知識(shí)點(diǎn)
在課本的第一章便交代了該學(xué)科的相關(guān)概念,,如數(shù)據(jù),、數(shù)據(jù)元素、數(shù)據(jù)類型以及數(shù)據(jù)結(jié)構(gòu)的定義,。其中,,數(shù)據(jù)結(jié)構(gòu)包括邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)和運(yùn)算集合,。邏輯結(jié)構(gòu)分為四類:集合型,、線性、樹形和圖形結(jié)構(gòu),,數(shù)據(jù)元素的存儲(chǔ)結(jié)構(gòu)分為:順序存儲(chǔ),、鏈接存儲(chǔ),、索引存儲(chǔ)和散列存儲(chǔ)四類。緊接著介紹了一些常用的數(shù)據(jù)運(yùn)算,。最后著重介紹算法性能分析,,包括算法的時(shí)間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的概念,、基本運(yùn)算及其應(yīng)用,。基本運(yùn)算有:初始化表,、求表長,、排序、元素的查找,、插入及刪除等,。元素查找方法有:簡單順序查找、二分查找和分塊查找,。排序方法有:直接插入排序,、希爾排序、冒泡排序,、快速排序,、直接選擇排序及歸并排序等。最后介紹了順序串的概念,,重點(diǎn)在于串的模式匹配,。
鏈表中數(shù)據(jù)元素的存儲(chǔ)不一定是連續(xù)的,還可以占用任意的,、不連續(xù)的物理存儲(chǔ)區(qū)域,。與順序表相比,鏈表的插入,、刪除不需要移動(dòng)元素,,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節(jié)點(diǎn)結(jié)構(gòu),、靜態(tài)與動(dòng)態(tài)鏈表的概念,、鏈表的基本運(yùn)算(如求表長、插入,、查找,、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環(huán)鏈表的定義,、結(jié)構(gòu),、功能和基本算法。
堆棧與隊(duì)列是兩種運(yùn)算受限制的線性結(jié)構(gòu),。其基本運(yùn)算方法與順序表和鏈表運(yùn)算方法基本相同,,不同的是堆棧須遵循“先進(jìn)后出”的規(guī)則,,對(duì)堆棧的操作只能在棧頂進(jìn)行;而隊(duì)列要遵循“先進(jìn)先出”的規(guī)則,,教材中列出了兩種結(jié)構(gòu)的相應(yīng)算法,,如入棧、出棧,、入隊(duì),、出隊(duì)等。在介紹隊(duì)列時(shí),,提出了循環(huán)隊(duì)列的概念,,以避免“假溢出”的現(xiàn)象,。
第六章介紹了特殊矩陣和廣義表的概念與應(yīng)用,。其中,,特殊矩陣包括對(duì)稱矩陣、三角矩陣,、對(duì)角矩陣和稀疏矩陣,,書中分別詳細(xì)介紹了它們的存儲(chǔ)結(jié)構(gòu)。稀疏矩陣的應(yīng)用包括轉(zhuǎn)置和加法運(yùn)算等,。最后介紹了廣義表的相關(guān)概念及存儲(chǔ)結(jié)構(gòu),關(guān)于它的應(yīng)用,,課本中舉了m元多項(xiàng)式的表示問題,。
第七章二叉樹的知識(shí)是重點(diǎn)內(nèi)容。在介紹有關(guān)概念時(shí),,提到了二叉樹的性質(zhì)以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹,。接著介紹二叉樹的順序存儲(chǔ)和鏈接存儲(chǔ)以及生成算法。重點(diǎn)介紹二叉樹的遍歷算法(遞歸算法,、先序,、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應(yīng)用:基本算法,、哈弗曼樹,、二叉排序樹和堆排序。
樹與二叉樹是不同的概念,。教材介紹了樹和森林的概念、遍歷和存儲(chǔ)結(jié)構(gòu),,還有樹,、森林和二叉樹的相互關(guān)系,樹或森林怎樣轉(zhuǎn)化成二叉樹,,二叉樹又如何轉(zhuǎn)換為樹和森林等算法,。散列結(jié)構(gòu)是一種查找效率很高的一種數(shù)據(jù)結(jié)構(gòu)。本章的主要知識(shí)點(diǎn)有:散列結(jié)構(gòu)的概念及其存儲(chǔ)結(jié)構(gòu),、散列函數(shù),、兩種沖突處理方法、線性探測散列和鏈地址散列的基本算法以及散列結(jié)構(gòu)的查找性能分析,。
最后一章介紹了圖的概念及其應(yīng)用,,是本書的難點(diǎn)。圖的存儲(chǔ)結(jié)構(gòu)的知識(shí)點(diǎn)有:鄰接矩陣,、鄰接表,、逆鄰接表、十字鏈表和鄰接多重表,。圖的遍歷包括圖的深度優(yōu)先搜索遍歷和廣度優(yōu)先搜索遍歷,。其余知識(shí)點(diǎn)有:有向圖、連通圖,、生成樹和森林,、最短路徑問題和有向無環(huán)圖及其應(yīng)用。有向無環(huán)圖重點(diǎn)理解aov網(wǎng)和拓?fù)渑判蚣捌渌惴ā?/p>
二,、對(duì)各知識(shí)點(diǎn)的掌握情況
總體來看,,對(duì)教材中的知識(shí)點(diǎn)理解較為完善,但各個(gè)章節(jié)均出現(xiàn)有個(gè)別知識(shí)點(diǎn)較為陌生的現(xiàn)象?,F(xiàn)將各個(gè)章節(jié)出現(xiàn)的知識(shí)點(diǎn)理解情況列舉如下,。
第一章中我對(duì)數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)的概念理解較為透徹,熟悉數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu),。而對(duì)算法的時(shí)間,、空間性能分析較為模糊,尤其是空間性能分析需要加強(qiáng),。
第二章,,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,,對(duì)分塊查找較為含糊,;排序問題中,由于冒泡排序在大一c語言課上已經(jīng)學(xué)習(xí)過,,再來學(xué)習(xí)感覺很輕松,。對(duì)插入排序和選擇排序理解良好,但是,,在實(shí)際運(yùn)用中仍然出現(xiàn)明顯不熟練的現(xiàn)象,。由于在歸并排序?qū)W習(xí)中感覺較吃力,現(xiàn)在對(duì)這種排序方法仍然非常模糊,,所以需要花較多的時(shí)間來補(bǔ)習(xí),。此外串的模式匹配也是較難理解的一個(gè)地方。
鏈表這一章中,,除對(duì)雙向循環(huán)鏈表這一知識(shí)點(diǎn)理解困難之外,,其他的知識(shí)點(diǎn)像單鏈表的建立和基本算法等都較為熟悉。
接下來的有關(guān)堆棧以及隊(duì)列的知識(shí)點(diǎn)比較少,,除有關(guān)算法較為特殊以外,,其余算法都是先前學(xué)過的順序表和鏈表的知識(shí),加上思想上較為重視,,因此這部分內(nèi)容是我對(duì)全書掌握最好的一部分,。不足之處仍然表現(xiàn)在算法的性能分析上。
在學(xué)習(xí)第六章時(shí)感覺較為吃力的部分在于矩陣的應(yīng)用上,,尤其對(duì)矩陣轉(zhuǎn)置算法的c語言描述不太理解,。稀疏矩陣相加算法中,用三元組表實(shí)現(xiàn)比較容易理解,,對(duì)十字鏈表進(jìn)行矩陣相加的方法較為陌生,。
第七章是全書的重點(diǎn),卻也有一些內(nèi)容沒有完全理解,。在第一節(jié)基本概念中,二叉樹的性質(zhì)容易懂卻很難記憶,。對(duì)二叉樹的存儲(chǔ)結(jié)構(gòu)和遍歷算法這部分內(nèi)容掌握較好,,能夠熟練運(yùn)用,而對(duì)于二叉樹應(yīng)用中的哈弗曼樹卻比較陌生,。
第八章內(nèi)容較少,,牽涉到所學(xué)的隊(duì)列的有關(guān)內(nèi)容,總體來說理解上沒有什么困難,,問題依舊出現(xiàn)在算法的性能分析上,。
散列結(jié)構(gòu)這一章理解比較完善的知識(shí)點(diǎn)有:基本概念和存儲(chǔ)結(jié)構(gòu)。散列函數(shù)中直接定址法和除留余數(shù)法學(xué)得比較扎實(shí),,對(duì)數(shù)字分析法等方法則感覺較為陌生,。對(duì)兩種沖突處理的算法思想的理解良好,,問題在于用c語言描述上。
最后一章,,圖及其應(yīng)用中,,圖的定義、基本運(yùn)算如圖的生成等起初理解有困難,,但隨著學(xué)習(xí)深入,,對(duì)它的概念也逐步明朗起來。鄰接矩陣,、鄰接表和逆鄰接表掌握較好,,而對(duì)十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內(nèi)容還有圖的遍歷(包括深度和廣度優(yōu)先遍歷),,最小生成樹問題也是比較陌生的知識(shí)點(diǎn),。最短路徑和aov網(wǎng)學(xué)習(xí)起來感覺比較輕松,而對(duì)于c語言描述卻又不大明白,。
三,、學(xué)習(xí)體會(huì)
接觸這門課程以前,我對(duì)該課程所學(xué)的內(nèi)容有許多疑點(diǎn),,例如:這門課是否是在介紹一種新的計(jì)算機(jī)語言,?如果不是,那么學(xué)習(xí)這門課程的用途是什么,?為什么市面上各種介紹數(shù)據(jù)結(jié)構(gòu)的資料采用了不同的計(jì)算機(jī)語言,,如c、c++還有java,?我的c語言學(xué)得不好,,對(duì)學(xué)習(xí)這門課是否有影響??
在學(xué)習(xí)伊始,老師就明確提出它不是一種計(jì)算機(jī)語言,,不會(huì)介紹新的關(guān)鍵詞,,而是通過學(xué)習(xí)可以設(shè)計(jì)出良好的算法,高效地組織數(shù)據(jù),。一個(gè)程序無論采用何種語言,,其基本算法思想不會(huì)改變。聯(lián)系到在大一和大二上學(xué)期學(xué)習(xí)的c和c++語言,,我深刻認(rèn)識(shí)到了這一點(diǎn),。“軟件開發(fā)好比寫作文,,計(jì)算機(jī)語言提供了許多華麗的辭藻,,而數(shù)據(jù)結(jié)構(gòu)則考慮如何將這些辭藻組織成一篇優(yōu)秀的文章來。”在學(xué)習(xí)這門課中,,要熟悉對(duì)算法思想的一些描述手段,,包括文字描述、圖形描述和計(jì)算機(jī)語言描述等,。因此,,計(jì)算機(jī)語言基礎(chǔ)是必須的,因?yàn)樗峁┝艘环N重要的算法思想描述手段——機(jī)器可識(shí)別的描述,。
這門課結(jié)束之后,,我總結(jié)了學(xué)習(xí)中遇到的一些問題,最為突出的,,書本上的知識(shí)與老師的講解都比較容易理解,,但是當(dāng)自己采用剛學(xué)的知識(shí)點(diǎn)編寫程序時(shí)卻感到十分棘手,有時(shí)表現(xiàn)在想不到適合題意的算法,,有時(shí)表現(xiàn)在算法想出來后,,只能將書本上原有的程序段謄寫到
自己的程序中再加以必要的連接以完成程序的編寫。針對(duì)這一情況,,我會(huì)嚴(yán)格要求自己,,熟練掌握算法思想,盡量獨(dú)立完成程序的編寫與修改工作,,只有這樣,,才能夠提高運(yùn)用知識(shí),解決問題的能力,。
四,、對(duì)《數(shù)據(jù)結(jié)構(gòu)與算法》課程教學(xué)的建議
1、建議在上課過程中加大隨堂練習(xí)的分量,,以便學(xué)生能當(dāng)堂消化課堂上學(xué)習(xí)的知識(shí),,也便于及時(shí)了解學(xué)生對(duì)知識(shí)點(diǎn)的掌握情況,同時(shí)有助于學(xué)生保持良好的精神狀態(tài),。
2,、建議在課時(shí)允許的情況下,增加習(xí)題課的分量,,通過課堂的習(xí)題講解,,加深對(duì)知識(shí)點(diǎn)的掌握,同時(shí)對(duì)各知識(shí)點(diǎn)的運(yùn)用有一個(gè)更為直觀和具體的認(rèn)識(shí),。
以上便是我對(duì)《數(shù)據(jù)結(jié)構(gòu)與算法》這門課的學(xué)習(xí)總結(jié),我會(huì)抓緊時(shí)間將沒有吃透的知識(shí)點(diǎn)補(bǔ)齊,。今后我仍然會(huì)繼續(xù)學(xué)習(xí),,克服學(xué)習(xí)中遇到的難關(guān),在打牢基礎(chǔ)的前提下向更深入的層面邁進(jìn)!
數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析論文篇二
《數(shù)據(jù)結(jié)構(gòu)與算法》課程學(xué)習(xí)總結(jié)報(bào)告
100401200510計(jì)本(4)班章興春
本學(xué)期所學(xué)習(xí)的《數(shù)據(jù)結(jié)構(gòu)與算法》課程已經(jīng)告一段落,,就其知識(shí)點(diǎn)及其掌握情況,、學(xué)習(xí)體會(huì)以及對(duì)該門課程的教學(xué)建議等方面進(jìn)行學(xué)習(xí)總結(jié)。以便在所學(xué)習(xí)知識(shí)有更深刻的認(rèn)識(shí),。
一,、《數(shù)據(jù)結(jié)構(gòu)與算法》知識(shí)點(diǎn):
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)之前、一直以為數(shù)據(jù)結(jié)構(gòu)是一門新的語言,、后來才知道學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是為了更加高效的的組織數(shù)據(jù),、設(shè)計(jì)出良好的算法,而算法則是一個(gè)程序的靈魂,。經(jīng)過了一學(xué)期的數(shù)據(jù)結(jié)構(gòu)了,,在期末之際對(duì)其進(jìn)行總結(jié)。首先,,學(xué)完數(shù)據(jù)結(jié)構(gòu)我們應(yīng)該知道數(shù)據(jù)結(jié)構(gòu)講的是什么,,數(shù)據(jù)結(jié)構(gòu)課程主要是研究非數(shù)值計(jì)算的研究的程序設(shè)計(jì)問題中所出現(xiàn)的計(jì)算機(jī)處理對(duì)象以及它們之間關(guān)系和操作的學(xué)科。
第一章主要介紹了相關(guān)概念,,如數(shù)據(jù),、數(shù)據(jù)元素、數(shù)據(jù)類型以及數(shù)據(jù)結(jié)構(gòu)的定義,。其中,,數(shù)據(jù)結(jié)構(gòu)包括邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)和運(yùn)算集合,。邏輯結(jié)構(gòu)分為四類:集合型,、線性、樹形和圖形結(jié)構(gòu),,數(shù)據(jù)元素的存儲(chǔ)結(jié)構(gòu)分為:順序存儲(chǔ),、鏈接存儲(chǔ)、索引存儲(chǔ)和散列存儲(chǔ)四類,。最后著重介紹算法性能分析,,包括算法的時(shí)間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的定義,、特點(diǎn)及其主要操作,,如查找、插入和刪除的實(shí)現(xiàn),。需要掌握對(duì)它們的性能估計(jì),。包括查找算法的平均查找長度,插入與刪除算法中的對(duì)象平均移動(dòng)次數(shù),。
鏈表中數(shù)據(jù)元素的存儲(chǔ)不一定是連續(xù)的,,還可以占用任意的,、不連續(xù)的物理存儲(chǔ)區(qū)域。與順序表相比,,鏈表的插入,、刪除不需要移動(dòng)元素,給算法的效率帶來較大的提高,。鏈表這一章中介紹了鏈表的節(jié)點(diǎn)結(jié)構(gòu),、靜態(tài)與動(dòng)態(tài)鏈表的概念、鏈表的基本運(yùn)算(如求表長,、插入,、查找、刪除等),、單鏈表的建立(頭插法和尾插法)以及雙向循環(huán)鏈表的定義,、結(jié)構(gòu)、功能和基本算法,。
第三章介紹了堆棧與隊(duì)列這兩種運(yùn)算受限制的線性結(jié)構(gòu),。其基本運(yùn)算方法與順序表和鏈表運(yùn)算方法基本相同,不同的是堆棧須遵循“先進(jìn)后出”的規(guī)則,,對(duì)堆棧的操作只能在棧頂進(jìn)行,;而隊(duì)列要遵循“先進(jìn)先出”的規(guī)則,教材中列出了兩種結(jié)構(gòu)的相應(yīng)算法,,如入棧,、出棧、入隊(duì),、出隊(duì)等,。在介紹隊(duì)列時(shí),提出了循環(huán)隊(duì)列的概念,,以避免“假溢出”的現(xiàn)象,。算法上要求掌握進(jìn)棧,、退棧,、取棧頂元素,、判棧空盒置空棧等五種操作及掌握使用元素個(gè)數(shù)計(jì)數(shù)器及少用一個(gè)元素空間來區(qū)分隊(duì)列空,、隊(duì)列滿的方法,。
第四章串和數(shù)組中,我們知道串是一種特殊的線性表,,是由零個(gè)或多個(gè)任意字符組成的字符序列,。串的儲(chǔ)存結(jié)構(gòu)分為緊縮模式和非緊縮模式。
基本運(yùn)算需掌握求串長,、串賦值,、連接操作,、求子串、串比較,、串定位、串插入,、串刪除,、串替換等。
第五章二叉樹的知識(shí)是重點(diǎn)內(nèi)容,。在介紹有關(guān)概念時(shí),,提到了二叉樹的性質(zhì)以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲(chǔ)和鏈接存儲(chǔ)以及生成算法,。重點(diǎn)介紹二叉樹的遍歷算法(遞歸算法,、先序、中序和后序遍歷非遞歸算法)和線索二叉樹,。二叉樹的應(yīng)用:基本算法,、哈弗曼樹、二叉排序樹和堆排序,。
樹與二叉樹是不同的概念,。教材介紹了樹和森林的概念、遍歷和存儲(chǔ)結(jié)構(gòu),,還有樹,、森林和二叉樹的相互關(guān)系,樹或森林怎樣轉(zhuǎn)化成二叉樹,,二叉樹又如何轉(zhuǎn)換為樹和森林等算法,。
第六章介紹了圖的概念及其應(yīng)用,圖的存儲(chǔ)結(jié)構(gòu)的知識(shí)點(diǎn)有:鄰接矩陣,、鄰接表,、逆鄰接表、十字鏈表和鄰接多重表,。圖的遍歷包括圖的深度優(yōu)先搜索遍歷和廣度優(yōu)先搜索遍歷,。其余知識(shí)點(diǎn)有:有向圖、連通圖,、生成樹和森林,、最短路徑問題和有向無環(huán)圖及其應(yīng)用。有向無環(huán)圖重點(diǎn)理解aov網(wǎng)和拓?fù)渑判蚣捌渌惴ā?/p>
最后兩章集體說明了查找和排序算法,,查找教材上介紹了靜態(tài)查找表和哈希查找表,,靜態(tài)查找表中介紹了順序查找、折半查找以及分塊查找,。哈希法中,,學(xué)習(xí)要點(diǎn)包括哈希函數(shù)的比較,;解決地址沖突的線性探查法的運(yùn)用,平均探查次數(shù),;解決地址沖突的二次哈希法的運(yùn)用,。
排序是使用最頻繁的一類算法,可分為內(nèi)部排序和外部排序,。主要需要理解排序的基本概念,,在算法上、需要掌握插入排序(包括直接插入排序算法,、折半插入排序算法),,交換排序(包括冒泡排序算法、快速排序遞歸算法),選擇排序(包括直接選擇排序算法,、堆排序算法)等,。
二、對(duì)各知識(shí)點(diǎn)的掌握情況
總體來看,,對(duì)教材中的知識(shí)點(diǎn)理解較為完善,,但各個(gè)章節(jié)均出現(xiàn)有個(gè)別知識(shí)點(diǎn)較為陌生的現(xiàn)象。現(xiàn)將各個(gè)章節(jié)出現(xiàn)的知識(shí)點(diǎn)理解情況列舉如下,。
第一章中我對(duì)數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)的概念理解較為透徹,,熟悉數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)。而對(duì)算法的時(shí)間,、空間性能分析較為模糊,,尤其是空間性能分析需要加強(qiáng)。
第二章,,順序表的概念,、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,,對(duì)分塊查找較為含糊,;排序問題中,由于冒泡排序在大一c語言課上已經(jīng)學(xué)習(xí)過,,再來學(xué)習(xí)感覺很輕松,。對(duì)插入排序和選擇排序理解良好,但是,,在實(shí)際運(yùn)用中仍然出現(xiàn)明顯不熟練的現(xiàn)象,。由于在歸并排序?qū)W習(xí)中感覺較吃力,現(xiàn)在對(duì)這種排序方法仍然非常模糊,,所以需要花較多的時(shí)間來補(bǔ)習(xí),。此外串的模式匹配也是較難理解的一個(gè)地方。
鏈表這一章中,,除對(duì)雙向循環(huán)鏈表這一知識(shí)點(diǎn)理解困難之外,,其他的知識(shí)點(diǎn)像單鏈表的建立和基本算法等都較為熟悉,。
接下來的有關(guān)堆棧以及隊(duì)列的知識(shí)點(diǎn)比較少,除有關(guān)算法較為特殊以外,,其余算法都是先前學(xué)過的順序表和鏈表的知識(shí),,加上思想上較為重視,因此這部分內(nèi)容是我對(duì)全書掌握最好的一部分,。不足之處仍然表現(xiàn)在算法的性能分析上,。
在學(xué)習(xí)第六章時(shí)感覺較為吃力的部分在于矩陣的應(yīng)用上,尤其對(duì)矩陣轉(zhuǎn)置算法的c語言描述不太理解,。稀疏矩陣相加算法中,用三元組表實(shí)現(xiàn)比較容易理解,,對(duì)十字鏈表進(jìn)行矩陣相加的方法較為陌生,。
第七章是全書的重點(diǎn),卻也有一些內(nèi)容沒有完全理解,。在第一節(jié)基本概念中,,二叉樹的性質(zhì)容易懂卻很難記憶。對(duì)二叉樹的存儲(chǔ)結(jié)構(gòu)和遍歷算法這部分內(nèi)容掌握較好,,能夠熟練運(yùn)用,,而對(duì)于二叉樹應(yīng)用中的哈弗曼樹卻比較陌生。
第八章內(nèi)容較少,,牽涉到所學(xué)的隊(duì)列的有關(guān)內(nèi)容,,總體來說理解上沒有什么困難,問題依舊出現(xiàn)在算法的性能分析上,。
散列結(jié)構(gòu)這一章理解比較完善的知識(shí)點(diǎn)有:基本概念和存儲(chǔ)結(jié)構(gòu),。散列函數(shù)中直接定址法和除留余數(shù)法學(xué)得比較扎實(shí),對(duì)數(shù)字分析法等方法則感覺較為陌生,。對(duì)兩種沖突處理的算法思想的理解良好,,問題在于用c語言描述上。
最后一章,,圖及其應(yīng)用中,,圖的定義、基本運(yùn)算如圖的生成等起初理解有困難,,但隨著學(xué)習(xí)深入,,對(duì)它的概念也逐步明朗起來。鄰接矩陣,、鄰接表和逆鄰接表掌握較好,,而對(duì)十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內(nèi)容還有圖的遍歷(包括深度和廣度優(yōu)先遍歷),,最小生成樹問題也是比較陌生的知識(shí)點(diǎn),。最短路徑和aov網(wǎng)學(xué)習(xí)起來感覺比較輕松,,而對(duì)于c語言描述卻又不大明白。
由于平時(shí)上機(jī)練習(xí)的少,,對(duì)于教材中很多算法都掌握的不是很熟悉,、不過這些都是可以彌補(bǔ)的,我會(huì)在剩下的時(shí)間中不斷練習(xí)書上給出的算法和練習(xí),,正如教材上說的,,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),僅從書本上學(xué)習(xí)是不夠的,,必須經(jīng)過大量的程序設(shè)計(jì)實(shí)踐,,在實(shí)踐中體會(huì)構(gòu)造性思維方法,掌握數(shù)據(jù)組織與程序設(shè)計(jì)技術(shù),。
三,、學(xué)習(xí)體會(huì):
多做實(shí)驗(yàn)!這個(gè)就沒有太多理由了,,我一直覺得編程是一門熟練科學(xué),,多編程,水平肯定會(huì)提高,,最重要的是能夠養(yǎng)成一種感覺,,就是對(duì)程序?qū)λ惴ǖ拿舾校瑸槭裁茨切┡H丝匆粋€(gè)算法一下子就看懂了,?而自己要看很久才能弄懂,,而且弄懂了過了一陣子又忘記了?其實(shí)這個(gè)是因?yàn)榕H藗円郧翱吹某绦蚝芏?,編得也很多,,所以他們有了那種感覺,所以我覺得大家應(yīng)該多看程序,,多寫程序,,培養(yǎng)自己的感覺。
復(fù)習(xí)和考試的技巧,,我想大家應(yīng)該都有這樣的感覺,,就是覺得自己什么都掌握了,但是在考試的時(shí)候就是會(huì)犯暈,,有時(shí)候一出考場就知道錯(cuò)在哪個(gè)了,,然后考完以后一對(duì)答案,發(fā)現(xiàn)其實(shí)考得很簡單,,應(yīng)該都是自己會(huì)做的,,這個(gè)就是與自己的復(fù)習(xí)和考試的技巧有關(guān)系了。
首先就是復(fù)習(xí),前面已經(jīng)說過其實(shí)我們學(xué)的算法也就是幾十個(gè),,那么我們的任務(wù)也就是理解這幾十個(gè)算法,,復(fù)習(xí)也就是要加深你的理解。如何理解算法,,然后理解到什么程度呢,? 是能默出整個(gè)算法嗎?其實(shí)不是這樣的,,數(shù)據(jù)結(jié)構(gòu)的考試有它的特點(diǎn),,考過程考試了,大家應(yīng)該都發(fā)現(xiàn)數(shù)據(jù)結(jié)構(gòu)其實(shí)不要求你把整個(gè)算法背出來,,它注重考察你的理解,,那么怎么考察呢?其實(shí)也就是兩種方式吧,,一種就是用實(shí)例,,就是給你一個(gè)例子,要你用某個(gè)算法運(yùn)行出結(jié)果,,我想這個(gè)期末考試的時(shí)候仍然會(huì)有很多這樣的題目,比如排序那塊就很好出這樣的題目,,要復(fù)習(xí)這種題目我覺得很簡單,,就是每個(gè)算法都自己用例子去實(shí)踐一下,以不變應(yīng)萬變,,我期中復(fù)習(xí)的時(shí)候就是這樣去做的,,而且考試之前我就覺得那個(gè)并查集的題目就很有可能會(huì)考,于是就自己出了幾個(gè)例子,,做了一下,。另外一種考察方式就是算法填空和算法改錯(cuò),可能有一些同學(xué)覺得這種題目很難,,其實(shí)我們首先可以確定這兩種題目肯定是與書上算法有關(guān)系的,,只要理解了書上的算法就可以了,有人覺得看完書以后什么都懂了,,而且要默也默得出來,,其實(shí)不是這樣的,算法改錯(cuò)和填空主要是考察的細(xì)微處,,雖然你覺得你默得出來,,那是能夠默出算法的主體部分,很多細(xì)微的地方你就會(huì)很容易忽略,。我想大家考過期中考以后應(yīng)該都有這種感覺吧,?那要怎樣解決這種問題呢? 我覺得有兩種方法,一種就是自己去編程實(shí)現(xiàn),,這種方法比較有意義,,還能夠提高編程水平,另外一種就是用實(shí)例分析算法的每句話,,我認(rèn)為這種方法是最有效的,。
然后還有一種題目,就是最后的寫算法的題目,,我覺得這種題目還是很好解決的,,只要是能夠自己做出作業(yè)的,基本上都會(huì)很容易做出來,,這也是為什么我前面覺得平時(shí)做作業(yè)應(yīng)該自己獨(dú)立思考的原因,,同時(shí)做這種題目千萬要小心,尤其是題目簡單的時(shí)候,,那肯定會(huì)有一些小地方要考慮清楚,,一不小心就會(huì)被扣掉很多分,這樣很不值,。
我覺得考試的時(shí)候沒有太多要講的,,只要復(fù)習(xí)好了,考試的時(shí)候細(xì)心一點(diǎn)就可以了,,然后就是做一個(gè)題目開始就要盡量保證正確,,如果覺得留在那里等后面做完了再來檢查,這樣錯(cuò)誤還是很有可能檢查不出來,,我期中考試的時(shí)候就基本上沒有檢查,,因?yàn)槲易雒總€(gè)題目都是確保正確,用的時(shí)間也挺多的,,然后也覺得沒有檢查的必要了,。
三、對(duì)《數(shù)據(jù)結(jié)構(gòu)與算法》課程教學(xué)的建議
1,、建議在上課過程中加大隨堂練習(xí)的分量,,以便學(xué)生能當(dāng)堂消化課堂上學(xué)習(xí)的知識(shí),也便于及時(shí)了解學(xué)生對(duì)知識(shí)點(diǎn)的掌握情況,,同時(shí)有助于學(xué)生保持良好的精神狀態(tài),。
2、建議在課時(shí)允許的情況下,,增加習(xí)題課的分量,,通過課堂的習(xí)題講解,加深對(duì)知識(shí)點(diǎn)的掌握,,同時(shí)對(duì)各知識(shí)點(diǎn)的運(yùn)用有一個(gè)更為直觀和具體的認(rèn)識(shí),。
3,、要更加重視實(shí)驗(yàn)的重要性。
以上便是我對(duì)《數(shù)據(jù)結(jié)構(gòu)與算法》這門課的學(xué)習(xí)總結(jié),,我會(huì)抓緊時(shí)間將沒有吃透的知識(shí)點(diǎn)補(bǔ)齊,。今后我仍然會(huì)繼續(xù)學(xué)習(xí),克服學(xué)習(xí)中遇到的難關(guān),,在打牢基礎(chǔ)的前提下向更深入的層面邁進(jìn),!
數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析論文篇三
數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計(jì)與分析
談到計(jì)算機(jī)方面的專業(yè)課程,我覺得數(shù)據(jù)結(jié)構(gòu)算是一門必不可少的課了,,它是計(jì)算機(jī)從業(yè)和研究人員了解,、開發(fā)及最大程度的利用計(jì)算機(jī)硬件的一種工具。數(shù)據(jù)結(jié)構(gòu)與算法分析是兩門緊密聯(lián)系的課程,算法要靠好的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn),二者的關(guān)系是密不可分的,談到算法不得不講數(shù)據(jù)結(jié)構(gòu),談數(shù)據(jù)結(jié)構(gòu)也不可避免的要了解算法,好的算法一定有一個(gè)好的數(shù)據(jù)結(jié)構(gòu),,很多算法實(shí)際上是對(duì)某種數(shù)據(jù)結(jié)構(gòu)實(shí)行的一種變換,研究算法也就是研究在實(shí)行變換過程中數(shù)據(jù)的動(dòng)態(tài)性質(zhì),。這兩門課程分別是我在大二和研一的時(shí)候?qū)W的,因?yàn)樗鼈兠芮械穆?lián)系,,這里將其放在一起總結(jié)如下,。
什么是數(shù)據(jù)結(jié)構(gòu)呢?研究數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)(物理結(jié)構(gòu))以及它們之間的關(guān)系,,且為該結(jié)構(gòu)定義相應(yīng)的運(yùn)算設(shè)計(jì)相應(yīng)的算法,。這里的數(shù)據(jù)是指可輸入到計(jì)算機(jī)能被程序處理的符號(hào)的集合。其中,,數(shù)據(jù)的邏輯結(jié)構(gòu)是指數(shù)據(jù)之間邏輯關(guān)系的描述,,邏輯結(jié)構(gòu)的分類有線性結(jié)構(gòu)、樹形結(jié)構(gòu)和圖結(jié)構(gòu),。數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是指數(shù)據(jù)在計(jì)算機(jī)中存儲(chǔ)結(jié)構(gòu),也稱為物理結(jié)構(gòu),,它有4類基本的存儲(chǔ)映射方法:1.順序的方法,;2.鏈接的方法;3.索引的方法,;4.散列的方法,。在程序設(shè)計(jì)語言中,數(shù)據(jù)結(jié)構(gòu)直接反映在數(shù)據(jù)類型上,,比如一個(gè)整型變量就是一個(gè)節(jié)點(diǎn),,根據(jù)類型給他分配內(nèi)存單元。抽象數(shù)據(jù)類型:一組值以及在這些值上定義的操作集合,,它是描述數(shù)據(jù)結(jié)構(gòu)的一種理論工具,,其特點(diǎn)是把數(shù)據(jù)結(jié)構(gòu)作為獨(dú)立于應(yīng)用程序的一種抽象代數(shù)結(jié)構(gòu)。
線性表結(jié)構(gòu):由一系列元素組成的有序的序列,,除了第一個(gè)元素和最后一個(gè)元素外,,每個(gè)元素都只有一個(gè)直接前趨和直接后繼,元素的個(gè)數(shù)稱為線性表的長度。它的存儲(chǔ)方式有順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ),。順序存儲(chǔ)方式它的優(yōu)點(diǎn)是存儲(chǔ)單元是連續(xù)的,,適合快速訪問元素內(nèi)容,鏈表的特點(diǎn)是動(dòng)態(tài)申請內(nèi)存空間,,并通過指針來鏈接結(jié)點(diǎn),,按照線性表的前驅(qū)關(guān)系把一個(gè)個(gè)結(jié)點(diǎn)鏈接起來,這樣可以動(dòng)態(tài)地根據(jù)需要分配內(nèi)存空間,,經(jīng)常用于插入新結(jié)點(diǎn)或刪除節(jié)點(diǎn)的需要,,鏈表還可以根據(jù)結(jié)點(diǎn)中指針個(gè)數(shù)分為單鏈表、雙鏈表,、循環(huán)鏈表等,。在線性表結(jié)構(gòu)中有兩類特別的線性表:棧和隊(duì)列。棧是一種限制訪問端口的線性表,,常稱為后進(jìn)先出表,。正是這種特殊的性質(zhì)使得棧的用途非常廣泛,比如在計(jì)算表達(dá)式的值時(shí)處理運(yùn)算符的先后次序,,另外一個(gè)大的用處就是遞歸了,,hanoi 塔就是最典型的用了遞歸的思想,在算法中,,也有很多運(yùn)用遞歸思想的例子,。隊(duì)列也屬于限制訪問點(diǎn)的線性表,它的特點(diǎn)就是加入和刪除元素都只能在隊(duì)列的一端進(jìn)行,,即隊(duì)列首出,,隊(duì)列尾進(jìn),最大的特點(diǎn)是先來先服務(wù),,先進(jìn)先出,。因?yàn)檫@個(gè)特點(diǎn),隊(duì)列常被用作消息緩沖器,。
在算法設(shè)計(jì)中,,順序表主要用于檢索,而利用棧中的遞歸思想在算法中則應(yīng)用非常廣泛,,如遞歸排序,,分治算法等。
樹結(jié)構(gòu):是一種非常重要的非線性數(shù)據(jù)結(jié)構(gòu),,它是由一個(gè)根結(jié)點(diǎn)和若干葉結(jié)點(diǎn)組成的樹狀結(jié)構(gòu),,除了根結(jié)點(diǎn)每個(gè)結(jié)點(diǎn)只能有一個(gè)父節(jié)點(diǎn),可以有若干子結(jié)點(diǎn),,若干個(gè)樹結(jié)構(gòu)還可以構(gòu)成森林,,樹的存儲(chǔ)結(jié)構(gòu)也分為順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ),,最典型的是左孩子右兄弟法。在樹結(jié)構(gòu)中比較重要的算法就是周游(遍歷)樹,,有先根次序,、后根次序以及中根次序。樹結(jié)構(gòu)中有幾類非常重要的特殊樹結(jié)構(gòu),,如二叉樹,,b樹,b+樹等,,其中,,二叉樹應(yīng)用最為廣泛。
二叉樹:是指每個(gè)結(jié)點(diǎn)最多有兩個(gè)子結(jié)點(diǎn)的樹結(jié)構(gòu),,具體細(xì)分,,根據(jù)葉子結(jié)點(diǎn)的特性可分為滿二叉樹、完全二叉樹等,。二叉樹的遍歷也分為深度優(yōu)先和廣度優(yōu)先,。另外,二叉樹有幾條非常重要的性質(zhì),,這也使得它的應(yīng)用非常廣泛,。
在算法設(shè)計(jì)中,典型的利用樹的深度優(yōu)先遍歷的算法是回溯法,,而典型的廣度優(yōu)先搜索算法是分枝定界法,。
圖:是一種較線性表和樹更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。一般來講,,數(shù)據(jù)的邏輯結(jié)構(gòu)可表示為結(jié)點(diǎn)的有窮集合k和k上的一個(gè)關(guān)系r,如果對(duì)k中結(jié)點(diǎn)相對(duì)于r的前驅(qū),、后繼個(gè)數(shù)加以限制,則可以分別定義線性結(jié)構(gòu),、樹形結(jié)構(gòu)和圖結(jié)構(gòu),,即:
線性結(jié)構(gòu):惟一前驅(qū),惟一后繼,,反映一種線性關(guān)系; 樹形結(jié)構(gòu):惟一前驅(qū),,多個(gè)后繼,,反映一種層次關(guān)系;
圖結(jié)構(gòu):不限制前驅(qū)的個(gè)數(shù),,亦不限制后繼的個(gè)數(shù),,反映一種網(wǎng)狀關(guān)系。
通常用g=(v,e)代表一個(gè)圖,,其中v是頂點(diǎn)集,,e是邊集,。圖分為有向圖和無向圖,圖的存儲(chǔ)方式有鄰接表和鄰接矩陣法,。和樹類似的,,圖中也需要周游,同樣有深度優(yōu)先搜索和廣度優(yōu)先搜索,,而比樹的周游要更復(fù)雜,,也更重要。在這一塊中,,有兩種比較典型的求最短路徑和最小支撐樹的算法需要注意,,它們分別是dijkstra算法和prim算法。另外需要注意的是圖的連通性,。
在算法設(shè)計(jì)中,,典型的用到圖論的算法有貪心算法和動(dòng)態(tài)規(guī)劃算法。
對(duì)于計(jì)算機(jī)科學(xué)來說,,算法的概念至關(guān)重要,。通俗的講,算法是指解決問題的一種方法或一個(gè)過程,,或者嚴(yán)格來講,,是由若干條指令組成的有窮序列,且滿足以下4條性質(zhì),;
(1)輸入:有零個(gè)或多個(gè)由外部提供的量作為算法的輸入,。(2)輸出:算法產(chǎn)生至少一個(gè)量作為輸出。
(3)確定性:組成算法的每條指令是清晰的,,無歧義的,。(4)有限性:算法中每條指令的執(zhí)行次數(shù)是有限的,執(zhí)行每條指令的時(shí)間也是有限的,。
我們研究一個(gè)算法或者評(píng)價(jià)一個(gè)算法主要是通過估計(jì)該算法的復(fù)雜性,,包括時(shí)間復(fù)雜性和空間復(fù)雜性??臻g復(fù)雜性是指使用該算法的程序在運(yùn)行時(shí)需要占用多少內(nèi)存空間,,具體包括指令空間、數(shù)據(jù)空間和環(huán)境??臻g,。時(shí)間復(fù)雜性是指執(zhí)行該程序所需要的時(shí)間量級(jí),通常是估算的時(shí)間,,包括編譯時(shí)間和運(yùn)行時(shí)間,。同時(shí)評(píng)價(jià)一個(gè)算法的好壞還要看其時(shí)間復(fù)雜性和空間復(fù)雜性隨著輸入規(guī)模的增長趨勢,一般能接受的最好是線性增長,。在算法設(shè)計(jì)這本書中,,每介紹一個(gè)算法都會(huì)分析其算法復(fù)雜度,,由此可看出它的重要性。
首先,,從遞歸的分治算法開始,。分治算法的基本思想是將一個(gè)規(guī)模為n的問題分解為k個(gè)規(guī)模較小的子問題,這些子問題互相獨(dú)立且與原問題相同,。遞歸的解這些子問題,,然后將各個(gè)子問題的解合并得到原問題的解。該算法的主要應(yīng)用有大整數(shù)乘法,,矩陣乘法,、合并排序等??梢源蟠蠼档退惴ǖ臅r(shí)間復(fù)雜度,,但使用遞歸棧可能增加程序的空間規(guī)模,。
動(dòng)態(tài)規(guī)劃算法和貪心算法:與分治算法類似,,動(dòng)態(tài)規(guī)劃的基本思想也是將待求解問題分解成若干子問題,先求解子問題,,然后從這些子問題的解得到原問題的解,。與分治算法不同的是,適合于用動(dòng)態(tài)規(guī)劃法求解的問題,,經(jīng)分解得到的子問題往往不是相互獨(dú)立的,。動(dòng)態(tài)規(guī)劃算法適用于解最優(yōu)化問題。通??砂匆韵?個(gè)步驟:
(1)找出最優(yōu)解的性質(zhì),,并刻畫其結(jié)構(gòu)特征。(2)遞歸的定義最優(yōu)值,。
(3)以自底向上的方式計(jì)算出最優(yōu)值,。
(4)根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息,構(gòu)造最優(yōu)解,。
動(dòng)態(tài)規(guī)劃算法的基本要素是最優(yōu)子結(jié)構(gòu)性質(zhì)和子問題重疊性質(zhì),。
最優(yōu)子結(jié)構(gòu)性質(zhì)。如果問題的最優(yōu)解所包含的子問題的解也是最優(yōu)的,,我們就稱該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)(即滿足最優(yōu)化原理),。最優(yōu)子結(jié)構(gòu)性質(zhì)為動(dòng)態(tài)規(guī)劃算法解決問題提供了重要線索。
子問題重疊性質(zhì),。子問題重疊性質(zhì)是指在用遞歸演算法自頂向下對(duì)問題進(jìn)行求解時(shí),每次產(chǎn)生的子問題并不總是新問題,,有些子問題會(huì)被重復(fù)計(jì)算多次,。動(dòng)態(tài)規(guī)劃算法正是利用了這種子問題的重疊性質(zhì),,對(duì)每一個(gè)子問題只計(jì)算一次,然后將其計(jì)算結(jié)果保存在一個(gè)表格中,,當(dāng)再次需要計(jì)算已經(jīng)計(jì)算過的子問題時(shí),,只是在表格中簡單地查看一下結(jié)果,從而獲得較高的效率,。
另外一點(diǎn)要素是備忘錄方法,,它作為動(dòng)態(tài)規(guī)劃算法的變形,用表格保存已解決問題的答案,,在下次需要解此子問題時(shí),,只要簡單查看子問題的解答,而不必重新計(jì)算,。與動(dòng)態(tài)規(guī)劃不同的是備忘錄方法的遞歸是自頂向下的,,而動(dòng)態(tài)規(guī)劃則是自底向上的。
動(dòng)態(tài)規(guī)劃算法設(shè)計(jì)策略典型的應(yīng)用案例有:矩陣連乘,、最大字段和,、流水作業(yè)調(diào)度等。有時(shí)滿足動(dòng)態(tài)規(guī)劃條件的問題可以有更好的算法,,比如貪心算法,。貪心算法即總是做出在當(dāng)前看來是最好的選擇。也就是說貪心算法并不從整體最優(yōu)上加以考慮,,它所做的總是做出的選擇只是在某種意義上的局部最優(yōu),。這種啟發(fā)式的策略并不能總是奏效,然而對(duì)某些特定的問題確能達(dá)到預(yù)期目的,。比如活動(dòng)安排的例子,。
貪心算法的基本要素主要有貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)。所謂貪心選擇性質(zhì)是指所求問題的整體最優(yōu)解可以通過一系列局部最優(yōu)的選擇,,即貪心選擇來達(dá)到,。這是貪心算法與動(dòng)態(tài)規(guī)劃的主要區(qū)別,它們的共同點(diǎn)是都要求問題具有最優(yōu)子結(jié)構(gòu)性質(zhì),。
貪心算法的典型案列是:活動(dòng)安排,、最優(yōu)裝載問題、最短路徑和最優(yōu)生成樹問題,?;厮莘ê头种Χń绶ǎ夯厮莘ㄓ小巴ㄓ玫慕忸}法”之稱。用它可以系統(tǒng)的搜索一個(gè)問題的所有解或任一解,。它在問題的解空間樹中,,按深度優(yōu)先策略,從根節(jié)點(diǎn)出發(fā)搜索解空間樹,。其算法框架包含遞歸回溯和迭代回溯,,兩個(gè)特別的解空間樹為子集樹和排列樹,。典型的回溯法的案例有:批處理作業(yè)調(diào)度、圖的m著色,、旅行售貨員問題,、0-1背包問題等。
分枝定界法類似于回溯法,,也是在問題的解空間上搜索問題解的算法,。一般情況下,分治定界法與回溯法的求解目標(biāo)不同,?;厮莘ǖ那蠼饽繕?biāo)是找出解空間中滿足約束條件的所有 的解,而分枝定界法的求解目標(biāo)則是找出滿足約束條件的一個(gè)解,,或是滿足約束條件的解中找出使某一目標(biāo)函數(shù)值達(dá)到極大或極小的解,,即在某種意義下的最優(yōu)解。由于求解目標(biāo)不同,,導(dǎo)致分支定界法與回溯法對(duì)解空間的搜索方式也不相同,。回溯法以深度優(yōu)先的方式搜索解空間,,而分枝定界法則以廣度優(yōu)先或以最小耗費(fèi)優(yōu)先的方式搜索解空間,。
另外,在算法分析中一定要提的是np問題,。首先需要介紹p(polynomial,多項(xiàng)式)問題.p問題是可以在多項(xiàng)式時(shí)間內(nèi)被確定機(jī)(通常意義的計(jì)算機(jī))解決的問題,。np(non-deterministic polynomial, 非確定多項(xiàng)式)問題,是指可以在多項(xiàng)式時(shí)間內(nèi)被非確定機(jī)(他可以猜,他總是能猜到最能滿足你需要的那種選擇,如果你讓他解決n皇后問題,他只要猜n次就能完成----每次都是那么幸運(yùn))解決的問題.這里有一個(gè)著名的問題----千禧難題之首,是說p問題是否等于np問題,也即是否所有在非確定機(jī)上多項(xiàng)式可解的問題都能在確定機(jī)上用多項(xiàng)式時(shí)間求解。
np完全(np complete,npc)問題是指這樣一類np問題,所有的np問題都可以用多項(xiàng)式時(shí)間劃歸到他們中的一個(gè),。所以顯然np完全的問題具有如下性質(zhì):它可以在多項(xiàng)式時(shí)間內(nèi)求解,,當(dāng)且僅當(dāng)所有的其他的np-完全問題也可以在多項(xiàng)式時(shí)間內(nèi)求解。這樣一來,只要我們找到一個(gè)npc問題的多項(xiàng)式解,所有的np問題都可以多項(xiàng)式時(shí)間內(nèi)劃歸成這個(gè)npc問題,再用多項(xiàng)式時(shí)間解決,這樣np就等于p了,。
小結(jié)一下,,在算法設(shè)計(jì)這么課中學(xué)了這么幾大類典型的算法,里面也涉及到具體的應(yīng)用案例,,但我覺得學(xué)算法的目的遠(yuǎn)不是學(xué)會(huì)這幾種固定的特殊問題的解法而已,,事實(shí)上領(lǐng)會(huì)這些巧妙算法背后的思想然后學(xué)會(huì)遷移到其他新的問題中去才是領(lǐng)會(huì)了算法設(shè)計(jì)的精髓。
數(shù)據(jù)結(jié)構(gòu)算法設(shè)計(jì)與分析論文篇四
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
學(xué) 生 實(shí) 驗(yàn) 報(bào) 告 冊
課程名稱:
學(xué)生學(xué)號(hào):
所屬院部:計(jì)算機(jī)工程學(xué)院
(理工類)
算法與數(shù)據(jù)結(jié)構(gòu) 專業(yè)班級(jí): 計(jì)算機(jī)統(tǒng)招(1)班
1413101006 學(xué)生姓名: 邢亦波
指導(dǎo)教師: 徐永華 15 ——20 16 學(xué)年 第 2 學(xué)期
金陵科技學(xué)院教務(wù)處制
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)報(bào)告書寫要求
實(shí)驗(yàn)報(bào)告原則上要求學(xué)生手寫,,要求書寫工整,。若因課程特點(diǎn)需打印的,要遵照以下字體,、字號(hào),、間距等的具體要求。紙張一律采用a4的紙張。
實(shí)驗(yàn)報(bào)告書寫說明
實(shí)驗(yàn)報(bào)告中一至四項(xiàng)內(nèi)容為必填項(xiàng),,包括實(shí)驗(yàn)?zāi)康暮鸵?;?shí)驗(yàn)儀器和設(shè)備;實(shí)驗(yàn)內(nèi)容與過程,;實(shí)驗(yàn)結(jié)果與分析。各院部可根據(jù)學(xué)科特點(diǎn)和實(shí)驗(yàn)具體要求增加項(xiàng)目,。
填寫注意事項(xiàng)
(1)細(xì)致觀察,,及時(shí)、準(zhǔn)確,、如實(shí)記錄,。(2)準(zhǔn)確說明,層次清晰,。
(3)盡量采用專用術(shù)語來說明事物,。
(4)外文、符號(hào),、公式要準(zhǔn)確,,應(yīng)使用統(tǒng)一規(guī)定的名詞和符號(hào)。(5)應(yīng)獨(dú)立完成實(shí)驗(yàn)報(bào)告的書寫,,嚴(yán)禁抄襲,、復(fù)印,一經(jīng)發(fā)現(xiàn),,以零分論處,。
實(shí)驗(yàn)報(bào)告批改說明
實(shí)驗(yàn)報(bào)告的批改要及時(shí)、認(rèn)真,、仔細(xì),,一律用紅色筆批改。實(shí)驗(yàn)報(bào)告的批改成績采用百分制,,具體評(píng)分標(biāo)準(zhǔn)由各院部自行制定,。
實(shí)驗(yàn)報(bào)告裝訂要求
實(shí)驗(yàn)批改完畢后,任課老師將每門課程的每個(gè)實(shí)驗(yàn)項(xiàng)目的實(shí)驗(yàn)報(bào)告以自然班為單位,、按學(xué)號(hào)升序排列,,裝訂成冊,并附上一份該門課程的實(shí)驗(yàn)大綱,。
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目名稱: 順序表 實(shí)驗(yàn)學(xué)時(shí): 2 同組學(xué)生姓名: 無 實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)日期: 04.05 實(shí)驗(yàn)成績: 批改教師: 徐永華 批改時(shí)間:
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)1 順序表
一,、實(shí)驗(yàn)?zāi)康暮鸵?/p>
掌握順序表的定位、插入,、刪除等操作,。
二、實(shí)驗(yàn)儀器和設(shè)備
turbo c 2.0
三、實(shí)驗(yàn)內(nèi)容與過程(含程序清單及流程圖)
1,、必做題
(1)編寫程序建立一個(gè)順序表,,并逐個(gè)輸出順序表中所有數(shù)據(jù)元素的值。編寫主函數(shù)測試結(jié)果,。
(2)編寫順序表定位操作子函數(shù),,在順序表中查找是否存在數(shù)據(jù)元素x。如果存在,,返回順序表中和x值相等的第1個(gè)數(shù)據(jù)元素的序號(hào)(序號(hào)從0開始編號(hào)),;如果不存在,返回-1,。編寫主函數(shù)測試結(jié)果,。(3)在遞增有序的順序表中插入一個(gè)新結(jié)點(diǎn)x,保持順序表的有序性,。
解題思路:首先查找插入的位置,,再移位,最后進(jìn)行插入操作,;從第一個(gè)元素開始找到第一個(gè)大于該新結(jié)點(diǎn)值x的元素位置i即為插入位置,;然后將從表尾開始依次將元素后移一個(gè)位置直至元素i;最后將新結(jié)點(diǎn)x插入到i位置,。
(4)刪除順序表中所有等于x的數(shù)據(jù)元素,。
2、選做題
(5)已知兩個(gè)順序表a和b按元素值遞增有序排列,,要求寫一算法實(shí)現(xiàn)將a和b歸并成一個(gè)按元素值遞減有序排列的順序表(允許表中含有值相同的元素),。
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
程序清單: 1.(1)
#include
#define maxsize 100 #define datatype int typedef struct shun { datatype a[maxsize];int length;}shun;shun s;void init(shun *s){ } void setup(shun *s){
} void display(shun *s){} main()int i;if(s->length==0)printf(“沒有數(shù)據(jù)n”);else for(i=0;i
length;i++){ } printf(“%-5d”,s->a[i]);int i,j;printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);} for(i=0;i
length;i++){ } scanf(“%d”,&s->a[i]);s->length=0;printf(“溢出n”);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告{
} init(&s);setup(&s);display(&s);
1.(2)
#include
#define maxsize 100 #define datatype int typedef struct shun { datatype a[maxsize];int length;}shun;shun s;void init(shun *s){ } void setup(shun *s){
} int find(shun *s,int x){ int i;for(i=0;ilength;i++){ int i,j;printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);} for(i=0;i
length;i++){ } scanf(“%d”,&s->a[i]);s->length=0;printf(“溢出n”);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告if(s->a[i]==x)return i;} return 0;} void display(shun *s){
} main(){
} int x;init(&s);setup(&s);display(&s);printf(“輸入xn”);scanf(“%d”,&x);if(find(&s,x))printf(“找到位置是%dn”, find(&s,x));printf(“-1n”);else int i;if(s->length==0)printf(“沒有數(shù)據(jù)n”);else for(i=0;i
length;i++){ } printf(“%-5d”,s->a[i]);
1.(3)#include#define maxsize 100 #define datatype int typedef struct shun { datatype a[maxsize];int length;}shun;shun s;void init(shun *s){ s->length=0;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告} void setup(shun *s){
} void insert(shun *s,int x){ int i,j;if((s->length+1)>=maxsize){ printf(“溢出n”);exit(0);int i,j;printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);} for(i=0;i
length;i++){ } scanf(“%d”,&s->a[i]);printf(“溢出n”);} for(i=0;i
length;i++){ if(s->a[i]>=x)break;} for(j=s->length-1;j>=i;j--){ s->a[j+1]=s->a[j];} s->a[i]=x;s->length++;} void display(shun *s){
int i;if(s->length==0)printf(“沒有數(shù)據(jù)n”);else for(i=0;ilength;i++)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告} main(){
} int x;init(&s);setup(&s);printf(“輸入xn”);scanf(“%d”,&x);insert(&s,x);display(&s);{ } printf(“%-5d”,s->a[i]);
1.(4)#include
#define maxsize 100 #define datatype int typedef struct shun { datatype a[maxsize];int length;}shun;shun s;void init(shun *s){ } void setup(shun *s){
int i,j;printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);s->length=0;printf(“溢出n”);金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void delet(shun *s,int x){ int i,j;for(i=0;i
length;i++){
} void display(shun *s){} main(){
} int x;init(&s);setup(&s);printf(“輸入xn”);scanf(“%d”,&x);delet(&s,x);display(&s);int i;if(s->length==0)printf(“沒有數(shù)據(jù)n”);else for(i=0;i
length;i++){ } printf(“%-5d”,s->a[i]);if(s->a[i]==x){
for(j=i;jlength;j++){ s->a[j]=s->a[j+1];} s->length--;i--;} for(i=0;i
length;i++){ } scanf(“%d”,&s->a[i]);} }
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告2.#include
#define maxsize 100 #define datatype int typedef struct shun { datatype a[maxsize];int length;}shun;shun a,b,c;void init(shun *s){ } void setup(shun *s){
} } int i,j,t;printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要幾個(gè)數(shù)n”);scanf(“%d”,&s->length);} for(i=0;ilength;i++){ } for(i=0;i
length;i++){
for(j=i+1;jlength;j++){
} if(s->a[i]a[j]){
} t=s->a[i];s->a[j]=t;s->a[i]=s->a[j];scanf(“%d”,&s->a[i]);s->length=0;printf(“溢出n”);金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
void cat(shun *a,shun *b){ int i,j=0,t;if((a->length+b->length)>=maxsize){
} for(i=0;ilength;i++){ } for(j=0;j
length;j++){
} =a->length+b->length;} void display(shun *s){
} int i;if(s->length==0)printf(“沒有數(shù)據(jù)n”);else for(i=0;i
length;i++){ } printf(“%-5d”,s->a[i]);} for(i=0;i
for(j=i+1;j
} if(c.a[i]
} t=c.a[i];c.a[j]=t;c.a[i]=c.a[j];c.a[i]=b->a[j];i++;c.a[i]=a->a[i];printf(“溢出n”);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
main(){
} init(&a);printf(“a初始化n”);setup(&a);init(&b);setup(&b);cat(&a,&b);display(&c);printf(“b初始化n”);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
四、實(shí)驗(yàn)結(jié)果與分析(程序運(yùn)行結(jié)果及其分析)1.(1)
1.(2)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
1.(3)
1.(4)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
2.金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
五,、實(shí)驗(yàn)體會(huì)(遇到問題及解決辦法,,編程后的心得體會(huì))
我覺得編程不能只要完成其主要功能就行了,還要考慮到邊界值,,考慮是否會(huì)出錯(cuò)等等,。有時(shí)候一種方法編不通,不如換種方法編,。我覺得編程挺考慮耐心的,,恩,就這么多感悟了,。
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目名稱: 單鏈表 實(shí)驗(yàn)學(xué)時(shí): 2 同組學(xué)生姓名: 實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績: 批改教師: 批改時(shí)間:
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)2 單鏈表
一,、實(shí)驗(yàn)?zāi)康暮鸵?/p>
1、實(shí)驗(yàn)?zāi)康?/p>
掌握單鏈表的定位,、插入,、刪除等操作,。
2、實(shí)驗(yàn)要求
(1)注意鏈表的空間是動(dòng)態(tài)分配的,,某結(jié)點(diǎn)不用之后要及時(shí)進(jìn)行物理刪除,,以便釋放其內(nèi)存空間。
(2)鏈表不能實(shí)現(xiàn)直接定位,,一定注意指針的保存,,防止丟失。
二,、實(shí)驗(yàn)儀器和設(shè)備
turbo c 2.0
三,、實(shí)驗(yàn)內(nèi)容與過程(含程序清單及流程圖)
1、必做題
(1)編寫程序建立一個(gè)單鏈表,,并逐個(gè)輸出單鏈表中所有數(shù)據(jù)元素。(2)在遞增有序的單鏈表中插入一個(gè)新結(jié)點(diǎn)x,,保持單鏈表的有序性,。
解題思路:首先查找插入的位置然后進(jìn)行插入操作;從第一個(gè)結(jié)點(diǎn)開始找到第一個(gè)大于該新結(jié)點(diǎn)值的結(jié)點(diǎn)即為插入位置,;然后在找到的此結(jié)點(diǎn)之前插入新結(jié)點(diǎn),;注意保留插入位置之前結(jié)點(diǎn)的指針才能完成插入操作。
(3)編寫實(shí)現(xiàn)帶頭結(jié)點(diǎn)單鏈表就地逆置的子函數(shù),,并編寫主函數(shù)測試結(jié)果,。
2、選做題
已知指針la和lb分別指向兩個(gè)無頭結(jié)點(diǎn)單鏈表的首元結(jié)點(diǎn),。要求編一算法實(shí)現(xiàn),,從表la中刪除自第i個(gè)元素起共len個(gè)元素后,將它們插入到表lb中第j個(gè)元素之前,。程序清單:
1.(1)
#include
#define datatype char typedef struct lnklist { datatype a;struct lnklist *next;}list;list *s;list *setup(list *s)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告{
} void display(list *head){ list *rear;if(head==null){
} } main(){
list *head;head=setup(s);display(head);free(s);rear=head;printf(“%c”,rear->a);while(rear->next!=null){
} rear=rear->next;printf(“%c”,rear->a);printf(“沒有數(shù)據(jù)n”);else list *head=null;list *rear=null;
char c;printf(“請輸入c直到$n”);c=getchar();while(c!='$'){
} if(rear!=null)rear->next=null;return head;s=malloc(sizeof(list));s->a=c;if(head==null){ } else rear->next=s;rear=s;c=getchar();head=s;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} free(head);1.(2)#include
#define datatype char typedef struct lnklist { datatype a;struct lnklist *next;}list;list *s;list *setup(list *s){
} void paixu(list *head){list *rear;list *p;datatype min;if(head==null){ list *head=null;list *rear=null;
char c;printf(“請輸入c直到$n”);c=getchar();while(c!='$'){
} if(rear!=null)rear->next=null;return head;s=malloc(sizeof(list));s->a=c;if(head==null){ } else rear->next=s;rear=s;c=getchar();head=s;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void insert(list *head,datatype x){
list *p;list *q;list *r;if(head==null)printf(“空表n”);p=head;q=head;r=malloc(sizeof(list));r->a=x;while(p->next!=null){
} while(q->next!=p)q=q->next;r->next=p;q->next=r;if(p->next==null)if(x
a){ } p=p->next;break;} p=head;
while(p->next!=null){
do {
rear=rear->next;if(min>rear->a){
} min=rear->a;rear->a=p->a;p->a=min;
min=p->a;rear=p;printf(“空表,!n”);exit(0);} while(rear->next!=null);p=p->next;}
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void display(list *head){ list *rear;if(head==null){
} } main(){
} datatype x,c;list *head;head=setup(s);paixu(head);printf(“請輸入xn”);c=getchar();x=getchar();insert(head,x);display(head);free(s);free(head);rear=head;printf(“%c”,rear->a);while(rear->next!=null){
} rear=rear->next;printf(“%c”,rear->a);printf(“沒有數(shù)據(jù)n”);else p->next=r;1.(3)#include
#define datatype char typedef struct lnklist { datatype a;struct lnklist *next;}list;list *s;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告list *setup(list *s){
} list *nizhi(list *head){
list *h;list *rear;int i=0;char b[100];h=malloc(sizeof(list));h->next=head;rear=head;do {
b[i]=rear->a;rear=rear->next;i++;list *head=null;list *rear=null;
char c;printf(“請輸入c直到$n”);c=getchar();while(c!='$'){
} if(rear!=null)rear->next=null;return head;s=malloc(sizeof(list));s->a=c;if(head==null){ } else rear->next=s;rear=s;c=getchar();head=s;}while(rear->next!=null);b[i]=rear->a;rear=head;for(;i>=0;i--){
} rear->a=b[i];rear=rear->next;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void display(list *head){ list *rear;if(head==null){
} } main(){
} list *head;head=setup(s);head=nizhi(head);display(head);free(s);free(head);rear=head;printf(“%c”,rear->a);while(rear->next!=null){
} rear=rear->next;printf(“%c”,rear->a);printf(“沒有數(shù)據(jù)n”);else return head;2.#include
#define datatype char typedef struct lnklist { datatype a;struct lnklist *next;}list;list *s1;list *s2;list *setup(list *s){
list *head=null;list *rear=null;char c;printf(“請輸入c直到$n”);c=getchar();while(c!='$')
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void dein(list *la,list *lb,int i,int len,int j){
int k;list *rear;list *t;list *h;list *r;list *q;h=null;rear=la;q=la;for(k=1;k!=i;k++){
} while(q->next!=rear){
t=malloc(sizeof(list));t->a=rear->a;if(h==null)h=t;q=q->next;for(k=1;k<=len;k++)rear=rear->next;if(rear->next==null&&k!=i){
} printf(“沒找到i的位置n”);exit(0);
{
} if(rear!=null)rear->next=null;return head;s=malloc(sizeof(list));s->a=c;if(head==null){ } else rear->next=s;rear=s;c=getchar();head=s;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} void display(list *head){ list *rear;if(head==null){
rear=head;printf(“%c”,rear->a);while(rear->next!=null){
} printf(“n”);rear=rear->next;printf(“%c”,rear->a);printf(“沒有數(shù)據(jù)n”);else
} q->next=rear;if(r!=null)r->next=null;rear=lb;for(k=1;k!=j;k++){
} q=lb;while(q->next!=rear)q=q->next;r->next=rear;q->next=h;rear=rear->next;if(rear->next==null&&k!=j){
} printf(“沒找到j(luò)的位置n”);exit(0);else r->next=t;r=t;rear=rear->next;if(rear->next==null&&k
} printf(“l(fā)en太長n”);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} } main(){ char c;
} list *la;list *lb;int i,len,j;printf(“建立單鏈表lan”);la=setup(s1);printf(“建立單鏈表lbn”);lb=setup(s2);printf(“請輸入要?jiǎng)h的位置in”);scanf(“%d”,&i);printf(“請輸入要?jiǎng)h減的數(shù)據(jù)長度lenn”);scanf(“%d”,&len);printf(“請輸入要插入的位置jn”);scanf(“%d”,&j);dein(la,lb,i,len,j);printf(“顯示lan”);display(la);printf(“顯示lbn”);display(lb);free(la);free(lb);c=getchar();
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
四、實(shí)驗(yàn)結(jié)果與分析(程序運(yùn)行結(jié)果及其分析)1.(1)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
1.(2)
1.(3)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
2.金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
五,、實(shí)驗(yàn)體會(huì)(遇到問題及解決辦法,,編程后的心得體會(huì))
單鏈表以前沒怎么編過,所以現(xiàn)在編有點(diǎn)陌生,,要編譯好幾次才能運(yùn)行,。我覺得還是不能光看書,還要多編幾道題比較有手感,。
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目名稱: 堆棧和隊(duì)列 實(shí)驗(yàn)學(xué)時(shí): 2 同組學(xué)生姓名: 實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績: 批改教師: 批改時(shí)間:
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)3 堆棧和隊(duì)列
一,、實(shí)驗(yàn)?zāi)康暮鸵?/p>
(1)掌握應(yīng)用棧解決問題的方法。(2)掌握利用棧進(jìn)行表達(dá)式求和的算法,。
(3)掌握隊(duì)列的存儲(chǔ)結(jié)構(gòu)及基本操作實(shí)現(xiàn),,并能在相應(yīng)的應(yīng)用問題中正確選用它們,。
二、實(shí)驗(yàn)儀器和設(shè)備
turbo c 2.0
三,、實(shí)驗(yàn)內(nèi)容與過程(含程序清單及流程圖)
1,、必做題
(1)判斷一個(gè)算術(shù)表達(dá)式中開括號(hào)和閉括號(hào)是否配對(duì)。(2)測試“漢諾塔”問題,。
(3)假設(shè)稱正讀和反讀都相同的字符序列為”回文”,,試寫一個(gè)算法判別讀入的一個(gè)以’@’為結(jié)束符的字符序列是否是“回文”。
2,、選做題
在順序存儲(chǔ)結(jié)構(gòu)上實(shí)現(xiàn)輸出受限的雙端循環(huán)隊(duì)列的入列和出列算法,。設(shè)每個(gè)元素表示一個(gè)待處理的作業(yè),元素值表示作業(yè)的預(yù)計(jì)時(shí)間,。入隊(duì)列采取簡化的短作業(yè)優(yōu)先原則,,若一個(gè)新提交的作業(yè)的預(yù)計(jì)執(zhí)行時(shí)間小于隊(duì)頭和隊(duì)尾作業(yè)的平均時(shí)間,則插入在隊(duì)頭,,否則插入在隊(duì)尾,。程序清單:
1.(1)
#include
#include
char a[100];int panduan(char *a){
int i,k,count1=0,count2=0;for(i=0;a[i]!='';i++){ {count1++;for(k=i+1;a[k]!='';k++){ if(a[k]==')')if(a[i]=='(')
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} main(){
} printf(“請輸入算式n”);gets(a);if(panduan(a)==1){ } else printf(“算式()不配對(duì)n”);printf(“算式()配對(duì)n”);
break;} if(a[k]=='')return 0;} if(a[i]==')')} if(count1!=count2)return 0;return 1;count2++;1.(2)
#include
int i;void move(int n,char a,char c){ printf(“第%d步:將%d號(hào)盤子%c--->%cn”,i++,n,a,c);} void hanno(int n,char a,char b,char c){
} main(){ if(n==1){} hanno(n-1,a,c,b);move(n,a,c);hanno(n-1,b,a,c);move(1,a,c);else
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} int n;char a,b,c;printf(“請輸入要移動(dòng)的盤子數(shù)n”);scanf(“%d”,&n);a='a';b='b';c='c';hanno(n,a,b,c);1.(3)
#include
#include
char s[100];int huiwen(char s[]){
} main(){while(1){ printf(“請輸入字符直到@n”);gets(s);if(huiwen(s))
} printf(“是回文n”);printf(“不是回文n”);else int i,j=0;char b[100];for(i=0;s[i]!='@';i++);for(i=i-1;i>=0;i--){
} j=0;for(i=0;s[i]!='@';i++){ } return 1;return 0;b[j]=s[i];j++;if(s[i]!=b[j])j++;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
}
2.#include
#define maxsize 100 typedef struct duilie {
int a[maxsize];int head;int rear;}dui;dui *s;void init(dui *s){} void setup(dui *s,int x){
if(x<((s->a[s->head]+s->a[s->rear])/2)){
} else { s->rear=(s->rear++)%maxsize;s->head=(s->head--)%maxsize;s->a[s->head]=x;s->head=maxsize-1;s->rear=maxsize-1;s->a[s->head]=0;s->a[s->rear]=0;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} } s->a[s->rear]=x;void display(dui *s){
printf(“s隊(duì)為:”);while(s->head==s->rear){ printf(“%-3d”,s->a[s->head]);
} main(){
} int x;while(1){ printf(“請輸入x直到0n”);scanf(“%d”,&x);setup(s,x);if(x==0)} if(s->head!=(s->rear+1)%maxsize)printf(“隊(duì)滿n”);display(s);break;} s->head=(s->head++)%maxsize;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
四、實(shí)驗(yàn)結(jié)果與分析(程序運(yùn)行結(jié)果及其分析)1.(1)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
1.(2)
1.(3)
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
五,、實(shí)驗(yàn)體會(huì)(遇到問題及解決辦法,,編程后的心得體會(huì))
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目名稱: 串 實(shí)驗(yàn)學(xué)時(shí): 2 同組學(xué)生姓名: 實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績: 批改教師: 批改時(shí)間:
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)4 串
一、實(shí)驗(yàn)?zāi)康暮鸵?/p>
掌握串的存儲(chǔ)及應(yīng)用,。
二,、實(shí)驗(yàn)儀器和設(shè)備
turbo c 2.0
三、實(shí)驗(yàn)內(nèi)容與過程(含程序清單及流程圖)
1,、必做題
(1)編寫輸出字符串s中值等于字符ch的第一個(gè)字符的函數(shù),,并用主函數(shù)測試結(jié)果。
(2)編寫輸出字符串s中值等于字符ch的所有字符的函數(shù),,并用主函數(shù)測試結(jié)果,。
解題思路:可以將第一題程序改進(jìn)成一個(gè)子函數(shù),在本題中循環(huán)調(diào)用,。(3)設(shè)字符串采用單字符的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),,編程刪除串s從位置i開始長度為k的子串。
2,、選做題
假設(shè)以鏈結(jié)構(gòu)表示串,,編寫算法實(shí)現(xiàn)將串s插入到串t中某個(gè)字符之后,若串t中不存在這個(gè)字符,,則將串s聯(lián)接在串t的末尾,。
提示:為提高程序的通用性,插入位置字符應(yīng)設(shè)計(jì)為從鍵盤輸入,。程序清單:
1.(1)
#include
#include
void fun(char s[],char ch){
int i;for(i=0;s[i]!='';i++){} printf(“沒找到n”);if(ch==s[i]){
} printf(“找到字符%c在位置%dn”,s[i],i+1);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} main(){
} char s[100],ch;printf(“請輸入字符串sn”);gets(s);printf(“請輸入要查找的字符chn”);scanf(“%c”,&ch);fun(s,ch);1.(2)
#include
#include
char s[100];void fun(char s[],char ch){ int i;if(strcmp(s,“")==0){ printf(”字符串s為空n“);exit(0);} for(i=0;s[i]!='';i++){
} main(){ char ch;printf(”請輸入字符串sn“);gets(s);printf(”請輸入要查找的chn“);scanf(”%c“,&ch);fun(s,ch);} if(ch==s[i])printf(” %c“,s[i]);} 1.(3)金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
#include
#include
typedef struct chuanlian { char c;struct chuanlian *next;}chuan;chuan *s;chuan *setup(chuan *s){
} void delet(chuan *chu,int i,int k){int j;chuan *p;chuan *t;if(chu==null){
} p=chu;for(j=1;j
c=ch;if(head==null){ } else
} if(rear!=null)rear->next=null;return head;rear->next=s;rear=s;head=s;s=malloc(sizeof(chuan));ch=getchar();金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
}
void display(chuan *chu){ chuan *p;
} main(){
int i,k;chuan *head;head=setup(s);printf(”請輸入要?jiǎng)h除字符的位置in“);scanf(”%d“,&i);p=chu;if(chu==null){
} printf(”%c“,p->c);while(p->next!=null){
} p=p->next;printf(”%c“,p->c);printf(”空串n“);exit(0);{
} t=p->next;for(j=1;j
} p->next=t;if(p->next==null&&j
} t=t->next;printf(”串長度太小,,無法刪除%d個(gè)元素n“,k);exit(0);if(p->next==null&&j
} p=p->next;printf(”無法找到第%d位置n“,i);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
printf(”請輸入要?jiǎng)h除字符的個(gè)數(shù)kn“);scanf(”%d“,&k);delet(head,i,k);display(head);free(head);free(s);} 2.#include
#include
typedef struct chuanlian { char c;struct chuanlian *next;}chuan;chuan *s,*t;chuan *setup(chuan *chu){
chuan *head=null;chuan *rear=null;char ch;printf(”請輸入字符ch直到$n“);ch=getchar();while(ch!='$'){ chu=malloc(sizeof(chuan));chu->c=ch;if(head==null){ head=chu;
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} } else rear->next=chu;rear=chu;ch=getchar();} if(rear!=null)rear->next=null;return head;
void insert(chuan *s1,chuan *s2,char x){
chuan *p;chuan *q;p=s1;if(s1==null){
} {
} while(p->next!=null){ if(p->c==x)break;printf(”s是空串n“);exit(0);if(s2==null)printf(”t是空串n“);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
} } p=p->next;if(p->next==null)p->next=s2;else {
} q=s2;while(q->next!=null)q=q->next;q->next=p->next;p->next=s2;void display(chuan *chu){ chuan *p;
} p=chu;if(chu==null){
} printf(”%c“,p->c);while(p->next!=null){
} p=p->next;printf(”%c“,p->c);printf(”空串n“);exit(0);
金陵科技學(xué)院實(shí)驗(yàn)報(bào)告
main(){
char x,c;printf(”建立單鏈串tn“);t=setup(t);c=getchar();printf(”建立單鏈串sn“);s=setup(s);c=getchar();printf(”請輸入要在什么字符后插入n");x=getchar();
}
insert(t,s,x);display(t);