計算機經典演算法
『壹』 計算機考研:數據結構常用演算法解析(1)
數據結構是計算機考研408計算機學科專業基礎綜合的重要組成部分,考生需要認真復習,尤其是對於數據結構中一些常用的演算法問題,考生一定要弄懂弄會,理解的去掌握。獵考考研就帶大家一一梳理這些知識點。
第一章
◆ 數據:指能夠被計算機識別、存儲和加工處理的信息載體。
◆ 數據元素:就是數據的基本單位,在某些情況下,數據元素也稱為元素、結點、頂點、記錄。數據元素有時可以由若干數據項組成。
◆ 數據類型:是一個值的集合以及在這些值上定義的一組操作的總稱。
在高級語言程序中又分為:非結構的原子類型和結構類型
◆抽象數據類型(ADT):是指一個數學模型以及定義在該模型上的一組操作。
一個抽象的數據類型的軟體模塊通常包含定義和表示和實現
用三元組(D,S,P):數據對象、數據關系、基本操作
◆ 數據結構:指的是數據之間的相互關系,即數據的組織形式。一般包括三個方面的內容:
數據的邏輯結構、存儲結構和數據的運算。
◆ 邏輯結構:指各數據元素之間的邏輯關系。
◆ 存儲結構:就是數據的邏輯結構用計算機語言的實現。
◆ 線性結構:數據邏輯結構中的一類,它的特徵是若結構為非空集,則該結構有且只有一個開始結點和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個直接後繼。線性表就是一個典型的線性結構。
◆ 非線性結構:數據邏輯結構中的另一大類,它的邏輯特徵是一個結點可能有多個直接前趨和直接後繼。
常用的存儲表示方法有四種:
◆ 順序存儲方法:它是把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的
邏輯關系由存儲單元的鄰接關系來體現。由此得到的存儲表示稱為順序存儲結構。
◆ 鏈接存儲方法:它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系是
由附加的指針欄位表示的。由此得到的存儲表示稱為鏈式存儲結構。
◆ 索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。
◆ 散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。
漸近時間復雜度的表示法T(n)=O(f(n)),這里的"O"是數學符號,它的嚴格定義是"若T(n)和f(n)是定義在正整數集合上的兩個函數,則T(n)=O(f(n))表示存在正的常數C和n0 ,使得當n≥n0時都滿足0≤T(n)≤C·f(n)。"用容易理解的話說就是這兩個函數當整型自變數n趨向於無窮大時,兩者的比值是一個不等於0的常數。這么一來,就好計算了吧。
求某一演算法的時間復雜度是關於N的統計,下面的例子很有反面意義
x=91; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
◆ T(n)=O(1)
◇ 這個程序看起來有點嚇人,總共循環運行了1000次,但是我們看到n沒有? 沒。
◇ 這段程序的運行是和n無關的,就算它再循環一萬年,我們也不管他,只是一個常數階的函數。
考研有疑問、不知道如何總結考研考點內容、不清楚考研報名當地政策,點擊底部咨詢官網,免費領取復習資料:https://www.87dh.com/xl/
『貳』 編程:演算法的定義是常用演算法有
演算法(Algorithm)是解題的步驟,可以把演算法定義成解一確定類問題的任意一種特殊的方法。在計算機科學中,演算法要用計算機演算法語言描述,演算法代表用計算機解一類問題的精確、有效的方法。演算法+數據結構=程序,求解一個給定的可計算或可解的問題,不同的人可以編寫出不同的程序,來解決同一個問題,這里存在兩個問題:一是與計算方法密切相關的演算法問題;二是程序設計的技術問題。演算法和程序之間存在密切的關系。
演算法是一組有窮的規則,它們規定了解決某一特定類型問題的一系列運算,是對解題方案的准確與完整的描述。制定一個演算法,一般要經過設計、確認、分析、編碼、測試、調試、計時等階段。
對演算法的學習包括五個方面的內容:① 設計演算法。演算法設計工作是不可能完全自動化的,應學習了解已經被實踐證明是有用的一些基本的演算法設計方法,這些基本的設計方法不僅適用於計算機科學,而且適用於電氣工程、運籌學等領域;② 表示演算法。描述演算法的方法有多種形式,例如自然語言和演算法語言,各自有適用的環境和特點;③確認演算法。演算法確認的目的是使人們確信這一演算法能夠正確無誤地工作,即該演算法具有可計算性。正確的演算法用計算機演算法語言描述,構成計算機程序,計算機程序在計算機上運行,得到演算法運算的結果;④ 分析演算法。演算法分析是對一個演算法需要多少計算時間和存儲空間作定量的分析。分析演算法可以預測這一演算法適合在什麼樣的環境中有效地運行,對解決同一問題的不同演算法的有效性作出比較;⑤ 驗證演算法。用計算機語言描述的演算法是否可計算、有效合理,須對程序進行測試,測試程序的工作由調試和作時空分布圖組成。
常見的演算法有排序,樹,圖等相關演算法
『叄』 計算機考研:數據結構常用演算法解析(8)
第九章 查找
查找分成靜態查找和動態查找,靜態查找只是找,返回查找位置。而動態查找則不同,若查找成功,返回位置,若查找不成功,則要返回新記錄的插入位置。也就是說,靜態查找不改變查找表,而動態查找則會有插入操作,會改變查找表的。
不同的查找所採用的存儲結構也不同,靜態查找採用順序表,而動態查找由於經常變動,所以用二叉排序樹,二叉平衡樹、B-和B+。
靜態查找有,順序查找,折半查找,分塊查找(索引順序查找)
順序查找(Sequential Search)是最簡單的一種查找方法。
演算法思路
設給定值為k,在表(R1 R2……Rn)中,從Rn即最後一個元素開始,查找key=k的記錄。若存在一個記錄Ri(l≤i≤n)的key為k,則查找成功,返回記錄序號i;否則,查找失敗,返回0。
演算法描述
int sqsearch(sqlist r,keytype k) //對表r順序查找的演算法//
{ int i;
r.data[0].key=k; //k存入監視哨//
i=r.len; //取表長//
while(r.data[i].key!=k)
i--; //順序查找//
return(i);
}
演算法用了一點技巧:先將k存入監視哨,若對某個i(≠0)有r.data[i].key=k,則查找成功,返回i;若i從n遞減到1都無記錄的key為k,i再減1為0時,必有r.data[0].key=k,說明查找失敗,返回i=0。
平均查找成功長度ASL= ,而查找失敗時,查找次數等於n+l。
折半查找演算法及分析
當記錄的key按關系≤或≥有序時,不管是遞增的還是遞減的,只要有序且採用順序存儲。
演算法描述
int Binsearch(sqlist r,keytype k) //對有序表r折半查找的演算法//
{ int low,high,mid;
low=1;high=r.len; //上下界初值//
while(low<=high) //表空間存在時//
{ mid=(low+high)/2; //求當前mid//
if (k==r.data[mid].key)
return(mid); //查找成功,返回mid//
if (k
high=mid-1; //調整上界,向左部查找//
else
low=mid+1; //調整下界,向右部查找//
}
return(0); //low>high,查找失敗//
}
判定樹:用來描述二分查找過程的二叉樹。n個結點的判定樹的深度和n個結點的完全二叉樹深度相同= 。但判斷樹不一定是完全二叉樹,但他的葉子結點所在層次之差不超過1。所以,折半查找在查找成功時和給定值進行比較的關鍵字個數至多為
ASL=
分塊查找演算法及分析
分塊查找(Blocking Search),又稱索引順序查找(Indexed Sequential Search),是順序查找方法的一種改進,目的也是為了提高查找效率。
1.分塊
設記錄表長為n,將表的n個記錄分成b= 個塊,每塊s個記錄(最後一塊記錄數可以少於s個),即:
且表分塊有序,即第i(1≤i≤b-1)塊所有記錄的key小於第i+1塊中記錄的key,但塊內記錄可以無序。
2.建立索引
每塊對應一索引項:
KeymaxLink
其中Keymax為該塊內記錄的最大key;link為該塊第一記錄的序號(或指針)。
3.演算法思路 分塊索引查找分兩步進行:
(1)由索引表確定待查找記錄所在的塊;(可以折半查找也可順序因為索引表有序)
(2)在塊內順序查找。(只能用順序查找,塊內是無序的)
考研有疑問、不知道如何總結考研考點內容、不清楚考研報名當地政策,點擊底部咨詢官網,免費領取復習資料:https://www.87dh.com/xl/
『肆』 計算機進制的演算法,求過程
以前學過的都快忘記了,我剛去網上看了一下
十進制26.75轉化為二進制:
先整數跟小數分開:26.75=26+0.75
用整數部分去除以2:26/2=13----餘0,
13/2=6-----餘1,
6/2=3------餘0,
3/2=1------餘1,
即11010
然後用小數部分去乘以2:
0.75*2=1.5
取整是1
0.5*2=1
取整是1
即0.11
最後合起來11010.11(B)
十六進制F6.B8H轉化為8進制:應該可以直接轉化,我還不知道,你先可以把16進制轉化為2進制,然後把2進制轉化為8進制
還是跟上面一樣,先把整數跟小數分開
整數部分F6轉化為二進制:F6=1111
0110
二進制整數部分轉化為8進制:011
110
110
=366
小數部分B8轉化為二進制:B8=1011
1000
二進制小數部分轉化為8進制:010
111
000=270
即轉化為366.270(Q)
二進制
八進制
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7
二進制
十六進制
1111
=
8
+
4
+
2
+
1
=
15
F
1110
=
8
+
4
+
2
+
0
=
14
E
1101
=
8
+
4
+
0
+
1
=
13
D
1100
=
8
+
4
+
0
+
0
=
12
C
1011
=
8
+
0
+
2+
1
=
11
B
1010
=
8
+
0
+
2
+
0
=
10
A
1001
=
8
+
0
+
0
+
1
=
9
9
...........................
0001
=
0
+
0
+
0
+
1
=
1
1
0000
=
0
+
0
+
0
+
0
=
0
0