430 likes | 477 Views
This review covers the fundamentals of abstract data types, their representation strategies in memory, and practical examples in C++ programming. It delves into arrays, structures, unions, and self-referential structures, emphasizing the separation of data type specification and implementation.
E N D
Review of Chapter 2 Arrays • 1.3 Data Abstraction and Encapsulation • 2.2 The Array As An abstract Data Type • 2.5 The Representation of Arrays • Example • 2.3 The Polynomial Abstract Data Type • 2.4 The Sparse Matrix Abstract Data Type • 2.6 The String Abstract Data Type
定義:Data Type A data type is a collection of objects and a set of operations that act on those objects. 定義:Abstract Data Type An abstract data type(ADT) is a data type that is organized in such a way that the specification of the objects and the operations on the objects is separated from the representation of the objects and the implementation of the operations.
資料型態 • Data Types • Primitive Data Types • Accumulated Data Types - Array - Structures - Union • Abstract Data Types • Examples
表一:C++ 的基本資料型態 Example: Data Type of C++
Accumulated Data Type • Array • Struct • Union
如何理解 Abstract Data Types • ADTs 是一個物件的型態的抽象定義具有一般化的特性,其中也包含這個物件相關的操作。 • Data Structures 課程,旨在瞭解每一個 ADT,要用什麼樣的結構來表達與儲存,而這樣的表達與儲存方式,又對於該物件的操作帶來什麼樣的優缺點。亦即關注在二個重點: • 物件儲存與表達方式(資料結構) • 物件操作方式(演算法)
The Array as an Abstract Data Type • Array • A collection of data of the same type • An array is usually implemented as a consecutive set of memory locations • int list[5], *plist[5] • ADT definition of an Array • More general structure than "a consecutive set of memory locations.“ • An array is a set of pairs, <index, value>, in mathematical, call correspondence or mapping
class GeneralArray { // objects: A set of pairs <index, value> where for each value of index in // IndexSet there is a value of type float. IndexSet is a finite ordered set of one // or more dimensions, for example, {0, …, n - 1} for one dimension, {(0, 0), // (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)} for two dimensions, etc.public: GeneralArray(intj, RangeList list, floatinitValue = defaultValue) ; // The constructor GeneralArray creates a j dimensional array of floats; the // range of the kth dimension is given by the kth element of list. For each // index i in the index set, insert <i, initValue> into the array. floatRetrieve(indexi) ; // if (i is in the index set of the array) return the float associated with i in the // array; else signal an error. voidStore(indexi, float x) ; // if (i is in the index set of the array) delete any pair of the form <i, y> // present in the array and insert the new pair <i, x>; else signal an error. } ; // end of GeneralArray
Array(陣列) • 陣列是用來存放同樣型態的資料 • 陣列的大小必須在程式中預先設定 • 在程式執行中,陣列的大小無法改變 • 陣列中的資料是透過索引(index)來存取 const int ArraySize = 100; int iArray[ArraySize];
7 51 22 43 9 0 1 2 98 99 一維陣列和記憶體間的對應 Memory m m + 2 m + 4 m + 6 int iArray[100]; m + 198 假定 sizeof(int) = 2
多維陣列和記憶體間的對應 Memory m m + 22 6 m + 44 5 4 m + 66 3 m + 88 2 m + 110 1 0 m + 132 0 1 2 3 4 5 6 7 8 9 10 int mesh[7][11]; 假定 sizeof(int) = 2
多維陣列的宣告 typearray_name[arraySize1] ...... [arraySizen]; 【範例】 int mesh[7][11]; float cube[6][8][3]; 6 5 4 5 4 3 3 2 2 1 1 2 0 1 0 0 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 10
5 4 3 2 1 2 0 1 0 0 1 2 3 4 5 6 7 float cube[6][8][3]; m m + 48 m + 96 m + 144 m + 192 m + 240 m + 288 假定 sizeof(int) = 2
struct 和記憶體間的對應 m struct studentType { char Name[20]; // 姓名 char Address[30]; // 地址 char PhoneNumber[10]; // 電話 int Age; // 年齡 char Department[4]; // 系別 int Year; // 年級 char Class; // 班級 }; studentType Student1, Student2; m + 20 m + 50 m + 60 m + 62 m + 66 m + 68 假定 sizeof(int) = 2
Self-Referential Structures One or more of its components is a pointer to itself. typedef struct list { char data; list *link; } list item1, item2, item3; item1.data=‘a’; item2.data=‘b’; item3.data=‘c’; item1.link=item2.link=item3.link=NULL; Construct a list with three nodes item1.link=&item2; item2.link=&item3; malloc: obtain a node a b c
union { field1 declaration; field2 declaration; } variable_name; typedef union { field1 declaration; field2 declaration; } type_name; union 的宣告 宣告變數 宣告型態 【範例】 union { char charValue; int intValue; float floatValue; } dataCell; typedef union { char charValue; int intValue; float floatValue; } dataCellType;
union 和記憶體間的對應 union { char charValue; /* 1 byte */ int intValue; /* 2 byte */ float floatValue; /* 4 byte */ } dataCell; m m + 4 typedef struct { char opcode; union { int intValue; char strValue[256]; } data; } instruction; m m+1 m+5 m + 257
Example • Ordered List • Polynomial ADT • Sparse Matrix ADT • String ADT
Ordered List Examples ordered (linear) list: (item1, item2, item3, …, itemn) • (MONDAY, TUEDSAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAYY, SUNDAY) • (2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, ACE) • (1941, 1942, 1943, 1944, 1945) • (a1, a2, a3, …, an-1, an) • ()
Operations on Ordered List • Find the length, n , of the list. • Read the items from left to right (or right to left). • Retrieve the i’th element. • Store a new value into the i’th position. • Insert a new element at the position i , causing elements numbered i, i+1, …, n to become numberedi+1, i+2, …, n+1 • Delete the element at position i , causing elements numbered i+1, …, n to become numbered i, i+1, …, n-1 array (sequential mapping)? (1)~(4) O (5)~(6) X
Addition: Multiplication: Polynomial(多項式)
classPolynomial { // objects:p(x) = a0xe0 + … + anxen; a set of ordered pairs of <ei, ai>, where // ai∈Coefficient and ei ∈ Exponent // We assume that Exponent consists of integer ≥0 public: Polynomial() ; // return the polynomial p(x) = 0 intoperator!() ; // if *this is the zero polynomial, return 1; else return 0; CoefficientCoef(Exponente) ; // return the coefficient of e in *this ExponentLeadExp() ; // return the largest exponent in *this Polynomial Add(Polynomialpoly) ; // return the sum of the polynomials *this and poly PolynomialMult(Polynomial poly); // return the product of the polynomials *this and poly floatEval(float f) ; //Evaluate the polynomial *this at f and return the result. }; // end of Polynomial
Polynomial: Representation 1 • Representation by Degrees private intdegree; // degree MaxDegree floatcoef [MaxDegree + 1]; • Example: Let A(x)=Σaixi, then a.degree= n, a.coef[i]=an-i, ,0<= i<= n
n degree coef 0 1 2 n-1 n Polynomial: Representation 1
Polynomial: Representation 2 • Representation by Degrees, but dynamic allocation space private: int degree; //degree <= MaxDegree float *coef; polynomial::polynomial(int d) { degree= d, coef=new float[degree+1]; }
Polynomial: Representation 3 • Representation by Terms. Class polynomial; Class term { Friend polynomial; private: int exp float coef; }; • In polynomial class • In Implement file of polynomial class private: static term termArray[MaxTerms]; // MaxTerms is a constant. // termArray[MaxTerms] shared by all polynomial objects. static int free; int start, finish; term Polynomial::termArray[MaxTerms]; int polynomial::free = 0;
Polynomial: Representation 3-1 A(X)=2X1000+1 B(X)=X4+10X3+3X2+1 A.start A.finish B.start B. finish free coef exp 0 1 2 3 4 5 6 • In general, A.Finish = A.Start + n –1. • For zero polynomial, A.Finish = A.Start – 1
Polynomial: Representation 3-2 k numTerm ? coef 0 1 2 k-1 ? expon 0 1 2 k-1
操作分析 • 多項式相加 • As Representation 3,we take O(m+n) at time complexity,if A(x) has m terms, B(x) has n terms. See Book pp.83-84 • 多項式相乘
Sparse Matrix col1 col2 col3 col4 col5 col6 row0 row1 row2 row3 row4 row5 5*3 6*6 (a) (b) *Figure 2.3:Two matrices 15/15 8/36 sparse matrix data structure?
若以二維陣列的表示法: #define MAX_ROW 100 #define MAX_COL 100 typedef int matrix[MAX_ROW][MAX_COL]; matrix m1, m2; 來儲存稀疏矩陣,那麼,矩陣中含有許多的 0。有沒有必要 儲存這些 0 呢?有沒有比較節省記憶體空間的另類表示法?
Abstract Data Type Sparse Matrix classSparseMatrix { //objects: a set of triples, <row, column, value>, where row and column are integers and // form a unique combination, and value comes from the set item. public: SparseMatrix(int MaxRow, int MaxCol); //create a SparseMatrix that can hold up to MaxItems= MaxRow*MaxCol and whose //maximum row size is MaxRow and whose maximum column size is MaxCol SparseMatrix Transpose(); // return the matrix produced by interchanging the row and column value of every triple. SparseMatrix Add(SparseMatrix b); //if the dimensions of a(*this) and b are the same, return the matrix produced by adding //corresponding items, namely those with identical row and column values. else return //error. SparseMatrix Multiply(a, b); //if number of columns in a equals number of rows in b return the matrix d produced by //multiplying a by b according to the formula: d[i][j]= Sum(a[i][k](b[k][j]), //where d(i, j) is the (i, j)th element, k=0 ~ ((columns of a) –1) else return error. };
Representation of Sparse Matrix classSparseMatrix; class MatrixTerm { friend classSparseMatrix private: int col, row, value; }; • In class SparseMatrix private: int col, row,Terms; MatrixTerm smArray[MaxTerms]; // Note: triples are ordered by row and within rows by columns
col 0 1 2 3 4 5 term row 0 15 0 0 22 0 -15 0 11 3 0 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28 0 0 0 row 1 row 2 row 3 row 4 row 5 row col value a[0] 0 0 15 a[1] 0 3 22 a[2] 0 5 -15 a[3] 1 1 11 a[4] 1 2 3 a[5] 2 3 -6 a[6] 4 0 91 a[7] 5 2 28
Sparse Matrix 運算分析 • 轉置 (transpose) • 相加 • 相乘
Abstract Data Type String Class String { //objects: a finite set of zero or more characters. public: String (char *init, int m); //Constructor that initializes *this to string init of length is m. intoperator==(string t); // if the string represented by *this equal string t return 1(true) else return 0(false) int operator!(); // if *this is empty then return 1(TRUE); else return 0 (FALSE). intLength(); //return the number of characters in *this. String Concat(String t); //return a string whose elements are those of *this followed by those of t. String Substr(int i, int j); //return the string containing j characters of *this at positions i, i+1, ..., i+j-1, //if these are valid positions of *this; else return empty string. intFind(String pat); //return an index i such that pat matches the substring of *this that begins at //position i. Return –1 if pat is either empty or not a substring of *this. };
Pattern Matching • Given two strings, string and pat, where pat is a pattern to be searched for in string • Two methods • a simple algorithm • O(S*P) O(n2) • optimal algorithm (by Knuth-Morris-Pratt) • Linear complexity • O(S+P) O(n)
a a a a b b pattern pattern a b a b b a a a a a no match a b a b b a b a a a match A simple algorithm O(n*m)
The Failure Function • Definition • If p= p0p1. . .pn-1 is a pattern, then its failure function, f is defined as: f(j) = largest i< j such that p0p1. . .pi= pj-ipj-i+1. . .pj , i>= 0 = -1, otherwise • Example j 0 1 2 3 4 5 6 7 8 9 pat a b c a b c a c a b f -1 -1 -1 0 1 2 3 -1 0 1
Rule for Optimal Pattern Matching • If a partial match is found such that si-j. . .si-1= p0p1. . .pj-1 and si<>pj then matching may be resumed by comparing si and pf(j-1)+1 if j<>0. If j= 0, continue by comparing si+1 and p0 string a b c a ? ? . . . ? pat a b c a b c a c a b f -1 -1 -1 0 1 2 3 -1 0 1 Continue here
Example of Optimal Pattern Matching j 0 1 2 3 4 5 6 7 8 9 pat a b c a b c a c a b f -1 -1 -1 0 1 2 3 -1 0 1 str c b a b c a a b c a b c a b c a c a b