1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Đề cương môn cấu trúc dữ liệu

36 254 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 268 KB

Nội dung

ĐỀ CƯƠNG MÔN : CẤU TRÚC DỮ LIỆU Chương 1: CÁC KHÁI NIỆM CƠ BẢN 1.1 Thuật toán cấu trúc liệu 1.2 Các kiểu liệu ngs 1.2.1.1 Kiểu số thực 1.2.2 Kiểu liệu có cấu trúc 1.2.2.1 Kiểu mảng 1.2.2.2 Kiểu chuỗi ký tự 1.2.2.3 Kiểu ghi 1.3 Kiểu trỏ 1.3.1 Định nghĩa 1.3.2 Khai báo kiểu trỏ 1.3.3 Hàm địa 1.3.4 Các phép toán kiểu trỏ 1.4 Kiểu tham chiếu 1.4.1 Định nghĩa 1.4.2 Khai báo kiểu tham chiếu 1.4.3 Ứng dụng kiểu tham chiếu 1.5 Đệ qui 1.5.1 Định nghĩa 1.5.2 Các nguyên lý dùng kỹ thuật đệ qui Chương 2: DANH SÁCH 2.1 Khái niệm 2.2 Danh sách đặc 2.2.1 Định nghĩa 2.2.2 Biểu diễn danh sách đặc 2.2.3 Các phép toán danh sách đặc 2.2.4 Ưu nhược điểm danh sách đặc 2.3 Danh sách liên kết 2.3.1 Định nghĩa danh sách liên kết 2.3.2 Biểu diễn danh sách liên kết 2.3.3 Các phép toán danh sách liên kết 2.3.4 Ưu nhược điểm danh sách liên kết 2.4 Danh sách đa liên kết 2.4.1 Định nghĩa 2.4.2 Biểu diễn danh sách đa liên kết 2.4.3 Các phép toán danh sách đa liên kết 2.5 Danh sách liên kết kép 2.5.1 Định nghĩa 2.5.2 Biểu diễn danh sách liên kết kép 2.5.3 Các phép toán danh sách liên kết kép 2.6 Danh sách liên kết vòng 2.7 Danh sách hạn chế 2.7.1 Khái niệm 2.7.2 Ngăn xếp 2.7.2.1 Định nghĩa 2.7.2.2 Biểu diễn ngăn xếp danh sách liên kết 2.7.2.3 Các phép toán ngăn xếp biểu diễn danh sách liên kết 2.7.3 Hàng đợi 2.7.3.1 Định nghĩa 2.7.3.2 Biểu diễn hàng đợi danh sách liên kết -08/01/2011 - Cấu trúc liệu – Trang 2.7.3.3 Các phép toán hàng đợi biểu diễn danh sách liên kết Chương 3: CÂY 3.1 Một số khái niệm 3.1.1 Các định nghĩa 3.1.2 Các cách biểu diễn 3.2 Cây nhị phân 3.2.1 Định nghĩa tính chất 3.2.1.1 Định nghĩa 3.2.1.2 Các dạng đặc biệt nhị phân 3.2.1.3 Các tính chất nhị phân 3.2.2 Biểu diễn nhị phân 3.2.2.1 Biểu diễn nhị phân danh sách đặc 3.2.2.2 Biểu diễn nhị phân danh sách liên kết 3.2.3 Các phép toán nhị phân biểu diễn danh sách liên kết 3.3 Cây nhị phân tìm kiếm 3.3.1 Định nghĩa 3.3.2 Các phép tốn nhị phân tìm kiếm 3.3.3 Đánh giá 3.4 Cây nhị phân cân 3.4.1 Cây cân hoàn toàn 3.4.1.1 Định nghĩa 3.4.1.2 Đánh giá 3.4.2 Cây cân 3.4.2.1 Định nghĩa 3.4.2.2 Lịch sử cân (AVL) 3.4.2.3 Chiều cao AVL 3.4.2.4 Cấu trúc liệu cho AVL 3.4.2.5 Đánh giá AVL 3.5 Cây tổng quát 3.5.1 Định nghĩa 3.5.2 Biểu diễn tổng quát danh sách liên kết 3.5.3 Các phép duyệt tổng quát 3.5.4 Cây nhị phân tương đương -o-O-o Tài liệu tham khảo: [1] [2] [3] [4] [5] [6] [7] [8] Đỗ Xuân Lôi, Cấu trúc liệu giải thuât, NXB Khoa học kĩ thuật, 2003 Nguyễn Hồng Chương, Cấu trúc liệu ứng dụng cài đặt C, NXB TPHCM, 2003 Lê Xuân Trường, Cấu trúc liệu ngôn ngữ C, NXB Thống kê, 1999 Larry Nyhoff Sanford Leestma, Lập trình nâng cao Pascal với cấu trúc liệu, 1991 Nguyễn Trung Trực, Cấu trúc liệu, 2000 Đinh Mạnh Tường, Cấu trúc liệu thuật toán, NXB Khoa học kĩ thuật, 2000 Yedidyah Langsam, Moshe J.Augenstein, Aaron M.Tenenbaum, Data Structures Using C and C++, Prentice Hall, 1996 Alfred V.Aho, John E.Hopcroft, Jeffrey D Ullman, Data Structures and Algorithms, Addison Wesley, 1983 Chương 1: CÁC KHÁI NIỆM CƠ BẢN -08/01/2011 - Cấu trúc liệu – Trang 1.1 Thuật tốn cấu trúc liệu: - Dữ liệu: nói chung liệu mà máy tính xử lý - Kiểu liệu: Mỗi kiểu liệu gồm giá trị có chung tính chất xác định phép toán - Cấu trúc liệu: cách tổ chức lưu trữ liệu máy tính - Thuật toán (hay giải thuật): tập hợp bước theo trình tự định để giải tốn - Giữa cấu trúc liệu thuật tốn có quan hệ mật thiết Nếu ta biết cách tổ chức cấu trúc liệu hợp lý thuật tốn đơn giản Khi cấu trúc liệu thay đổi thuật tốn thay đổi theo 1.2 Các kiểu liệu ngôn ngữ C: 1.2.1 Kiểu liệu đơn giản: Kiểu liệu đơn giản có giá trị đơn nhất, gồm kiểu: 1.2.1.1 Kiểu ký tự: Kiểu ký tự có giá trị ký tự đặt hai dấu nháy đơn, có kích thước Byte biểu diễn ký tự bảng mã ASCII, ví dụ: ‘A’ , ‘9’ ‘+’ Gồm kiểu ký tự chi tiết: Kiểu Miền giá trị Char từ -128 đến 127 unsigned char từ đến 255 1.2.1.2 Kiểu nguyên: Kiểu ngun có giá trị số ngun, ví dụ số 1991, gồm kiểu nguyên sau: Kiểu Miền giá trị Kích thước int từ -32768 đến 32767 Byte unsigned int từ đến 65535 Byte long từ -2147483648 đến 2147483647 Byte unsigned long từ đến 4294967295 Byte Lưu ý: Các kiểu ký tự xem kiểu nguyên Byte 1.2.1.3 Kiểu thực: Kiểu thực có giá trị số thực, ví dụ số 1.65, gồm kiểu thực sau: Kiểu Miền giá trị Kích thước float từ 3.4E-38 đến 3.4E+38 Byte double từ 1.7E-308 đến 1.7E+308 Byte long double từ 3.4E-4932 đến 1.1E4932 10 Byte 1.2.2 Kiểu liệu có cấu trúc: Kiểu liệu có cấu trúc có giá trị gồm nhiều thành phần, gồm kiểu sau: 1.2.2.1 Kiểu mảng: Kiểu mảng gồm nhiều thành phần có kiểu liệu, thành phần gọi phần tử, phần tử đánh số từ trở Để viết phần tử biến mảng ta viết tên mảng, số phần tử đặt hai dấu ngoặc vng Ví dụ lệnh: float A[3] ; Khai báo A biến mảng gồm phần tử A[0] , A[1] , A[2] có giá trị thuộc kiểu float 1.2.2.2 Kiểu chuỗi ký tự: Kiểu chuỗi ký tự có giá trị dãy ký tự đặt dấu nháy kép, ví dụ “Le Li” Ta xem chuỗi ký tự mảng mà phần tử ký tự Ta khai báo gán giá trị cho biến chuỗi ký tự sau: char ht[15] = ”Le Li” ; 1.2.2.3 Kiểu ghi: -08/01/2011 - Cấu trúc liệu – Trang Kiểu ghi gồm nhiều thành phần có kiểu liệu giống khác nhau, thành phần gọi trường Để viết trường biến ghi ta viết tên biến ghi, dấu chấm, đến tên trường Ví dụ: struct SVIEN { char int float }; SVIEN SV; ht[15]; ns, t; cc; Đầu tiên khai báo kiểu ghi SVIEN gồm trường ht, ns, t, cc lần lượt chứa họ tên, năm sinh, tuổi, chiều cao sinh viên Sau khai báo biến SV thuộc kiểu SVIEN, SV biến ghi gồm trường viết cụ thể SV.ht , SV.ns, SV.t SV.cc Ví dụ #include #include #include main() { struct SVIEN { char ht[15]; int ns, t; float cc; }; SVIEN SV; printf("\n Nhap ho ten:"); fflush(stdin); gets(SV.ht); printf("\n Nhap nam sinh:"); scanf("%d", &SV.ns); SV.t=2011-SV.ns; printf("\n Nhap chieu cao:"); scanf("%f", &SV.cc); printf("\n Ban %s , cao %7.2f m , %7d tuoi", SV.ht, SV.cc, SV.t); getch(); } 1.3 Kiểu trỏ: 1.3.1 Định nghĩa: Con trỏ biến mà giá trị địa đối tượng liệu nhớ Đối tượng biến hàm Địa vùng nhớ nhớ địa byte đầu tiên vùng nhớ 1.3.2 Khai báo biến trỏ: Ta khai báo kiểu trỏ trước, sau khai báo biến trỏ thuộc kiểu trỏ typedef kiểudữ liệu *kiểucontrỏ ; kiểucontrỏ biếncontrỏ ; ta khai báo trực tiếp biến trỏ sau: kiểudữliệu *biếncontrỏ ; ví dụ typedef float *xyz; xyz pf; hoặc: float *pf; khai báo pf biến trỏ đến giá trị kiểu float Tương tự ta có khai báo: float cc=1.65; char nm=’0’, *pc; // pc trỏ kiểu ký tự char int ns=1991, t, *p, *p2; Khi biến p có giá trị địa vùng nhớ mà vùng nhớ có chứa liệu D ta nói p biến trỏ đến liệu D, vùng nhớ mà biến trỏ p đến có tên gọi *p 1.3.3 Hàm địa chỉ: &biến Trả địa biến nhớ 1.3.4 Các phép toán kiểu trỏ - Phép gán: Ta gán địa biến cho biến trỏ kiểu, ví dụ -08/01/2011 - Cấu trúc liệu – Trang p = &ns ; Hoặc gán giá trị hai biến trỏ kiểu cho nhau, ví dụ p2 = p; Không dùng lệnh gán: p=&cc; pf=&ns; pf=p; - Phép cộng thêm vào trỏ số nguyên (đối với trỏ liên quan đến mảng) - Phép so sánh = = khác != Ví dụ: if (p==p2) if (p!=p2) - Hằng trỏ NULL: cho biết trỏ không đến đối tượng cả, giá trị gán cho biến trỏ kiểu bất kỳ, ví dụ p = NULL; pf=NULL; - Phép cấp phát vùng nhớ Lệnh biếncontrỏ = new kiểudữliệu; Vd lệnh p = new int; Cấp phát vùng nhớ có kích thước Byte (ứng với kiểu liệu int) gán địa vùng nhớ cho biến trỏ p, vùng nhớ có tên gọi *p Tương tự ta có lệnh pf=new float; - Phép thu hồi vùng nhớ Lệnh delete biếncontrỏ; Vd lệnh delete p; Thu hồi vùng nhớ mà biến trỏ p đến Ví dụ: #include #include #include main() { struct SVIEN { char ht[15]; int ns, t; float cc; }; SVIEN *p; p=new SVIEN; printf("\n Nhap ho ten:"); fflush(stdin); gets((*p).ht); printf("\n Nhap nam sinh:"); scanf("%d", &(*p).ns); (*p).t=2011-(*p).ns; printf("\n Nhap chieu cao:"); scanf("%f", &(*p).cc); printf("\n Ban %s , cao %7.2f m , %7d tuoi", (*p).ht, (*p).cc, (*p).t); delete p; getch(); } 1.4 Kiểu tham chiếu 1.4.1 Định nghĩa Ngơn ngữ C có loại biến: - Biến giá trị chứa giá trị liệu thuộc kiểu (nguyên, thực, ký tự ), ví dụ int ns=1991; - Biến trỏ chứa địa đối tượng, ví dụ int *p=&ns; Hai loại biến cấp nhớ có địa riêng - Loại thứ ba biến tham chiếu, biến không cấp phát nhớ, khơng có địa riêng, dùng làm bí danh cho biến khác dùng chung vùng nhớ biến 1.4.2 Khai báo kiểu tham chiếu Cú pháp: kiểudữliệu &biếnthamchiếu = biếnbịthamchiếu ; Trong đó, biếnthamchiếu tham chiếu đến biếnbịthamchiếu dùng chung vùng nhớ biếnbịthamchiếu Vd float cc=1.65; float &f = cc; Khai báo biến thực cc f Biến tham chiếu f tham chiếu đến biến cc kiểu float, dùng chung vùng nhớ biến cc Khi thay đổi giá trị biến cc thay đổi biến f ngược lại, chẳng hạn có lệnh: -08/01/2011 - Cấu trúc liệu – Trang f = -7.6; biến cc có giá trị -7.6 1.4.3 Ứng dụng kiểu tham chiếu #include #include void DOI(int x, int &y, int *z) { printf("\n Con truoc: %d %d %d", x, y, *z); x = x+1; y = y+2; *z = *z+3; printf("\n Con sau: %d %d %d", x, y, *z); } void main() { int i=10, j=20, k=30; DOI(i, j, &k); printf("\n Chinh sau: %d %d %d", i, j, k); getch(); } 1.5 Đệ qui 1.5.1 Định nghĩa Một chương trình gọi thực gọi tính đệ qui chương trình 1.5.2 Các nguyên lý dùng kỹ thuật đệ qui - Tham số hóa tốn: để thể kích cỡ tốn - Tìm trường hợp dễ nhất: mà ta biết kết tốn - Tìm trường hợp tổng qt: để đưa tốn với kích cỡ lớn tốn có kích cỡ nhỏ Ví dụ: Bài tốn Tháp Hà Nội: Cần chuyển n đĩa từ cọc A (trong đĩa lớn dưới, đĩa nhỏ trên) sang cọc B với điều kiện: Mỗi lần chuyển đĩa Trên cọc, luôn đĩa lớn dưới, đĩa nhỏ Được dùng cọc trung gian thứ ba C Giải: - Tham số hóa tốn: Gọi n: số lượng đĩa cần chuyển x: cọc xuất phát y: cọc đích z: cọc trung gian Hàm CHUYEN(n, x, y, z) dùng để chuyển n đĩa từ cọc xuất phát x sang cọc đích y với cọc trung gian z - Tìm trường hợp dễ nhất: n = , ta chuyển đĩa từ cọc x sang cọc y - Tìm trường hợp tổng quát: B1: Chuyển n-1 đĩa từ cọc xuất phát x sang cọc trung gian z B2: Chuyển đĩa từ cọc xuất phát x sang cọc đích y B3: Chuyển n-1 đĩa từ cọc trung gian z sang cọc đích y #include #include int i; void CHUYEN(int &n, char x, char y, char z) { if (n==1) { i++; printf("\n %d : %c > %c", i, x, y); } else { CHUYEN(n-1, x, z, y); CHUYEN(1, x, y, z); CHUYEN(n-1, z, y, x); } } void main() { int n; printf("\n Nhap so dia can chuyen:"); scanf("%d", &n); CHUYEN(n, 'A', 'B', 'C'); getch(); } -08/01/2011 - Cấu trúc liệu – Trang Chương 2: DANH SÁCH 2.1 Khái niệm - Danh sách: dãy phần tử a0, a1, a2, an-1 biết phần tử đứng trước biết phần tử đứng sau - n: số phần tử danh sách - Danh sách rỗng: danh sách khơng có phần tử cả, tức n=0 - Danh sách khái niệm thường gặp sống, danh sách sinh viên lớp, danh sách môn học học kỳ - Có cách biểu diễn danh sách: + Danh sách đặc: Các phần tử lưu trữ nhớ, phần tử thứ i-1 lưu trữ trước phần tử thứ i giống mảng + Danh sách liên kết: Các phần tử lưu trữ vùng nhớ khác nhớ, chúng kết nối với nhờ vùng liên kết - Các phép toán thường dùng danh sách: + Khởi tạo danh sách (tức làm cho danh sách có, danh sách rỗng) + Kiểm tra xem danh sách có rỗng khơng + Liệt kê phần tử có danh sách + Tìm kiếm phần tử danh sách + Thêm phần tử vào danh sách + Xóa phần tử khỏi danh sách + Sửa thông tin phần tử danh sách + Thay phần tử danh sách phần tử khác + Sắp xếp thứ tự phần tử danh sách + Ghép danh sách vào danh sách khác + Trộn danh sách có thứ tự để danh sách có thứ tự + Tách danh sách thành nhiều danh sách - Trong thực tế toán cụ thể dùng số phép tốn đó, nên ta phải biết cách biểu diễn danh sách cho phù hợp với toán 2.2 Danh sách đặc 2.2.1 Định nghĩa Các phần tử danh sách lưu trữ nhớ hình thức mảng 2.2.2 Biểu diễn danh sách đặc Xét danh sách có tối đa 100 sinh viên gồm thơng tin: họ tên, chiều cao, cân nặng tiêu chuẩn, : Lê Li 1.7 65 Lê Bi 1.8 75 Lê Vi 1.4 35 Lê Ni 1.6 55 Lê Hi 1.5 45 Khai báo: #include #include #include const int Nmax=100; typedef char infor1[15]; typedef float infor2; typedef int infor3; struct element { infor1 ht; infor2 cc; infor3 cntc; }; typedef element DS[Nmax]; DS A; int n; Hằng Nmax kiểu int chứa số phần tử tối đa có danh sách -08/01/2011 - Cấu trúc liệu – Trang Biến n kiểu int chứa số phần tử thực tế danh sách, ví dụ n=5 Kiểu ghi element gồm trường ht, cc, cntc lần lượt chứa họ tên, chiều cao, cân nặng tiêu chuẩn sinh viên infor1, infor2, infor3 lần lượt kiểu liệu trường ht, cc, cntc DS kiểu mảng gồm Nmax phần tử kiểu element Biến A kiểu DS biến mảng gồm Nmax phần tử kiểu element 2.2.3 Các phép toán danh sách đặc - Khởi tạo danh sách: Khi khởi tạo danh sách rỗng, ta cho n nhận giá trị void Create(DS { n=0; } A, int &n) - Liệt kê phần tử danh sách: Ta liệt kê phần tử từ phần tử đầu tiên trở void Display(DS A, int n) { int i; for (i=0; ipRight, X); } -08/01/2011 - Cấu trúc liệu – Trang 26 return NULL; } Ta xây dựng hàm tìm kiếm tương đương không đệ qui sau: TNODE * searchNode(TREE Root, Data x) { NODE *p = Root; while (p != NULL) { if(x == p->Key) return p; else if(x < p->Key) p = p->pLeft; else p = p->pRight; } return NULL; } Dễ dàng thấy số lần so sánh tối đa phải thực để tìm phần tử X h, với h chiều cao Như thao tác tìm kiếm CNPTK có n nút tốn chi phí trung bình khoảng O(log2n) • Thêm phần tử x vào Việc thêm phần tử X vào phải bảo đảm điều kiện ràng buộc CNPTK Ta thêm vào nhiều chỗ khác cây, thêm vào nút tiện lợi ta thực hiên trình tương tự thao tác tìm kiếm Khi chấm dứt q trình tìm kiếm lúc tìm chỗ cần thêm Hàm insert trả giá trị –1, 0, không đủ nhớ, gặp nút cũ hay thành công: int insertNode(TREE &T, Data X) { if(T) { if(T->Key == X) return 0; //đã có if(T->Key > X) return insertNode(T->pLeft, X); else return insertNode(T->pRight, X); } T =new Tnode; if(T == NULL) return -1; //thiếu nhớ T->Key = X; T->pLeft =T->pRight = NULL; return 1; //thêm vào thành cơng } • Xóa phần tử Việc hủy phần tử khỏi phải đảm bảo điều kiện ràng buộc nhị phân tìm kiếm Có trường hợp hủy nút X xảy ra: X nút X có (trái phải) X có đủ Trường hợp thứ nhất: đơn giản hủy X khơng móc nối đến phần tử khác -08/01/2011 - Cấu trúc liệu – Trang 27 Trường hợp thứ hai: trước hủy X ta móc nối cha X với Trường hợp cuối cùng: ta khơng thể hủy trực tiếp X có đủ ⇒ Ta hủy gián tiếp Thay hủy X, ta tìm phần tử mạng Y Phần tử có tối đa Thông tin lưu Y chuyển lên lưu X Sau đó, nút bị hủy thật Y giống trường hợp đầu Vấn đề phải chọn Y cho lưu Y vào vị trí X, CNPTK Có phần tử thỏa mãn yêu cầu: Phần tử nhỏ (trái nhất) phải Phần tử lớn (phải nhất) trái Việc chọn lựa phần tử phần tử mạng hoàn toàn phụ thuộc vào ý thích người lập trình Ở đây, chọn phần tử (phải trái làm phần tử mạng Sau hủy phần tử X=18 khỏi tình trạng hình (phần tử 23 phần tử mạng): Hàm delNode trả giá trị 1, hủy thành cơng khơng có X cây: int delNode(TREE &T, Data X) { if(T==NULL) return 0; if(T->Key > X) return delNode (T->pLeft, X); if(T->Key < X) return delNode (T->pRight, X); else { //T->Key == X TNode* p = T; if(T->pLeft == NULL) T = T->pRight; else if(T->pRight == NULL) T = T->pLeft; else { //T có TNode* q = T->pRight; searchStandFor(p, q); } delete p; } } Trong đó, hàm searchStandFor viết sau: //Tìm phần tử mạng cho nút p void searchStandFor(TREE &p, TREE &q) { if(q->pLeft) searchStandFor(p, q->pLeft); else { p->Key = q->Key; p = q; q = q->pRight; } } -08/01/2011 - Cấu trúc liệu – Trang 28 • Tạo nhị phân tìm kiếm Ta tạo nhị phân tìm kiếm cách lặp lại trình thêm phần tử vào rỗng • Xóa tồn Việc tồn thực thông qua thao tác duyệt theo thứ tự sau Nghĩa ta hủy trái, phải hủy nút gốc void removeTree(TREE &T) { if(T) { removeTree(T->pLeft); removeTree(T->pRight); delete(T); } } 3.3.3 Đánh giá Tất thao tác searchNode, insertNode, delNode CNPTK có độ phức tạp trung bình O(h), với h chiều cao Trong trường hợp tốt nhất, CNPTK có n nút có độ cao h = log2(n) Chi phí tìm kiếm tương đương tìm kiếm nhị phân mảng có thứ tự Tuy nhiên, trường hợp xấu nhất, bị suy biến thành DSLK (khi mà nút có trừ nút lá) Lúc thao tác có độ phức tạp O(n) Vì cần có cải tiến cấu trúc CNPTK để đạt chi phí cho thao tác log2(n) 3.4 Cây nhị phân cân 3.4.1 Cây cân hoàn toàn 3.4.1.1 Định nghĩa Cây cân hồn tồn nhị phân tìm kiếm mà nút số nút trái chênh lệch không so với số nút phải Ví dụ cho cân hoàn toàn sau: -08/01/2011 - Cấu trúc liệu – Trang 29 3.4.1.2 Đánh giá Một khó đạt trạng thái cân hồn tồn dễ cân thêm hay hủy nút làm cân (xác suất lớn), chi phí cân lại lớn phải thao tác tồn Tuy nhiên cân đối việc tìm kiếm nhanh Đối với cân hồn tồn, trường hợp xấu ta phải tìm qua log2n phần tử (n số nút cây) CCBHT có n nút có chiều cao h ≈ log2n Đây lý cho phép bảo đảm khả tìm kiếm nhanh CTDL Do CCBHT cấu trúc ổn định nên thực tế khơng thể sử dụng Nhưng ưu điểm lại quan trọng Vì vậy, cần đưa CTDL khác có đặc tính giống CCBHT ổn định Như vậy, cần tìm cách tổ chức đạt trạng thái cân yếu việc cân lại xảy phạm vi cục phải bảo đảm chi phí cho thao tác tìm kiếm đạt mức O(log2n) 3.4.2 Cây cân 3.4.2.1 Định nghĩa: Cây cân nhị phân tìm kiếm mà nút độ cao trái chênh lệch không so với độ cao phải, ví dụ cho cân sau: Dễ dàng thấy CCBHT cân Điều ngược lại khơng đúng, ví dụ cân cho không cân hoàn toàn 3.4.2.2 Lịch sử cân (AVL tree) -08/01/2011 - Cấu trúc liệu – Trang 30 AVL tên viết tắt tác giả người Nga đưa định nghĩa cân Adelson-Velskii Landis (1962) Vì lý này, người ta gọi nhị phân cân băng AVL Tù sau, dùng thuật ngữ AVL thay cho cân Từ giới thiệu, AVL nhanh chóng tìm thấy ứng dụng nhiều tốn khác Vì vậy, mau chóng trở nên thịnh hành thu hút nhiều nghiên cứu Từ AVL, người ta phát triển thêm nhiều loại CTDL hữu dụng khác đỏ-đen (Red-Black Tree), B-Tree, … 3.4.2.3 Chiều cao AVL Một vấn đề quan trọng, đề cập đến phần trước, ta pjải khẳng định AVL n nút phải có chiều cao khoảng log2(n) Để đánh giá xác chiều cao AVL, ta xét tốn: AVL có chiều cao h phải có tối thiểu nút ? Gọi N(h) số nút tối thiểu AVL có chiều cao h Ta có N(0) = 0, N(1) = N(2) = Cây AVL tối thiểu có chiều cao h có AVL tối thiểu chiều cao h-1 AVL tối thiểu chiều cao h-2 Như vậy: N(h) = + N(h-1) + N(h-2) (1) Ta lại có: N(h-1) > N(h-2) Nên từ (1) suy ra: N(h) > 2N(h-2) N(h) > 22N(h-4) … N(h) > 2iN(h-2i) ⇒ N(h) > 2h/2-1 ⇒ h < 2log2(N(h)) + Như vậy, AVL có chiều cao O(log2(n)) 3.4.2.4 Cấu trúc liệu cho AVL Chỉ số cân nút: Định nghĩa: Chỉ số cân nút hiệu chiều cao phải trái Đối với cân bằng, số cân (CSCB) nút mang ba giá trị sau đây: -08/01/2011 - Cấu trúc liệu – Trang 31 CSCB(p) = Độ cao trái (p) = Độ cao phải (p) CSCB(p) = Độ cao trái (p) < Độ cao phải (p) CSCB(p) =-1 Độ cao trái (p) > Độ cao phải (p) Để tiện trình bày, ký hiệu sau: p->balFactor = CSCB(p); Độ cao trái (p) ký hiệu hL Độ cao phải(p) ký hiệu hR Để khảo sát cân bằng, ta cần lưu thêm thông tin số cân nút Lúc đó, cân khai báo sau: typedef struct tagAVLNode { char balFactor; //Chỉ số cân Data key; struct tagAVLNode* pLeft; struct tagAVLNode* pRight; }AVLNode; typedef AVLNode *AVLTree; Để tiện cho việc trình bày, ta định nghĩa số hăng số sau: #define LH -1 //Cây trái cao #define EH -0 //Hai #define RH //Cây phải cao 3.4.2.5 Đánh giá AVL Cây cân CTDL ổn định hẳn CCBHT thêm hủy làm thay đổi chiều cao trường hợp cân có khả xảy Cây AVL với chiều cao khống chế cho phép thực thi thao tác tìm thêm hủy với chi phí O (log2(n)) bảo đảm không suy biến thành O(n) 3.5 Cây tổng quát 3.5.1 Định nghĩa Cây tổng quát mà nút có số Ví dụ cho tam phân ký tự: -08/01/2011 - Cấu trúc liệu – Trang 32 Gốc A B E A C A F A D G A H A J A I A K A 3.5.2 Biểu diễn tổng quát danh sách liên kết Mỗi nút ghi, trường chứa liệu thân nó, cịn có thêm trường liên kết khác lưu trữ địa nút 3.5.3 Các phép duyệt tổng quát Tương tự nhị phân, tổng quát có phép duyệt là: - Duyệt theo thứ tự trước (đối với gốc): Kiểu duyệt trước tiên thăm nút gốc, sau lần lượt thăm nút Gốc Cây trái Các phải - Duyệt theo thứ tự giữa: Kiểu duyệt trước tiên thăm nút nút trái nhất, sau thăm nút gốc đến phải Cây trái Gốc Cây phải - Duyệt theo thứ tự sau:Kiểu duyệt trước tiên thăm nút trái nhất, sau thăm nút phải, cuối thăm nút gốc Cây trái Các phải Gốc 3.5.4 Cây nhị phân tương đương Nhược điểm cấu trúc tổng quát bậc nút dao động biên độ lớn ⇒ việc biểu diễn gặp nhiều khó khăn lãng phí Hơn nữa, việc xây dựng thao tác tổng quát phức tạp nhị phân nhiều Vì vậy, thường khơng q cần thiết phải sử dụng tổng quát, người ta chuyển tổng quát thành nhị phân Ta biến đổi thành nhị phân theo qui tắc sau: - Giữ lại nút trái làm nút trái - Các nút lại chuyển thành nút phải - Như vậy, nhị phân mới, trái thể quan hệ cha phải thể quan hệ anh em tổng quát ban đầu -08/01/2011 - Cấu trúc liệu – Trang 33 Ta xem ví dụ để thấy rõ qui trình Một ví dụ quen thuộc tin học ứng dụng duyệt theo thứ tự sau việc xác định tồng kích thước thư mục đĩa Một ứng dụng quan trọng khác phép duyệt theo thứ tự sau việc tính tốn giá trị biểu thức dựa biểu thức (3 + 1)×3/(9 – + 2) – (3×(7 – 4) + 6) = –13 Một ví dụ hay nhị phân biểu thức Cây biểu thức nhị phân gắn nhãn, biểu diễn cấu trúc biểu thức (số học logic) Mỗi phép toán hai toán hạng (chẳng hạn, +, -, *, /) biểu diễn nhị phân, gốc chứa ký hiệu phép tốn, trái biểu diễn tốn hạng bên trái, cịn phải biểu diễn toán hạng bên phải Với phép toán hạng ‘phủ định’ ‘lấy giá trị đối’ hàm chuẩn exp ( ) cos ( ) bên trái rỗng Cịn với phép toán toán hạng phép lấy đạo hàm ( )’ hàm giai thừa ( )! Thì bên phải rỗng Hình bên minh họa số biểu thức Ta có nhận xét rằng, qua biểu thức theo thứ tự trước ta biểu thức Balan dạng prefix (ký hiệu phép toán đứng trước toán hạng) Nếu qua biểu thức theo thứ tự sau, ta có biểu thức Balan dạng postfix (ký hiệu phép toán đứng sau tốn hạng); cịn theo thứ tự ta nhận cách viết thông thường biểu thức (ký hiệu phép toán đứng hai toán hạng) + a a+b exp b ! exp(x) x n / a or + b n! < c a/(b+c) a >= b c d (a=d) -o-O-o - BÀI TẬP CHƯƠNG BÀI TẬP LÝ THUYẾT Bài Hãy trình bày vấn đề sau đây: a Định nghĩa đặc điểm nhị phân tìm kiếm -08/01/2011 - Cấu trúc liệu – Trang 34 b Thao tác thực tốt kiểu c Hạn chế kiểu ? Bài Xét thuật giải tạo nhị phân tìm kiếm Nếu thứ tự khóa nhập vào sau: 20 11 30 18 hình ảnh tạo ? Sau đó, hủy lần lượt nút theo thứ tự sau : 15, 20 thay đổi bước hủy, vẽ sơ đồ (nêu rõ phương pháp hủy nút có trái phải) Bài Áp dụng thuật giải tạo nhị phân tìm kiếm cân để tạo với thứ tự khóa nhập vào sau : 10 hình ảnh tạo ? Giải thích rõ tình xảy thêm khóa vào vẽ hình minh họa Sau đó, hủy lần lượt nút theo thứ tự sau : 5, 6, 7, 10 thay đổi bước hủy, vẽ sơ đồ giải thích Bài Viết hàm xác định thông tin nhị phân T: a Số nút b Số nút có c Số nút có d Số nút có khóa nhỏ x (giả sử T CNPTK) e Số nút có khóa lớn x (giả sử T CNPTK) f Số nút có khóa lớn x nhỏ y (T CNPTK) g Chiều cao h In tất nút tầng (mức) thứ k T i In tất nút theo thứ tự từ tầng đến tầng thứ h-1 T (h chiều cao T) j Kiểm tra xem T có phải cân hồn tồn khơng k Độ lệch lớn (Độ lệch nút độ lệch chiều cao trái phải Độ lệch lớn độ lệch nút có độ lệch lớn nhất) -08/01/2011 - Cấu trúc liệu – Trang 35 Bài Xây dựng cấu trúc liệu biễu diễn N-phân (2

Ngày đăng: 03/12/2015, 13:57

TỪ KHÓA LIÊN QUAN

w