Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
428,16 KB
Nội dung
Cấu trúc liệu Giải thuật Cấu trúc liệu Giải thuật Chương III: Mảng Danh sách Mảng Danh sách Nội dung – Cấu trúc liệu Mảng Lưu trữ Mảng chiều Lưu trữ Mảng chiều Các phép toán cấu trúc Mảng – Danh sách tuyến tính Lưu trữ Lưu trữ móc nối Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Kiểu liệu trừu tượng Mảng Đối tượng Mảng: – – – Một tập cặp (index, item) Với giá trị index có giá trị tương ứng item Index tập có thứ tự có chiều nhiều chiều Index chiều : {0, 1, 2, …, n-1} Index chiều : {(0,0) , (0,1), (0,2), …,(0,n), (1,0), (1,1) ….} Kiểu liệu trừu tượng Mảng Các phép toán – – – Create(j, list) : tạo mảng có j chiều, list j-bộ với phần tử thứ k list kích thước chiều thứ k mảng Retrieve(A,i) : Trả giá trị phần tử nhận số i có Store(A,i,x) : Trả mảng giống mảng A cho ban đầu, khác cặp (i,x) bổ sung vào vị trí Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Cấu trúc liệu Mảng Mảng dãy phần tử đánh số Khi cài đặt máy tính, mảng lưu trữ dãy nhớ liên tiếp nhớ Kích thước mảng xác định khởi tạo không thay đổi Mỗi phần tử mảng có số xác định Truy xuất vào phần tử mảng sử dụng số phần tử Mảng ngôn ngữ lập trình – Tập số mảng khác C, Java : số số nguyên, liên tục, Pascal : số có giá trị rời rạc Perl: cho phép số số – – Mảng khơng Mảng có thêm thơng tin bổ sung ngồi phần tử Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Mảng chiều – Khởi tạo Cần số phần tử mảng Khai báo mảng C: [size] – – – int list[5]; char word[25]; Tham chiếu Các phần tử mảng chiều tham chiếu đến sử dụng địa tính – int list [5] địa sở = α α + sizeof(int) α + 2*sizeof(int) α + 3*sizeof(int) α + 4*sizeof(int) list[0] list[1] list[2] list[3] list[4] Mảng chiều int list[] = {0, 1, 2, 3, 4}; Address Value int *ptr; int rows = 5; 1228 int i; ptr = list; 1230 1232 1234 1236 printf(“Address Value\n”); for (i=0; i < rows; i++) printf(“%8u%5d\n”, ptr+i, *(ptr+i)); printf(“\n”); Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Mảng chiều – Khai báo Cần số hàng, số cột Trong C : [size1] [size2] – int table[4][5]; Truy xuất phần tử – – table[i][j] Lưu trữ mảng chiều nhớ máy tính Theo thứ tự ưu tiên hàng Theo thứ tự ưu tiên cột Mảng chiều – Lưu trữ mảng chiều theo thứ tự ưu tiên hàng a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32 a00 a01 a02 Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN a10 Từ mảng chiều lưu trữ sang nhớ sử dụng thứ tự ưu tiên hàng a11 a12 a20 a21 a22 a30 a31 a32 Cấu trúc liệu Giải thuật Mảng chiều – Lưu trữ mảng chiều theo thứ tự ưu tiên cột a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32 a00 a10 a20 a30 Từ mảng chiều lưu trữ sang nhớ sử dụng thứ tự ưu tiên cột a01 a11 a21 a31 a02 a12 a22 a32 Danh sách tuyến tính – – – – – – Danh sách tập hợp có thứ tự gồm số biến động phần tử kiểu {a1, a2, …., an-1, an} phần tử vị trí i danh sách a1 phần tử đầu tiên, an phần tử cuối danh sách n độ dài danh sách thời điểm Trường hợp n =0 ta có danh sách rỗng Trong danh sách tuyến tính, thứ tự trước sau phần tử xác định rõ ràng Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Các cách cài đặt danh sách tuyến tính – Dùng Mảng: Lưu trữ phần tử danh sách vector lưu trữ bao gồm ô nhớ liên tiếp – Dùng Con trỏ: Các phần tử lưu trữ ô nhớ vị trí tùy ý nhớ Các phần tử liên kết với trỏ – Dùng địa gián tiếp Các phần tử lưu trữ nhớ vị trí tùy ý nhớ Có mảng địa phần tử thứ i mảng chứa địa phần tử thứ i danh sách Lưu trữ danh sách – Danh sách lưu trữ phần nhớ bao gồm ô nhớ liên tiếp Các phần tử liền kề lưu trữ ô nhớ liền kề Mỗi phần tử danh sách gán số thứ tự lưu trữ vector Có số last dùng để xác định số phần tử cuối danh sách A Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN i last max Cấu trúc liệu Giải thuật Lưu trữ danh sách – Khai báo danh sách sử dụng lưu trữ C #define max 100 typedef etype integer typedef struct LIST{ etype elements[max]; int last; } LISTTYPE Lưu trữ danh sách – Ưu điểm cách lưu trữ Tốc độ truy cập vào phần tử danh sách nhanh – Nhược điểm cách lưu trữ Cần phải biết trước kích thước tối đa danh sách – Tại sao? Thực phép toán bổ sung phần tử loại bỏ phần tử cũ tốn – Tại sao? Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Các thao tác danh sách – Bổ sung phần tử vào vị trí p danh sách A p p last x p last last A A Các thao tác danh sách Procedure INSERT-LIST(L, x, p) Begin { L danh sách lưu trữ dạng mảng, x giá trị phần tử mới, p vị trí phần tử mới, L có số tối đa max phần tử , last số phần tử cuối danh sách } {Danh sách đầy} if (last > max) then ERROR; {Kiểm tra giái trị p} else if (p > last ) OR (p < 1) then ERROR; else begin {Dịch chuyển phần tử, tạo ô trống để bổ sung} for i = last down to p L[i+1] = L[i]; {Lưu giá trị vào vị trí p} L[p] = x; last = last+1; {Số lượng phần tử danh sách tăng thêm 1} end End Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN Cấu trúc liệu Giải thuật Các thao tác danh sách – Loại bỏ phần tử danh sách A x p last p last A A p last Các thao tác danh sách Procedure DELETE-LIST(L, p) Begin { Loại bỏ phần tử vị trí p danh sách L L có tối đa max phần tử , phần tử cuối vị trí last} {Kiểm tra p} if (p > last ) OR (p info = value; temp->next = NULL; previous = NULL; current = *startPtr; while (current != NULL && value >current->info) { previous = current; current = current->next; } if (previous = NULL) { temp->next = *startPtr; *startPtr = temp; } else { previous->next = temp; temp->next = current; } } } int DELETE_ORDER( LISTNODEPTR *startPtr, int value){ /* Chương trình bổ sung nút vào danh sách có xếp theo chiều tăng dần giá trị phần tử */ LISTNODEPTR temp, current, previous ; if (value == (* startPtr) -> info ) { temp = *startPtr; *startPtr = (* startPtr) -> next; free(temp); return value; }else { previous = *startPtr; current = (*startPtr) -> next; while(current != NULL && current->info != value){ previous = current; current = current->next; } if (current != NULL) { temp = current; previous->next = current->next; free(temp) ; return value; } } return ‘\0’; } Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 18 Cấu trúc liệu Giải thuật Danh sách nối kép Qui cách nút danh sách nối kép prev next info – – – L nút Trường PREV nút trường NEXT nút cuối có giá trị NULL Cần nắm hai trỏ, trỏ L trỏ tới nút cực trái, trỏ R trỏ tới nút cực phải danh sách Với danh sách rỗng , L = R = NULL B C G H R Danh sách nối kép – Khai báo danh sách nối kép C struct dlnode{ int info; struct dlnode *next; struct dlnode *prev; }; typedef struct dlnode DLNODE; typedef DLNODE *DLNODEPTR; DLNODEPTR left, right; Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 19 Cấu trúc liệu Giải thuật Các thao tác danh sách nối kép Bổ sung phần tử vào sau nút trỏ trỏ M biết trước B L C G R H M L B C G H R X M L B C G H R X Các thao tác danh sách nối kép Giải thuật bổ sung phần tử vào danh sách nối kép Procedure INSERT-DOUBLE (L, R, M, X) {Bổ sung phần tử chứa liệu X vào sau phần tử trỏ M} {Tạo lập nút mới} call New(p) ; {xin cấp phát nút có địa p} INFO(p) := X; {Danh sách rỗng} if L = R= NULL then begin PREV(p):= NEXT(p) := NULL; L:= R:=p; return; end; (Cịn tiếp) Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 20 Cấu trúc liệu Giải thuật Các thao tác danh sách nối kép Bổ sung vào danh sách nối kép (tiếp) {Trường hợp M nút cực phải} if M = R then begin NEXT(p) := NULL; PREV(p) := M; NEXT(M) := p; R:= p; end; { Bổ sung vào giữa} PREV(p) := M; NEXT(p) := NEXT(M); PREV(NEXT(M)) := p; NEXT(M) := p; return Các thao tác danh sách nối kép Loại bỏ phần tử L B C G H R M L B Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN C G H R 21 Cấu trúc liệu Giải thuật Các thao tác danh sách nối kép Giải thuật loại bỏ phần tử khỏi danh sách nối kép Procedure DELETE-DOUBLE (L, R, M) {Loại bỏ phần tử trỏ M } {Danh sách rỗng} if L= R= NULL then return; {Loại bỏ} if L= R and L = M then L:=R:= NULL; else if M = L then begin L:= NEXT(L); PREV(L) := NULL; end; else if M = R then begin R:= PREV(R); NEXT(R) := NULL; end; else begin NEXT(PREV(M)) :=NEXT(M); PREV(NEXT(M)) := PREV(M); end; call Dispose(M); return Biểu diễn đa thức sử dụng danh sách – Bài toán cộng hai đa thức Dạng tổng quát đa thức P ( x ) = an x n + an −1 x n −1 + + a1 x + a0 A( x ) = x − x + x + x − B( x) = x + x − x + x − x Viết giải thuật tìm tổng đa thức Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 22 Cấu trúc liệu Giải thuật Cách tiếp cận sử dụng danh sách Biểu diễn đa thức sử dụng danh sách lưu trữ Mỗi số hạng đa thức ứng với phần tử vector lưu trữ Một vector có kích thước n có phần tử đánh số từ đến n lưu trữ đa thức có số mũ tối đa n-1 Phần hệ số số hạng lưu phần tử vector lưu trữ Phần số mũ i số hạng ẩn thứ tự phần tử lưu trữ Phần tử thứ i vector lưu trữ lưu thông tin số hạng ai-1xi-1 Phần tử thứ lưu trữ thông tin a0 Phần tử thứ lưu trữ thông tin a1 … – – – – – Cách tiếp cận sử dụng lưu trữ – Ví dụ: A( x ) = x − x + x + x − B( x) = x + x − x + x − x A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] -7 0 0 -5 B[1] B[2] B[3] B[4] B[5] B[6] B[7] B[8] B[9] 0 -8 -2 Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 23 Cấu trúc liệu Giải thuật Cách tiếp cận sử dụng lưu trữ – Giải thuật cộng hai đa thức lưu trữ vector Procedure ADD-POLY1(A,m, B, n, C) Begin {A, B hai vector lưu trữ hai đa thức cho; m,n kích thước A,B, giả sử m