Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 2: Mảng trình bày khái niệm về mảng, biểu diễn mảng 1 chiều, biểu diễn mảng 2 chiều, các phép toán trên mảng 1D, các phép toán trên mảng 2D.
Cấu trúc liệu giải thuật Bài MẢNG Lecturer: PhD Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University Bài Mảng Nội dung: Khái niệm mảng Biểu diễn mảng chiều (1D) Biểu diễn mảng chiều (2D) Các phép toán mảng 1D Các phép toán mảng 2D Tham khảo: Deshpande Kakde – C and data structures Chapter 18 – Arrays, Searching, and Sorting Chapter 23 – Problem in Arrays, Searching, Sorting, and Hashing @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.1 Khái niệm mảng (1/2) Mảng cấu trúc liệu người dùng định nghĩa, có kích thước cố định đồng Theo tính chất đồng nhất, thành phần có kiểu, gọi element type base type Theo tính chất có kích thước cố định, ta khơng thể thay đổi kích thước mảng sử dụng Mảng coi cấu trúc liệu cho phép truy cập ngẫu nhiên thông qua số chúng @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.1 Khái niệm mảng (2/2) Các thành phần mảng truy cập thông qua số, số số nguyên để vị trí thành phần mảng Như vậy, mảng hình thành cặp (value, index); Nếu số số, mảng gọi mảng chiều Nếu số có dạng {i1, i2, i3,… , in}, mảng gọi mảng n chiều @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.2 Biểu diễn mảng chiều (1D) (1/3) • Mảng thể nhớ ánh xạ • Đặc tính ánh xạ cho phần tử mảng có “khoảng cách” cố định với phần tử đầu mảng • Như vậy, phần tử thứ i ánh xạ tới vị trí a phần tử thứ (i+1) ánh xạ tới vị trí (a+1) @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.2 Biểu diễn mảng chiều (1D) (2/3) @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.2 Biểu diễn mảng chiều (1D) (3/3) Địa phần tử mảng gọi địa sở (base address - LB) • Địa phần tử thứ i xác định: Base address + offset of the ith element from base address đó, offset tính: Offset of the ith element = number of elements before the ith * size of each element • Nếu LB lower bound (cận dưới), offset xác định: offset = (i − LB) * size • @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.3 Biểu diễn mảng chiều (2D) (1/5) • Mảng chiều hiểu thơng qua mảng 1D, đó, phần tử mảng 1D – Mảng Mảng • Mảng 2D xem cột hàng • Cách biểu diễn gọi row-major representation @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.3 Biểu diễn mảng chiều (2D) (2/5) @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.3 Biểu diễn mảng chiều (2D) (3/5) Địa phần tử hàng i, cột j xác định: addr(a[i, j]) = ( number of rows placed before ith row * size of a row) + (number of elements placed before the jth element in the ith row * size of element) đó: Number of rows placed before ith row = (i – LB1), với LB1 lower bound chiều thứ Size of a row = number of elements in a row * a size of element Number of elements in a row = (UB2 – LB2+1), với UB2 LB2 cận cận chiều thứ Như vậy: addr(a[i, j]) = ((i−LB1)*(UB2−LB2+1)*size)+((j−LB2)*size) 10 @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.3 Biểu diễn mảng chiều (2D) (5/5) Địa phần tử có hàng i, cột j xác định: addr(a[i, j]) = ( number of columns placed before jth column * size of a column) + (number of elements placed before the ith element in the jth column * size of each element) Number of columns placed before jth column = (j − LB2), với LB2 cận chiều thứ Size of a column = number of elements in a column * size of element Number of elements in a column = (UB1 – LB1 + 1), với UB1 LB1 cận cận chiều thứ Như vậy: addr(a[i, j]) = ((j − LB2) * (UB1 − LB1+1) * size) + ((i − LB1)*size) addr(a[i, j]) = ((i−LB1)*(UB2−LB2+1)*size)+((j−LB2)*size) 12 @Copyright Dr Ngo Huu Phuc, Le Quy Don Technical University 2.4 Một số ví dụ mảng (1/14) Ví dụ 1: Chương trình cho phép truy cập tới thành phần danh sách void read(int c[], int i) { int j; #include #include void read(int *,int); void dis(int *,int); void main() { int a[5],i,sum=0; printf("Nhap cac phan tu cho mang \n"); read(a,5); printf("Gia tri cua cac phan tu mang \n"); dis(a,5); getch(); } 13 for(j=0;j