1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình cấu trúc dữ liệu nâng cao 1 2

92 238 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 92
Dung lượng 14,68 MB

Nội dung

GIỚI THIỆU MƠN HỌC Tóm tắt nội dung: Bài 1: Danh sách liên kết Bài 2: Một số phương pháp xếp Bài 3: Hàm băm Bài 4: Cây, nhị phân, nhị phân tìm kiếm, cân Bài 5: Cây đỏ đen Bài 6: B-cây, 2-3-4 Bài 7: Các đống nhị thức Bài 8: Các đống Fibonaci Bài 9: Các tập rời Bài 10: Các thuật toán so khớp chuỗi Tài liệu tham khảo: 1) Data Structures, Algorithms, and Object-Oriented Programming NXB McGraw Hill; Tác giả Gregory Heilleman -1996 2) Advanced Data Structures NXB McGraw Hill - 1990; Tác giả Thomas H C., Charles E.L., and Ronald L.R 3) Giáo trình thuật tốn NXB Thống kế 2002 Nhóm Ngọc Anh Thư dịch 4) Algorithms and Data Structures in C++; Tác giả Alan Parker Bài 1: Danh sách liên kết I) Danh sách liên kết đơn Tổ chức danh sách đơn Danh sách liên kết bao gồm phần tử Mỗi phần tử danh sách đơn cấu trúc chứa thông tin : - Thành phần liệu: lưu trữ thông tin thân phần tử - Thành phần mối liên kết: lưu trữ địa phần tử danh sách, lưu trữ giá trị NULL phần tử cuối danh sách Ta có định nghĩa tổng quát typedef struct tagNode { Data Info; // Data kiểu định nghĩa trước Struct tagNode* pNext; // trỏ đến cấu trúc node }NODE; Ví dụ : Ðịnh nghĩa danh sách đơn lưu trữ hồ sơ sinh viên: typedef struct SinhVien //Data { char Ten[30]; int MaSV; }SV; typedef struct SinhvienNode { SV Info; struct SinhvienNode* pNext; }SVNode; Các phần tử danh sách cấp phát động Biết phần tử ta truy xuất phần tử Thường sử dụng trỏ Head để lưu trữ địa danh sách Ta có khai báo: NODE *pHead; Để quản lý địa cuối danh sách ta dùng trỏ TAIL Khai báo sau: NODE *pTail; VD: II Các thao tác danh sách đơn Giả sử có định nghĩa: typedef struct tagNode { Data Info; struct tagNode* pNext; }NODE; typedef struct tagList { NODE* pHead; NODE* pTail; }LIST; NODE *new_ele // giữ địa phần tử tạo Data x; // lưu thông tin phần tử tạo LIST lst; // lưu trữ địa đầu, địa cuối danh sách liên kết 1.Chèn phần tử vào danh sách: Có loại thao tác chèn new_ele vào xâu: Cách 1: Chèn vào đầu danh sách Thuật toán : Bắt đầu: Nếu Danh sách rỗng Thì B11 : pHead = new_ele; B12 : pTail = pHead; Ngược lại B21 : new_ele ->pNext = pHead; B22 : pHead = new_ele ; Cài đặt: Cách 2: Chèn vào cuối danh sách Thuật toán : Bắt đầu : Nếu Danh sách rỗng B11 : pHead = new_elelment; B12 : pTail = pHead; Ngược lại B21 : pTail ->pNext = new_ele; B22 : pTail = new_ele ; Cách : Chèn vào danh sách sau phần tử q Thuật toán : Bắt đầu : Nếu ( q != NULL) B1 : new_ele -> pNext = q->pNext; B2 : q->pNext = new_ele ; Cài đặt : Tìm phần tử danh sách đơn Thuật toán : Bước 1: p = pHead; //Cho p trỏ đến phần tử đầu danh sách Bước 2: Trong (p != NULL) (p->Info != k ) thực hiện: p:=p->pNext;// Cho p trỏ tới phần tử kế Bước 3: Nếu p != NULL p trỏ tới phần tử cần tìm Ngược lại: khơng có phần tử cần tìm Cài đặt : Hủy phần tử khỏi danh sách Hủy phần tử đầu xâu: Thuật toán : Bắt đầu: Nếu (pHead != NULL) B1: p = pHead; // p phần tử cần hủy B2: B21 : pHead = pHead->pNext; // tách p khỏi xâu B22 : free(p); // Hủy biến động p trỏ đến B3: Nếu pHead=NULL pTail = NULL; //Xâu rỗng Hủy phần tử đứng sau phần tử q Thuật toán : Bắt đầu: Nếu (q!= NULL) B1: p = q->Next; // p phần tử cần hủy B2: Nếu (p != NULL) // q khơng phải cuối xâu B21 : q->Next = p->Next; // tách p khỏi xâu B22 : free(p); // Hủy biến động p trỏ đến Hủy phần tử có khố k Thuật tốn : Bước 1: Tìm phần tử p có khóa k phần tử q đứng trước Bước 2: Nếu (p!= NULL) // tìm thấy k Hủy p khỏi xâu tương tự hủy phần tử sau q; Ngược lại Báo khơng có k; Thăm nút danh sách - Ðếm phần tử danh sách, - Tìm tất phần tử thoả điều kiện, - Huỷ tồn danh sách (và giải phóng nhớ) Thuật toán xử lý nút danh sách: Bước 1: p = pHead; //Cho p trỏ đến phần tử đầu danh sách Bước 2: Trong (Danh sách chưa hết) thực B21 : Xử lý phần tử p; B22 : p:=p->pNext; // Cho p trỏ tới phần tử kế Thuật tốn hủy tồn danh sách: Bước 1: Trong (Danh sách chưa hết) thực B11: p = pHead; pHead:=pHead->pNext; // Cho p trỏ tới phần tử kế B12: Hủy p; Bước 2: Tail = NULL; //Bảo đảm tính quán xâu rỗng II Danh sách liên kết kép Là danh sách mà phần tử danh sách có kết nối với phần tử đứng trước phần tử đứng sau Khai báo: typedef struct tagDNode { Data Info; struct tagDNode* pPre; // trỏ đến phần tử đứng trước struct tagDNode* pNext; // trỏ đến phần tử đứng sau }DNODE; typedef struct tagDList { DNODE* pHead; // trỏ đến phần tử đầu danh sách DNODE* pTail; // trỏ đến phần tử cuối danh sách }DLIST; Chèn phần tử vào danh sách: Có loại thao tác chèn new_ele vào danh sách: Cách 1: Chèn vào đầu danh sách Cài đặt : Cách 2: Chèn vào cuối danh sách Cài đặt : Cách : Chèn vào danh sách sau phần tử q Cài đặt : Cách : Chèn vào danh sách trước phần tử q Cài đặt : Hủy phần tử khỏi danh sách - Hủy phần tử đầu xâu - Hủy phần tử cuối xâu - Hủy phần tử đứng sau phần tử q - Hủy phần tử đứng trước phần tử q - Hủy phần tử có khố k Xử lý nút danh sách: - Tìm nút có khóa k - Hiển thị giá trị khóa nút danh sách - Hủy tịan danh sách 10 Hình Node P đỏ X node cháu ngoại iii) Khả 3: P đỏ X cháu nội G Nếu node P đỏ X node cháu nội, cần thực hai phép quay vài phép đổi màu Cây đỏ đen tạo thành từ node 50, 25, 75, 12 18 (cần phải lật màu trước chèn node 12) Xem hình 8a Lưu ý node 18 node cháu nội Node node cha đỏ (cha đỏ) 10 hình 8.c Hình Khả 3: P đỏ X node cháu nội Chỉnh lại xếp rắc rối Nếu ta cố quay phải node ông bà G (25) đỉnh, ta làm khả 2, node cháu X (18) ngang lên, khơng cịn cân trước 11 (Thử làm điều này, quay trở lại, với node 12 đỉnh, để phục hồi nhu cũ) Phải cần giải pháp khác Thủ thuật cần dùng X node cháu nội tiến hành hai phép quay phép Phép quay đầu biến X từ node cháu nội thành node cháu ngoại, hình 8b Bây giờ, trường hợp tương tự khả 1, ta áp dụng phép quay, với node ông bà đỉnh, làm trước Kết hình 8c Chúng ta cần tơ màu lại nút Ta làm điều trước làm phép quay (thứ tự không quan trọng, ta đợi đến sau quay tô màu lại node khó mà biết phải gọi chúng nào) Các bước là: - Đổi màu node ông bà node X ( node 25) - Đổi màu node X ( node X node 18) - Quay trái với node P - node cha X - đỉnh ( node cha 12) - Quay lần với node ông bà X (25) đỉnh, hướng nâng X lên (quay phải) LOẠI BỎ NODE Trong BST thấy phép loại bỏ phức tạp so với phép thêm vào Trong đỏ đen phép loại bỏ phức tạp nhiều so với phép thêm vào yêu cầu đảm bảo quy tắc đỏ đen Chúng ta tham khảo phần cài đặt   Nếu xóa nút đỏ chiều cao đen khơng đổi Nếu xóa nút đen phải cân lại 12 TÍNH HIỆU QUẢ CỦA CÂY ĐỎ ĐEN Giống tìm kiếm nhị phân thơng thường, đỏ đen cho phép việc tìm kiếm, chèn xóa thời gian O(log2N) Thời gian tìm kiếm gần hai loại cây, đặc điểm đỏ đen khơng sử dụng q trình tìm kiếm Điều bất lợi việc lưu trữ cần cho node tăng chút để điều tiết màu đỏ-đen (một biến boolean) Đặc thù hơn, theo Sedgewick, thực tế tìm kiếm đỏ đen khoảng log2N phép so sánh, chứng minh không cần 2*log2N phép so sánh Thời gian chèn xóa tăng dần số việc phải thực thi phép lật màu quay đường xuống điểm chèn Trung bình phép chèn cần khoảng chừng phép quay Do đó, chèn hày chiếm O(log2N) thời gian, lại chậm phép chèn nhị phân thường Bởi hầu hết ứng dụng, có nhiều thao tác tìm kiếm chèn xóa, có lẽ khơng có nhiều bất lợi thời gian dùng đỏ đen thay nhị phân thuờng Dĩ nhiên, điều thuận lợi đỏ đen, liệu xếp không làm giảm hiệu suất O(N) Một trở ngại đỏ đen việc cài đặt phép toán phức tạp so với BST Chúng ta tham khảo phép tốn thêm vào loại bỏ phần cài đặt 13 BÀI 7: CÂY 2-3-4 Giới thiệu 2-3-4 Chúng ta xem xét đặc tính 2-3-4 mối quan hệ gần gũi 23-4 đỏ-đen Hình trình bày 2-3-4 đơn giản Mỗi node lưu trữ 1, mục liệu Hình 2-3-4 Các số 2, cụm từ 2-3-4 có ý nghĩa khả có liên kết đến node có node cho trước Đối với node lá, có cách xếp sau: Một node với mục liệu ln ln có Một node với hai mục liệu ln ln có Một node với ba mục liệu ln ln có Như vậy, node phải luôn có số node nhiều so với số mục liệu Nói cách khác, node với số k số mục liệu d, : k = d + 1 Hình trường hợp 2-3-4 Với node khơng có node chứa 1, mục liệu, khơng có node rỗng Một 2-3-4 có đến nên gọi nhiều nhánh bậc Trong 2-3-4 node có liên kết, trừ node (node liên kết nào) Hình trình bày trường hợp 2-3-4 Một node với liên kết gọi 2node, node với liên kết gọi 3-node, node với liên kết gọi 4-node, khơng có node 1-node Tổ chức 2-3-4 Các mục liệu node xếp theo thứ tự tăng dần từ trái sang phải (sắp xếp từ thấp đến cao) Trong tìm kiếm nhị phân, tất node bên trái có khố nhỏ khóa node xét tất node bên phải có khố lớn khóa node xét Trong 2-3-4 ngun tắc giống trên, có thêm số điểm sau: Tất node có gốc node thứ có giá trị khố nhỏ khố Tất node có gốc node thứ có giá trị khố lớn khoá nhỏ khoá Tất node có gốc node thứ có giá trị khố lớn khoá nhỏ khoá Tất node có gốc node thứ có giá trị khố lớn khoá Trong 2-3-4, nút nằm mức Các node mức thường khơng đầy đủ, nghĩa chúng chứa mục liệu thay mục Lưu ý 2-3-4 cân Nó giữ cân thêm vào phần tử có thứ tự (tăng dần giảm dần) Tìm kiếm Thao tác tìm kiếm 2-3-4 tương tự thủ tục tìm kiếm nhị phân việc tìm kiếm node gốc chọn liên kết dẫn đến với phạm vi giá trị phù hợp Ví dụ, để tìm kiếm mục liệu với khoá 64 hình 1, bạn gốc Tại node gốc khơng tìm thấy mục khố Bởi 64 lớn 50, đến node 1, (60/70/80)(lưu ý node nằm bên phải, việc đánh số node liên kết bắt đầu từ bên trái) Tại vị trí khơng tìm thấy mục liệu, phải đến node Tại 64 lớn 60 nhỏ 70 nên tiếp đến node Tại thời điểm tìm mục liệu cho với liên kết 62/64/66 Thêm vào Các mục liệu luôn chèn vào node Nếu mục liệu thêm vào node mà có node con, số lượng node cần thiết phải biến đổi để trì cấu trúc cho cây, lý phải có số node nhiều so với mục liệu nút Việc thêm vào 2-3-4 trường hợp trình bắt đầu cách tìm kiếm node phù hợp Nếu khơng có node đầy (node có đủ mục liệu) bắt gặp trình tìm kiếm, việc chèn vào dễ dàng Khi node phù hợp tìm thấy, mục liệu đơn giản thêm vào Hình trình bày mục liệu với khố 18 thêm vào 23-4 Việc chèn vào dẫn đến phải thay đổi vị trí hai mục liệu node khố nằm với trật tự sau mục liệu thêm vào Trong ví dụ số 23 phải đẩy sang phải để nhường chỗ cho 18 Hình Chèn vào khơng làm tách (i) trước chèn vào (ii) sau chèn vào Tách nút Việc thêm vào trở nên phức tạp gặp phải node đầy (node có số mục liệu đầy đủ) nhánh dẫn đến điểm thêm vào Khi điều xảy ra, node cần thiết phải tách Quá trình tách nhằm giữ cho cân Loại 2-3-4 mà đề cập thường gọi 2-3-4 top-down node tách theo hướng xuống điểm chèn Giả sử ta đặt tên mục liệu node bị phân chia A, B C Sau tiến trình tách (chúng ta giả sử node bị tách node gốc; kiểm tra việc tách node gốc sau này): Một node (rỗng) tạo Nó anh em với node tách đưa vào bên phải Mục liệu C đưa vào node Mục liệu B đưa vào node cha node tách Mục liệu A không thay đổi Hai node bên phải bị hủy kết nối từ node tách kết nối đến node ( Một cách khác để mô tả tách node 4-node tách thành hai 2-nút) Một ví dụ việc tách node trình bày hình Hình 4: Tách nút (i ) Trước chèn vào (ii) Sau chèn vào Tách node gốc Khi gặp phải node gốc đầy thời điểm bắt đầu tìm kiếm điểm chèn, kết việc tách thực sau: Node tạo để trở thành gốc cha node tách Node thứ hai tạo để trở thành anh em với node tách Mục liệu C dịch đưa sang node anh em Mục liệu B dịch đưa sang node gốc Mục liệu A không đổi Hai node bên phải node phân chia bị hủy kết nối khỏi kết nối đến node bên phải Hình 4.5 Tách node gốc i) Trước thêm vào ii) Sau thêm vào Hình việc tách node gốc Tiến trình tạo node gốc mức cao mức node gốc cũ Kết chiều cao tổng thể tăng lên Đi theo node tách này, việc tìm kiếm điểm chèn tiếp tục xuống phía Trong hình mục liệu với khố 41 thêm vào phù hợp Tách theo hướng xuống Chú ý rằng, tất node đầy tách đường xuống nên việc tách node khơng gây ảnh hưởng phải ngược lên Node cha node bị tách phải đảm bảo node đầy, để đảm bảo node cha chấp nhận mục liệu B mà không cần thiết phải tách Tất nhiên node cha có hai node bị tách, trở thành node đầy Tuy nhiên điều có nghĩa bị tách lần tìm kiếm gặp Hình trình bày loạt thao tác chèn vào rỗng Có node tách, node gốc node Thêm vào 70, 30, 50 30, 50, 70 Thêm 40 Thêm vào 20, 80 Thêm vào 25, 90 Thêm vào 75 Thêm vào 10 Hình Minh họa thêm node vào 2-3-4 Biến đổi 2-3-4 sang Đỏ-Đen Một 2-3-4 biến đổi sang đỏ-đen cách áp dụng luật sau: Biến đổi 2-node 2-3-4 sang node đen đỏ-đen Biến đổi 3-node sang node C (với hai nó) node cha P (với node C node khác) Khơng có vấn đề mục trở thành node mục khác thành node cha C tô màu đỏ P tô màu đen Biến đổi 4-node sang node cha P hai node C1, C2 màu đỏ Hình 4.7 trình bày chuyển đổi Các node tô màu đỏ; tất node khác tơ màu đen Hình Chuyển đổi từ 2-3-4 sang đỏ-đen 10 Hình 4.8 trình bày 2-3-4 đỏ-đen tương ứng với cách áp dụng chuyển đổi Các đường chấm xung quanh tạo từ 3-node 4-nút Các luật đỏ-đen tự động thoả mãn với chuyển đổi Kiểm tra rằng: Hai node đỏ không kết nối, số lượng node đen đường dẫn từ gốc đến (hoặc node null) Hình 4.8 Cây 2-3-4 đỏ-đen tương ứng 11 ... 12 39 CS A 0 428 325 2 8 425 17 25 14 24 4 518 07 01 0999 Phân lô theo hàng ngàn: 12 0999 11 17 25 10 07 01 4 518 0 428 8 425 14 24 325 2 12 39 917 0 0999 17 25 7 013 07 01 1 424 7009 0 428 12 39 CS A 7 013 325 2 4 518 ... 7 013 0 428 325 2 17 25 07 01 7009 4 518 8 425 917 0 07 01 7 013 14 24 12 39 CS A 325 2 Phân lô theo hàng trăm: 12 0999 11 917 0 10 325 2 12 39 0 428 17 25 8 425 14 24 917 0 0999 4 518 7 013 7009 7 013 07 01 7009 917 0... 14 24 0 428 12 39 8 425 17 25 4 518 7009 7 013 917 0 07 01 325 2 7 013 14 24 8 425 0 428 12 39 CS A 0999 6 Các lô B dùng để phân loại Phân lô theo hàng chục: 12 0999 11 7009 10 12 39 4 518 0 428 17 25 8 425 14 24

Ngày đăng: 20/10/2017, 15:42

TỪ KHÓA LIÊN QUAN

w