1 / 44

資料結構與演算法

資料結構與演算法. 課程教學投影片. 第二章–陣列. 2-1 何謂陣列 2-2 陣列型式和計量 2-3 陣列的走訪 2-4 矩陣運算. 2-1 何謂陣列 2-1-1 陣列概觀. 陣列的結構: 使用陣列( Array )來宣告變數時,則可以一次產生多個型態相同的資料,且可以利用迴圈結構中的註標( index )方便地指定到陣列中的位置取得資料,簡化程式的流程 程式範例: CH02-01 輸出: 1!+2!+3!+4!+5! 的加總值. 2-1-2 陣列結構. 陣列的定義:

teige
Download Presentation

資料結構與演算法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 資料結構與演算法 課程教學投影片

  2. 第二章–陣列 • 2-1 何謂陣列 • 2-2 陣列型式和計量 • 2-3 陣列的走訪 • 2-4 矩陣運算

  3. 2-1 何謂陣列2-1-1 陣列概觀 • 陣列的結構:使用陣列(Array)來宣告變數時,則可以一次產生多個型態相同的資料,且可以利用迴圈結構中的註標(index)方便地指定到陣列中的位置取得資料,簡化程式的流程 • 程式範例:CH02-01輸出:1!+2!+3!+4!+5!的加總值

  4. 2-1-2 陣列結構 • 陣列的定義:  一組具有相同資料型態(data type)的元素所組成的有序集合(ordered set)。在電腦中的實體配置空間時,陣列通常儲存在一塊連續的記憶體中。陣列包含名稱和註標,註標只有一個時稱為一維陣列,註標有二個時稱為二維陣列,以此類推,有n個註標稱為n維陣列。

  5. 2-1-2 陣列結構 • 陣列的特性: • 連續的記憶體空間 • 搭配一個以上的註標(index)可以方便存取陣列中的資料 • 有一維陣列,二維陣列..可擴充至n維陣列 • 在生活上的應用很多,比如使用電腦系統中符號表和記憶體的對應,可以快速的存取記憶體中的資料

  6. 2-1-2 陣列結構 • 陣列的宣告

  7. 2-1-2 陣列結構 • 陣列通常儲存在一塊連續的記憶體中 • 符號表中主要有三個項目:名稱、長度及位址 • 陣列名稱所包含的長度則是「資料型態的長度×陣列的空間個數」

  8. 2-2 陣列型式和計量 • 陣列形式是指在陣列中所存放元素的資料型態,例如整數,字元等等。 • 陣列計量是指計算陣列的儲放空間數,(或稱個數)或所佔位元組數。

  9. 2-2-1 一維陣列 • 一維陣列的宣告範例: int A[]=new int[10] — Java語言,範圍從0到9 int A[10] — C語言,範圍從0到9 Dim A(10) As Integer — VB ,範圍從0到10 • 如果是Visual Basic 6.0版本,則其註標範圍可能是從0到10,也可能是從1到10,則陣列的空間個數可能為11或10個。 • VB.NET、VB 2005版本,其註標範圍是從0到10,因為已捨去Option Base敘述,且內定起始註標是0,所以陣列的空間個數為11。 • 一個陣列存放1、3、5、7、9的奇數為例: Sub odd_array2 Dim i , odd2(5) as integer For i = 1 to 5 odd2(i) = 2 * i - 1 Next i End Sub

  10. 2-2-1 一維陣列 • 一維陣列位址計算:odd2[0]的位址= kodd2[1]的位址= k + 1*2 = k + 2odd2[2]的位址= k + 2*2 = k + 4odd2[3]的位址= k + 3*2 = k + 6

  11. 2-2-2 二維陣列 • 二維陣列的宣告範例: int A[][]=new int[10][10] — Java語言 int A[10][10] — C語言 Dim A(10,10) As Integer — VB

  12. 2-2-2 二維陣列

  13. 2-2-2 二維陣列 • 轉換二維空間為一維空間時,其編號方式有兩種: • 以列為主(row major):由i列要跳至(i+1)列時,必須先走訪完i列,即列先走訪,由左而右,再由上而下。 • 以行為主(column major):由上而下,再由左而右。

  14. 2-2-2 二維陣列

  15. 2-2-2 二維陣列 • 範例1 Java語言宣告short NO[][]=new short[2][4](以列為主);如果起始位址182010,則陣列NO存放在記憶體中的情形如何?又NO[i][j]的序號為何?位址為何?

  16. 2-2-3 三維陣列 • 三維陣列的宣告範例: int A[][][]=new int[10][10][10] — Java語言 int A[10][10][10] — C語言 Dim A(10,10,10) As Integer — VB • 如果Java語言宣告一陣列為byte sym[][][]=new byte[m][n][p],且sym的起始位址是a,資料型態的位元組數是b時,則序號可用f(i,j,k)、位址可用addr(i,j,k)來表示,則f(i,j,k)與addr(i,j,k)的關係如下:

  17. 2-2-3 三維陣列 • 三維陣列sym [m][n][p]是先走訪p,再走訪n,最後走訪m,如圖2-8所示,所以由(0,0,0)到(0,0,p-1)時,走訪過p個陣列,由(0,0,0)到(0,n-1,p-1)時走訪過n*p個,從(0,0,0)到(i-1,n-1,p-1)時走訪過i*n*p個(即圖2-8所示的體積)

  18. 2-2-3 三維陣列 • 範例2: 宣告一個陣列byte A[][][]=new byte[2][3][4],且A的起始位址是1234,則A[0][2][3]的位址為何?A[i][j][k]的位址為何?

  19. 2-2-3 三維陣列 • 範例2:(程式範例2-2)在VB程式設計中,示範宣告陣列的方式,且用陣列的成員函數取得陣列的維數、個數、下限值、上限值等。

  20. 2-2-4 對角線陣列 • 對角線陣列

  21. 2-2-5 上下三角形陣列 • 當一個陣列的所有元素皆放在對角線的上方時,其餘者放0,則此陣列稱為上三角形(upper triangular)陣列 • 下三角形陣列同理

  22. 2-2-5 上下三角形陣列 • 一個上下三角形矩陣n×n,其總個數為n2個,存放資料的個數可由數學公式推演得知1+2+3+...+n=

  23. 2-2-6 三對角線陣列 • 三對角線陣列(tridiagonal array)是一個方形陣列,且其中只在主對角線及其相鄰的上下二條對角線存在資料,其餘者皆是0,則此陣列共可存放n+(n-1)+(n-1)=3n-2個資料

  24. 2-2-6 三對角線陣列 • 如果[0][0]位置的編號是0,則 | i - j | ≤ 1,[i][j]位置的編號f(i,j)=2i+j,如圖2-14。

  25. 2-2-6 三對角線陣列

  26. 2-2-7 方形帶狀陣列 • 方形帶狀陣列(square band array)是一個n×n的方形矩陣,其中對角線和上下距離a的對角線皆可存放資料,其餘皆為0,則此陣列共可存放(2an+n-a2–a)個

  27. 2-3 陣列的走訪2-3-1 一維陣列的走訪 • 一維陣列走訪:一維陣列的走訪只要是利用一個迴圈,走訪方法有由小到大,由大到0、奇數、偶數和索引表走訪 • 範例5:【由小到大走訪】設計一個陣列NO[10],陣列分別存入 的值,0≦i≦9,即NO[i]= ,NO[0]=0 '計算陣列的值 iSum(0) = 0 For i = 1 To 10 iSum(i) = iSum(i - 1) + i Next '循序走訪陣列 0~10 For i = 0 To 10 Console.WriteLine("iSum(" & i & ") = " & iSum(i)) Next

  28. 2-3-1 一維陣列的走訪 • 範例6:設計一個陣列iExp(10),由小而大分別放入20,21………..,27,28,29的值。 '計算陣列的值 iExp(0) = 1 For i = 1 To 10 iExp(i) = iExp(i - 1) * 2 Next '循序走訪陣列 0~10 For i = 0 To 10 Console.WriteLine("iExp(" & i & ") = " & iExp(i)) Next

  29. 2-3-1 一維陣列的走訪 • 範例7:【偶數順序、奇數順序走訪】設計一陣列iNo(10),在其偶數註標(含0)放入1、11、21、31、41,在奇數註標放入0、-10、-20、-30、-40。 • ‘計算奇數陣列的值For i = 0 To 9 Step 2 iNo(i) = i/2 * 10 + 1Next‘計算偶數陣列的值For i = 1 To 9 Step 2iNo(i) = -(i - 1) / 2 * 10Next

  30. 2-3-1 一維陣列的走訪 • 範例7中的偶數註標位置放入1、11、21、31、41的運算式是i/2*10+1(或i*5+1),這個式子如何得到呢?

  31. 2-3-1 一維陣列的走訪 • 範例8:【依索引表走訪】假設有一個資料陣列data(7)如右(VB宣告方式): • 另一個索引陣列index(7)存放陣列data被走訪的順序,如右: • 則依據索引陣列index 的順序走訪4 2 6 7 0 3 1 5走訪,以index陣列的值當成data陣列的走訪註標,則讀取陣列data值的順序為10 20 30 40 50 60 70 80。

  32. 2-3-1 一維陣列的走訪 • Private Sub Form1_Load(ByVal sender As System.Object, ByVal e _ • As System.EventArgs) Handles MyBase.Load • Dim i As Integer • Dim head As Integer = 4 • ' 宣告陣列資料且給予值 • Dim data() As Integer = {50, 70, 20, 60, 10, 80, 30, 40} • Dim index() As Integer = {3, 5, 6, 1, 2, -1, 7, 0} • ' 先輸出資料表頭 • Console.WriteLine("資料個數 => " & index.GetUpperBound(0) + 1) • Console.WriteLine(" index data") • ' 依index陣列個數來索引走訪 • For i = 0 To index.GetUpperBound(0) • ' 輸出目前head索引所指到的data陣列值 • Console.WriteLine("順序 " & i & " => " & head & " ==> " & data(head)) • ' head索引依index陣列指到下一個索引值 • head = index(head) • Next • End Sub

  33. 2-3-2 二維陣列的走訪 • 二維陣列的走訪: • 對角線走訪 • 由左而右,再由上而下走 • 由上而下,再由左而右走 • 上下三角形走訪 • 範列9:[對角線走訪]只走訪對角線元素,例如在一個5×5的陣列中,(0,0)、(1,1)、(2,2)、(3,3)、(4,4)位置分別放入20 、21 、23 、24的值 (程式範例02-07) 。 • ‘ 建立陣列資料For i = 0 To 4 For j = 0 To 4 If i = j Then data(i, j) = 2 ^ I Else data(i, j) = 0 End If Next Next

  34. 2-3-2 二維陣列的走訪 • 範例10:[由左而右,由上而下走訪]設計一個4×6的陣列,以行為主的方式,分別放入0、1、..........、23的數值 (程式範例02-08 ) 。 • ‘ 建立陣列資料count = 0 For i = 1 To 4 For j = 1 To 6 data(i, j) = count count += 1 Next Next

  35. 2-3-2 二維陣列的走訪 • 範例11:[由上而下,由左而右走訪]設計一個4×6的陣列,以列為主的方式,分別放入0、1、2、3………..、23的數值(程式範例02-09 ) 。 • ‘ 建立陣列資料count = 0 For j = 1 To 6 For i = 1 To 4 data(i, j) = count count += 1 Next Next

  36. 2-3-2 二維陣列的走訪 • 範例12:[上三角形走訪]設計一個5×5的陣列,走訪上三角形放入數值1、2、3…..、14、15 (程式範例02-10) 。 • ‘ 建立陣列資料count = 1 For i = 1 To 5 For j = i To 5 data(i, j) = count count += 1 Next Next

  37. 2-3-2 二維陣列的走訪 • 範例13:[下三角形走訪]設計一個5×5的陣列,走訪下三角形放入數值1、2、3………..15(程式範例02-11) 。 • ‘ 建立陣列資料count = 1 For i = 1 To 5 For j = 1 To I data(i, j) = count count += 1 Next Next

  38. 2-4 矩陣運算2-4-1 概觀

  39. 2-4 矩陣運算2-4-1 概觀 • 矩陣的註標是從1開始,而程式語言的註標一般是從0開始 矩陣A2×3,C、Java語言宣告陣列為A[3][4]如下: • 宣告陣列的維數和矩陣相同矩陣A2×3,C、Java語言宣告陣列為A[2][3],如下:

  40. 2-4-2 矩陣加法、減法 • 假設二矩陣Am×n、Bm×n,如果矩陣C=A+B,則 ,1≦i≦m,1≦j≦n • 範例14:A、B陣列如下(註標0者不處理),計算矩陣C=A+B(程式範例02-12) • ' 矩陣加法 For i = 1 To 3 For j = 1 To 2 C(i, j) = A(i, j) + B(i, j) Next Next

  41. 2-4-3 矩陣乘法 • 矩陣相乘是兩個矩陣A、B,A的維數是m×n,B的維數是n×p,則C = A×B,可得到C的維數是m×p,其運算公式如下:

  42. 2-4-3 矩陣乘法 • ' 矩陣加法 A矩陣是 m x n,B矩陣是 n x p,C矩陣是 m x p For i = 1 To m For j = 1 To n For k = 1 To p C(i, k) = C(i, k) + A(i, j) * B(j, k) Next Next Next

  43. 2-4-4 矩陣轉置 • 如果有一矩陣Am×n,若把矩陣A的列(row)轉成行(column),把行轉成列所成的矩陣B,稱為A的轉置矩陣,可用 表示,且維度變成n×m,且符合 ,如下:

  44. 2-4-4 矩陣轉置 • 程式範例02-14‘ 矩陣轉置For i = 1 To m For j = 1 To n B(j, i) = A(i, j) Next Next

More Related