Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 94 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
94
Dung lượng
1,18 MB
Nội dung
LỜI NÓI ĐẦU Để đáp ứng nhu cầu học tập bạn sinh viên, sinh viên chuyên ngành công nghệ thông tin, chuyên ngành tin học kinh tế, chuyên ngành Điện tử Viễn thông tác giả Bộ môn Công nghệ phần mềm - Khoa Công Nghệ Thông Tin - Trường Đ i h ọ c T h i n g u y ê n tiến hành biên soạn tập giảng chương trình học đào tạo theo tín Bài giảng môn Cấu Trúc Dữ Liệu Thuật toán biên soạn dựa quyển: “Cấu trúc liệu thuật toán” tác giả Đinh Mạnh Tường, Nhà xuất Khoa học Kỹ thuật “Cấu trúc liệu giải thuật”, tác giả Đỗ Xuân Lôi, “ Cấu trúc liệu + giải thuật= Chương trình” N Wirth Giáo trình biên soạn dựa kinh nghiệm giảng dạy nhiều năm môn Cấu Trúc Dữ Liệu Giải Thuật Tài liệu soạn theo đề cương chi tiết môn Cấu Trúc Dữ Liệu v t h u ậ t t o n sinh viên chuyên ngành Công nghệ thông tin Khoa Công Nghệ Thông Tin - Trường Đại Học Thái nguyên Mục tiêu nhằm giúp bạn sinh viên chuyên ngành có tài liệu cô đọng dùng làm tài liệu học tập, không loại trừ toàn đối tượng khác tham khảo Chúng nghĩ bạn sinh viên không chuyên tin người quan tâm tới cấu trúc liệu giải thuật tìm điều hữu ích Mặc dù cố gắng nhiều trình biên soạn giáo trình chắn giáo trình nhiều thiếu sót hạn chế Rất mong nhận đóng góp ý kiến quý báu sinh viên bạn đọc để tập giảng ngày hoàn thiện trở thành giáo trình thực hữu ích Thái nguyên, 10 / 2009 Các tác giả Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN MỤC LỤC PHẦN TỔNG QUAN Chƣơng MỞ ĐẦU 1 Từ toán đến chƣơng trình 1.2 Các khái niệm 11 1.2.1 Mô hình liệu ( Data model ) 11 1.2.2 Khái niệm trừu tƣợng hóa 13 1.2.3 Kiểu liệu trừu tƣợng 14 1.2.4 Dữ liệu 14 1.2.5 Biểu diễn liệu máy tính 14 1.2.6 Kiểu liệu 14 1.2.7 Cấu trúc liệu (Data Structures) 16 1.2.8 Giải thuật 18 1.2.6 Mối quan hệ cấu trúc liệu giải thuật 18 1.3 Phân tích giải thuật 19 1.3.1 Sự cần thiết phải phân tích giải thuật 19 1.3.2 Thời gian thực giải thuật 20 1.3.3 Không gian giải thuật 23 1.4 Ngôn ngữ diễn đạt giải thuật 23 1.5 Đệ quy giải thuật đệ 24 1.5.1 Khái niệm đệ quy 24 1.5.2 Giải thuật đệ quy thủ tục đệ quy 24 Chƣơng MÔ HÌNH DỮ LIỆU DANH SÁCH 26 2.1 Danh sách (List) 26 21.1 Khái niệm danh sách 26 2.1 Các phép toán danh sách 27 2.1.3 Biểu diễn (cài đặt) danh sách máy tính 28 2.1.3.1 Danh sách cài đặt mảng 28 2.1.3.2 Danh sách cài đặt trỏ 33 2.2 Ngăn xếp (Stack) ứng dụng 41 2.2.1 Định nghĩa ngăn xếp 41 2.2.2 Các phép toán ngăn xếp: 42 2.2.3 Cài đặt ngăn xếp 42 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN 2.2.4 Ứng dụng ngăn xếp 43 2.3 Hàng đợi (QUEUE) 44 2.3.1 Định nghĩa hàng đợi 44 2.3.2 Các phép toán hàng 44 2.3.3 Cài đặt hàng đợi 45 2.3.3.1 Cài đặt hàng mảng 45 2.3.3.2 Cài đặt hàng danh sách liên kết (cài đặt trỏ) 48 2.3.4 Một số ứng dụng cấu trúc hàng 49 Chƣơng Mô hình liệu Cây 50 3.1 Cây tổng quát 50 3.1.1 Định nghĩa khái niệm 50 3.1.2 Các phép toán 51 3.1.3 Các cách thăm ( duyệt) 51 3.1.4 Cài đặt 55 3.1.4.1 Biểu diễn danh sách đỉnh 55 3.1.4.2 Biểu diễn trưởng em liền kề đỉnh 58 3.1.4.3 Biểu diễn cha đỉnh 60 3.2 Cây nhị phân (binary tree) 62 3.2.1 Định nghĩa 62 3.2.2 Duyệt nhị phân 63 3.2.3 Cài đặt nhị phân 65 3.2.4 Các phép toán nhị phân 65 3.3 Cây tìm kiếm nhị phân (binary search tree) 68 3.3.1 Định nghĩa TKNP 68 3.3.2 Cài đặt tìm kiếm nhị phân 69 3.3.3 Các phép toán tìm kiếm nhị phân 69 CHƢƠNG Mô hình liệu Đồ thị (Graph) 75 4.1 Định nghĩa đồ thị khái niệm 75 4.2 Các phép toán đồ thị 76 4.3 Biểu diễn đồ thị 77 4.3.1 Biểu diễn đồ thị ma trận kề 77 4.3.2 Biểu diễn đồ thị danh sách đỉnh kề 77 4.4 Các phép duyệt đồ thị (TRAVERSALS OF GRAPH) 78 4.4.1 Duyệt theo chiều sâu (depth-first search) 78 4.4.2 Duyệt theo chiều rộng (breadth-first search) 78 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN 4.4 Một số toán ứng dụng đồ thị: 78 Chƣơng Mô hình liệu Tập hợp 79 5.1 Khái niệm tập hợp 79 Mô hình liệu tập hợp 80 5.3 Cài đặt tập hợp cài đặt phép toán tập hợp 80 5.3.1.Cài đặt tập hợp vectơ bit 81 5.3.2 Cài đặt tập hợp mảng 82 5.3.3 Cài đặt danh sách liên kết danh sách đƣợc 82 5.5 Từ điển (Dictionary) 85 5.5.1 Từ điển gì? 85 5.5.2 Các phƣơng pháp cài đặt từ điển 85 5.5.3 Cấu trúc liệu Bảng băm, cài đặt từ điển bảng băm 85 5.5.3.1 Cài đặt từ điển bảng băm mở 86 5.5.3.2 Cài đặt từ điển bảng băm đóng 90 5.5.3.3 Các phương pháp xác định hàm băm 93 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN PHẦN TỔNG QUAN Mục đích yêu cầu Môn học cấu trúc liệu cung cấp cho sinh viên khối lượng lớn kiến thức cấu trúc liệu phép toán cấu trúc Sau học xong môn này, sinh viên cần phải: - Nắm vững khái niệm kiểu liệu, kiểu liệu trừu tượng, mô hình liệu, giải thuật cấu trúc liệu - Nắm vững cài đặt mô hình liệu, kiểu liệu trừu tượng danh sách, ngăn xếp, hàng đợi, cây, tập hợp, bảng băm, đồ thị ngôn ngữ lập trình - Vận dụng kiểu liệu trừu tượng, mô hình liệu để giải toán đơn giản thực tế Đối tƣợng sử dụng Môn học cấu trúc liệu dùng để giảng dạy cho sinh viên sau: - Sinh viên chuyên ngành công nghệ thông tin (môn bắt buộc ) - Sinh viên chuyên ngành tin học kinh tế (môn bắt buộc) - Sinh viên chuyên ngành Điện tử - Viễn thông tự động hóa (môn bắt buộc) Nội dung cốt lõi Nội dung giáo trình gồm chương đuợc trình bày 45 tiết cho sinh viên, có khoảng 30 tiết lý thuyết 15 tiết tập mà giáo viên hướng dẫn cho sinh viên lớp Bên cạnh tài liệu có tài liệu thực hành cấu trúc liệu, nội dung giáo trình trọng cấu trúc liệu giải thuật cấu trúc liệu Chƣơng 1: Trình bày cách tiếp cận từ toán đến chương trình, bao gồm mô hình hoá toán, thiết lập cấu trúc liệu theo mô hình toán, viết giải thuật giải toán bước tinh chế giải thuật đưa đến cài đặt cụ thể ngôn ngữ lập trình Chƣơng 2: Trình bày mô hình liệu danh sách, cấu trúc liệu để cài đặt danh sách, tập trung trình bày cấu trúc danh sách liên kết đơn, cấu trúc danh sách liên kết kép cho toán cần duyệt danh sách theo chiều xuôi, ngược cách thuận lợi Ngăn xếp hàng đợi trình bày chương hai cấu trúc danh sách đăc biệt Chương có nhiều cài đặt tương đối chi tiết để bạn sinh viên tiếp cận với lập trình có hội nâng cao khả lập trình ngôn ngữ C đồng thời nhằm minh hoạ việc cài đặt kiểu liệu trừu tượng ngôn ngữ lập trình cụ thể Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Chƣơng 3: Chương giới thiệu kiểu liệu trừu tượng cây, khái niệm tổng quát, phép duyệt tổng quát cài đặt tổng quát Kế đến trình bày nhị phân, cách cài đặt nhị phân Cuối cùng, trình bày tìm kiếm nhị phân cấu trúc dùng để lưu trữ tìm kiếm liệu hiệu Chƣơng 4: Trình bày mô hình liệu đồ thị, cách biểu diễn đồ thị cài đặt đồ thị Ở trình bày phép duyệt đồ thị bao gồm duyệt theo chiều rộng duyệt theo chiều sâu đồ thị đề cập số toán thường gặp đồ thị toán tìm đường ngắn nhất, toán tìm khung tối thiểu.… Do hạn chế thời lượng lên lớp nên chương giới thiệu để sinh viên tham khảo thêm cách cài đặt đồ thị toán đồ thị Chƣơng 5: Do hạn chế thời lượng lên lớp nên Chương Chương dành để nói mô hình liệu t ập hợp, cách đơn giản để cài đặt tập hợp cài đặt vectơ bít hay danh sách Phần chương trình bày kiểu liệu trừu tượng tự điển, tập hợp với ba phép toán thêm, xoá tìm kiếm phần tử, với cấu trúc lưu trữ thích hợp cho bảng băm Kiến thức tiên Để học tốt môn học cấu trúc liệu này, sinh viên cần phải có kiến thức sau: - Kiến thức kỹ lập trình - Kiến thức toán rời rạc Danh mục tài liệu tham khảo [1] Aho, A V , J E Hopcroft, J D Ullman "Data Structure and Algorihtms", Addison– Wesley; 1983 [2] Đỗ Xuân Lôi "Cấu trúc liệu giải thuật" Nhà xuất khoa học kỹ thuật Hà nội, 1995 [3] Đinh Mạnh Tƣờng, Cấu trúc liệu thuật toán, Nhà xuất Khoa học Kỹ thuật, 2003 [4] Michel T Goodrich, Roberto Tamassia, David Mount, “Data Structures and Algorithms in C++” Weley International Edition; 2004 [5] N Wirth " Cấu trúc liệu + giải thuật= Chương trình", 1983 [6] Nguyễn Trung Trực, "Cấu trúc liệu" BK HCM, 1990 [7] Lê Minh Trung; “Lập trình nâng cao Pascal với cấu trúc liệu”; 1997 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Chƣơng MỞ ĐẦU Tổng quan: Mục tiêu Sau học xong chương này, sinh viên sẽ: Nắm bước lập trình để giải cho toán Nắm vững khái niệm liên quan đến cấu trúc liệu giải thuật như: Mô hình liệu, kiểu liệu trừu tượng, kiểu liệu, giải thuật, Nắm vững tiêu chuẩn để lựa chọn cấu trúc liệu tốt cho toán Kiến thức cần thiết Các kiến thức cần thiết để học chương bao gồm: Khả nhận biết giải toán theo hướng tin học hóa Nội dung Chương nghiên cứu vấn đề sau: - Cách tiếp cận từ toán đến chương trình - Các khái niệm liên quan đến cấu trúc liệu thuật toán - Các tiêu chuẩn để lựa chọn cấu trúc liệu tốt cho toán - Kỹ thuật đệ quy cách giải toán - Ngôn ngữ diễn đạt giải thuật 1 Từ toán đến chƣơng trình Để giải toán thực tế máy tính ta thường trải qua giai đoạn: Giai đoạn 1: Xác định toán cần giải xây dựng mô hình toán học cho toán cần giải Mục đích trả lời hai câu hỏi: Bài toán cho yêu cầu làm gì? sau trả lời câu hỏi “để thực yêu cầu toán làm nào” Giai đoạn 2: Cài đặt chương trình: Sử dụng ngôn ngữ lập trình để xây dựng chương trình tương ứng với cách làm giai đoạn trước 1.1.2 Xác định & mô hình hóa toán cần giải Khi giải toán thực tế, ta phải việc xác định toán Nhiều thời gian công sức bỏ để xác định toán cần giải quyết, tức phải trả lời rõ ràng câu hỏi "phải làm gì?" sau "làm nào?" Thông thường, khởi đầu, hầu hết toán không đơn giản, không rõ ràng Để giảm bớt phức tạp toán thực tế, ta phải hình thức hóa nó, nghĩa phát biểu lại toán thực tế thành toán hình thức (hay gọi mô hình toán) Có thể có nhiều toán thực tế có mô hình toán Ví dụ 1: Tô màu đồ giới Ta cần phải tô màu cho nước đồ giới Trong nước Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN tô màu hai nước láng giềng (cùng biên giới) phải tô hai màu khác Hãy tìm phương án tô màu cho số màu sử dụng Ta xem nước đồ giới đỉnh đồ thị, hai nước láng giềng hai đỉnh ứng với nối với cạnh Bài toán lúc trở thành toán tô màu cho đồ thị sau: Mỗi đỉnh phải tô màu, hai đỉnh có cạnh nối phải tô hai màu khác ta cần tìm phương án tô màu cho số màu sử dụng Mô hình toán học sử dụng toán mô hình đồ thị Ví dụ 2: Đèn giao thông Cho ngã năm hình 1.1, C E đường chiều theo chiều mũi tên, đường khác hai chiều Hãy thiết kế bảng đèn hiệu điều khiển giao thông ngã năm cách hợp lý, nghĩa là: phân chia lối ngã năm thành nhóm, nhóm gồm lối đi đồng thời không xảy tai nạn giao thông (các lối có hướng không cắt nhau), số lượng nhóm chia B A C D E Hình 1.1 Ta xem đầu vào toán tất lối ngã năm này, đầu toán nhóm lối đi đồng thời mà không xảy tai nạn giao thông, nhóm tương ứng với pha điều khiển đèn hiệu, ta phải tìm kiếm lời giải với số nhóm để giao thông không bị tắc nghẽn phải chờ đợi lâu Trước hết ta nhận thấy ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED Tất nhiên, để giải toán ta phải tìm cách để thể mối liên quan lối Lối với lối đồng thời, lối lối đồng thời Ví dụ cặp AB EC đồng thời, AD EB không, hướng giao thông cắt Ở ta dùng sơ đồ trực quan sau: tên 13 lối viết lên mặt phẳng, hai lối đồng thời xảy đụng (tức hai hướng cắt qua nhau) ta nối lại đoạn thẳng, cong, ngoằn ngoèo tuỳ thích Ta có sơ đồ hình 1.2 Như vậy, sơ đồ này, hai lối có cạnh nối lại với hai lối cho đồng thời Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN AB AC AD BA BC DA DB DC EA EB EC BD ED Hình 1.2 Với cách biểu diễn ta có mô hình toán học đồ thị (Graph), lối trở thành đỉnh đồ thị, hai lối đồng thời nối đoạn ta gọi cạnh đồ thị Bây ta phải xác định nhóm, với số nhóm nhất, nhóm gồm lối đi đồng thời, ứng với pha đèn hiệu điều khiển giao thông Giả sử rằng, ta dùng màu để tô lên đỉnh đồ thị cho: - Các lối cho phép đồng thời có màu: Dễ dàng nhận thấy hai đỉnh có cạnh nối không tô màu - Số nhóm nhất: ta phải tính toán cho số màu dùng Tóm lại, ta phải giải toán sau: "Tô màu cho đồ thị hình 1.2 cho: - Hai đỉnh có cạnh nối với (hai gọi hai đỉnh kề nhau) không màu - Số màu dùng nhất." Nhƣ vậy: Cả hai toán trên, ban đầu khác nhau, sau phân tích để hình thức hóa chúng đưa mô hình toán học đồ thị, áp dụng thuật toán tô mầu đồ thị để giải toán Chú ý: Có nhiều cấu trúc toán học làm mô hình liệu tin học, ví dụ dãy, tập hợp, ánh xạ, cây, đồ thị, - Một toán thực tế thường bao gồm đối tượng liệu yêu cầu xử lý đối tượng đó, giai đoạn phân tích thiết kế, xây dựng mô hình toán học cho toán cần trọng đến hai vấn đề : + Tổ chức biểu diễn đối tượng liệu toán mô hình toán học nào? mô hình ta gọi mô hình liệu tin học Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN + Xây dựng thao tác xử lý đối tượng mô hình 1.1.2 Cài đặt chƣơng trình cho toán cần giải Khi cài đặt chương trình giải toán tương ứng ta quan tâm đến hai vấn đề: (1) Biểu diễn mô hình liệu toán máy tính để máy tính hiểu thực hiên thao tác chúng Giai đoạn gọi xây dựng cấu trúc liệu cho toán Ta cài đặt mô hình liệu nhiều cấu trúc liệu khác Trong cách cài đặt, số phép toán mô hình thực thuận lơi, phép toán khác lại không thuận lợi (2) Mã hóa giải thuật xử lý cấu trúc liệu tương ứng để giải yêu cầu đặt toán Ta sử dụng ngôn ngữ lập trình cụ thể (Pascal,C, ) để cài đặt kết giai đoạn phân tích thiết kế chương trình, bước ta dùng cấu trúc liệu cung cấp ngôn ngữ, ví dụ Array, Record, để biểu diễn m ô h ì n h d ữ l i ệ u c ủ a b i t o n , mã hóa giải thuật câu lệnh ngôn ngữ lập trình lựa chọn Như vậy, ta tóm tắt bước từ toán đến chương trình sau: 1) Về mặt liệu: Mô hình liệu -> Kiểu liệu trừu tượng -> Cấu trúc liệu Thật vậy: Trong trình phát triển chương trình, phát triển hệ thống phần mềm lớn, ta cần đến hai dạng biểu diễn liệu: Biếu diễn trừu tượng biểu diễn cụ thể a) Trong giai đoạn xác định va mô hình hóa toán: ta cần sử dụng dạng biểu diễn trừu tượng: xác định mô hình liệu – mô hình toán học đối tượng liệu với phép toán thực đối tượng đó, ví dụ như: Mô hình cây, danh sách, tập hợp, đồ thị, mô hình ERA, …… > Khi ta dùng mô hình liệu với số xác định phép toán đó, ta có kiểu liệu trừu tượng , ví dụ: Ngăn xếp, hàng đợi, bảng băm, … => Dạng biểu diễn liệu không phụ thuộc vào ngôn ngữ lập trình cụ thể b) Trong giai đoạn cài đặt chƣơng trình, ta cần sử dụng dạng biểu diễn cụ thể liệu: Là biểu diễn xác định cách lưu trữ vật lý liệu nhớ máy tính Biểu diễn cụ thể liệu xác định cấu trúc liệu Các cấu trúc liệu mô tả ngôn ngữ lập trình cụ thể mà ta sử dụng => Dạng biểu diễn phụ thuộc vào ngôn ngữ lập trình cụ thể Từ biểu diễn trừu tượng, ta chuyển dịch thành biều diễn cụ thể khác nhau, hay nói cách khác, từ mô hình liệu từ kiểu liệu trừu tượng, ta chuyển dịch thành cấu trúc liệu khác Ví dụ, ta cài đặt danh sách cấu trúc liệu mảng cấu trúc liệu danh sách liên kết Khi cài đặt mô hình liệu cấu trúc liệu đó, phép tóan mô hình thực thao tác cần thiết cấu trúc liệu 10 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN định phần tử tập hợp không Tuy nhiên, chương này, giả sử phần tử tập hợp có thứ tự tuyến tính, tức là, tập hợp S có quan hệ < = thoả mản hai tính chất: Với a,b S a10 xem tập dành cho bạn đọc 5.5 Từ điển (Dictionary) Từ điển kiểu liệu trừu tượng, tập hợp đặc biệt, quan tâm đến phép toán InsertSet, DeleteSet, Member MakeNullSet Sở dĩ nghiên cứu từ điển nhiều ứng dụng không sử dụng đến phép toán hợp, giao, hiệu hai tập hợp Ngược lại ta cần cấu trúc cho việc tìm kiếm, thêm bớt phần tử có phần hiệu gọi từ điển Chúng ta chấp nhận MakeNullSet phép khởi tạo cấu trúc từ điển 5.5.1 Từ điển gì? Mô hình liệu tập hợp, xét đến phép toán Insert (thêm phần từ vào tập hợp), Delete (loại bỏ phần tử khỏi tập hợp), Member (tìm xem tập hợp có chứa phần tử không) gọi kiểu liệu trừu tượng từ điển (Dictionary) 5.5.2 Các phƣơng pháp cài đặt từ điển Từ điển tập hợp, đương nhiên phải sử dụng phương pháp cài đặt tập hợp để cài đặt từ điển: - Bằng véc tơ bit: Sử dụng phương pháp từ điển tập hợp gồm phần tử dùng làm tập số cho mảng (thuộc kiểu liệu vô hướng đếm mã hóa thành kiểu liệu vô hướng đếm được) - Bằng danh sách ( móc nối), không thuận lợi cho phép tìm kiếm(với danh sách móc nối phải truy cập -> chí thích hợp áp dụng phương pháp tìm kiếm tuần tự), không thuận lơij cho phép toán thêm vào lấy (với danh sách – có tượng co, dãn, dịch chuyển phàn tử khác) - Giả sử từ điển danh sách thứ tự tuyến tính -> sử dụng tìm kiếm nhị phân: Độ phức mặt thời gian phép toán từ điển lớn (tương tự danh sách ) trường hợp suy biến thành danh sách - Ta sử dụng cần để biểu diễn tập hợp: Ưu điểm không xảy trường hợp suy biến TKNP, nhiên phép toán loại bỏ xen vào cân phức tạp, phải cân lại Do đó, để biểu diễn từ điển thuận lợi cho phép toán, áp dụng cho tập hợp có kích cỡ lớn (từ điểm thường có kích thước lớn), ta xét cách cài đặt khác là: sử dụng CTDL bảng băm để cài đặt từ điển 5.5.3 Cấu trúc liệu Bảng băm, cài đặt từ điển bảng băm Băm phương pháp thích hợp để cài đặt tập hợp có số phần tử lớn(từ điển) Có phương pháp băm khác nhau: + Phương pháp Băm mở: Cho phép sử dụng không gian không hạn chế để lưu giữ phần tử tập hợp + Phương pháp băm đóng: Sử dụng không gian cố định tập hợp cài đặt phải có cỡ không vượt không gian cho phép 85 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN 5.5.3.1 Cài đặt từ điển bảng băm mở a) Định nghĩa bảng băm mở - Tư tưởng bảng Băm là: Phân chia tập hợp cho thành số cố định lớp (N lớp) đánh số 0, 1, …, N-1 Sử dụng mảng T với số chạy từ đến N-1 Mỗi thành phần T[i] chứa trỏ, trỏ tới phần tử danh sách chứa phần tử tập hợp thuộc lớp thứ i Các phần tử tập hợp thuộc lớp tổ chức dạng danh sách liên kết, danh sách gọi tr“rổ” , T gọi bảng Băm (hash table) Nil Nil n-1 nil Hình 1: Cấu trúc bảng băm mở Việc chia phần tử tập hợp vào lớp thực bời hàm băm (hash function) h b) Hàm băm: Hàm băm ánh xạ từ tập liệu A đến số nguyên N-1: h : A → N-1; Theo giả sử x A h(x) số nguyên cho: 0≤h(x) ≤N-1 - Có tiêu chuẩn để lựa chọn hàm băm: +Hàm băm phải cho phép tính dễ dàng nhanh chóng giá trị Băm khoá + Nó phải phân bố khoá vào rổ Có nhiều cách để xây dựng hàm băm, cách đơn giản „nguyên hóa x „ sau lấy h(x) = x % N Ví dụ : Cho tập hợp A = {1, 5, 7, 2, 5, 15} - 86 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Bảng băm mảng gồm phần tử hàm băm h(x) = x % 5; Ta có bảng băm lưu trữ A sau : Bảng băm chứa trỏ, trỏ tới phần tử đầu danh sách Danh sách “rổ” Bảng băm mở Hàm băm đƣợc thiết kế nhƣ sau {Ham bam h(X)=X Mod B} Function h(X: KeyType): N-1; Begin H := X%B; End; Ví dụ: Viết hàm Băm Pascal (sử dụng phương pháp lấy phần dư) để băm khoá xâu ký tự có độ dài 10 thành giá trị từ đến N-1 Type KeyType = String[10]; Function h (x: KeyType): N-1; Var I, Sum: integer; Begin Sum:= 0; For I = to 10 Sum := Sum + ord(x[i]); h := Sum mod N; End; c) Cài đặt từ điển bảng băm mở: Const N = …; Type pointer = ^ Element; 87 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Element = record key : KeyType; [data: ElementType]; {các trường thông tin khác có} Next : Pointer; End; Dictionary = array [0 N-1] of pointer; Var T: Dictionary; d) Cài đặt phép toán từ điển - Khởi tạo bảng băm mở rỗng Lúc tất “rổ” rỗng nên ta gán tất trỏ trỏ đến đầu danh sách rổ Nil Procedure MakeNullSet( var D: Dictionary) Var i: integer; Begin For i:=0 to B-1do D[i] := Nil; End; - Kiểm tra thành viên có từ điển không Để kiểm tra xem phần tử x có từ điển hay không, ta giá trị băm (h(x)) Theo cấu trúc bảng băm khoá x nằm “rổ” trỏ T[h(x)] Như để tìm khoá x trước hết ta phải tính h(x) sau duyệt danh sách “rổ” trỏ T[h(x)] để tìm x Giải thuật nhƣ sau: Function Member(x: KeyType; Var T: Dictionary): boolean; Var P: ponter; found: boolean; Begin P := T[h(x)]; Found := false; While (pnil)and(not found)do If P^ key = x then found := true Else P := P^ Next; Member := found; End; - Thêm phần tử vào từ điển Để thêm phần tử có khóa x vào từ điển ta phải tính h(x) để xác định xem thêm vào “rổ”/ “lớp” Vì ta không quan tâm đến thứ tự phần tử “rổ” nên ta đ ể đ n g i ả n t a thêm phần tử đầu “rổ” 88 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Giải thuật nhƣ sau: Procedure Insert (x: KeyType; var T: Dictionary ); Var i: N-1; P: Pointer; Begin If not Member(x, T) then Begin i := h(x); New(P); P^ key := x; P^ Next := T[i]; T[i]:= P; End; End; - Xoá phần tử từ điển Xoá phần tử x từ điển, ta làm sau: - Tính giá trị băm h(x) - Kiểm tra xem phần tử x có thuộc “lớp” trỏ T[h(x)] không? Nếu có loại bỏ phần tử Khi loại x cần phân biệt x nằm đầu “lớp” x không nằm đầu “ lớp” Giải thuật sau Procedure Delete(x: KeyType; Var T : Dictionary); Var i: N-1; P, Q : pointer; Found : Boolean; Begin i := h(x); if T[i]nil then if T[i]^.key = x then {loại x khói danh sách} T[i] := T[i]^.Next; Else Begin {xem xét thành phần danh sách} Q := T[i]; P := Q^.Next; Found := false; While(P nil) and(not found) 89 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN If P^ Key= x then Begin {loại x khỏi d.s} Q^.Next := P^.Next; Found := true; End Else Begin Q := P; P := Q^.Next; End; End; End; 5.5.3.2 Cài đặt từ điển bảng băm đóng a) Thế bảng băm đóng? Bảng băm đóng lưu giữ phần tử từ điển mảng (các phần tử “rổ” i lưu phần tử thứ i mảng) không dùng mảng để lưu trữ trỏ trỏ tới đầu danh sách liên kết – “rổ” Tương tự băm mở, bảng băm đóng “rổ” thứ i chứa phần tử có giá trị băm i, có nhiều phần tử có giá trị băm nên ta gặp trường hợp sau: ta muốn đưa vào “rổ” i phần tử x “rổ” bị chiếm phần tử y = > g â y r a đụng độ Như thiết kế bảng băm đóng ta phải có cách để giải đụng độ * Giải đụng độ Cách giải đụng độ gọi băm lại (rehash) sau: - Chọn vị trí h1, , hk theo cách gặp vị trí trống để đặt x vào Dãy h1, , hk gọi dãy phép thử, k gọi tổng số lần băm lại, hi giá trị hàm băm lần băm lại thứ i - Có nhiều cách băm lại Một chiến lược đơn giản băm lại tuyến tính, dãy phép thử có dạng : hi(x) = (h(x)+1) mod N Ví dụ N=8 phần tử từ điển a,b,c,d có giá trị băm là: h(a)=3, h(b)=0, h(c)=5, h(d)=3 Ta muốn đưa phần tử vào bảng băm Khởi đầu bảng băm rỗng, coi “rổ‟ chứa giá trị đặc biệt Empty, Empty không với phần tử mà ta xét tập hợp phần tử muốn đưa vào bảng băm Ta đặt a vào “rổ” 3, b vào “rổ” 0, c vào “rổ” Xét phần tử d, d có h(d)=3 “rổ” bị a chiếm ta tìm vị trí h1(d)= (h(d)+1) mod N = , vị trí “rổ” rỗng ta đặt d vào 90 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN b a d c Hình 5.1 - Giải đụng độ bảng băm đóng chiến lƣợc băm lại tuyến tính Trong bảng băm đóng, phép kiểm tra thành viên (thủ tục MEMBER (x,A)) phải xét dãy “rổ” h(x),h1(x),h2(x), tìm thấy x tìm thấy vị trí trống Bởi hk(x) vị trí trống gặp x tìm gặp vị trí xa Tuy nhiên, nói chung điều với trường hợp ta không xoá phần tử bảng băm Nếu chấp nhận phép xoá qui ước phần tử bị xóa thay giá trị đặc biệt, gọi Deleted, giá trị Deleted không với phần tử tập hợp xét vào phải khác giá trị Empty Empty giá trị đặc biệt cho ta biết ô trống Ví dụ - Tìm phần tử e bảng băm trên, giả sử h(e)=5 Chúng ta tìm kiếm e vị trí 5,5,6 “rổ” chứa Empty, e bảng băm - Tìm d, h(d)=3 ta khởi đầu vị trí duyệt qua “rổ” 5,5 Phần tử d tìm thấy “rổ” * Sử dụng bảng băm đóng để cài đặt từ điển Dưới khai báo thủ tục cần thiết để cài đặt từ điển bảng băm đóng Để dễ dàng minh hoạ giá trị Deleted Empty, giả sử ta cần cài đặt từ điển gồm chuỗi 10 kí tự Ta qui ước: Empty chuỗi 10 dấu + Deleted chuỗi 10 dấu * b) Cài đặt từ điển bảng băm đóng Const N=…; Deleted = -1000; {Gia dinh gia tri cho o da bi xoa} Empty=1000; {Gia dinh gia tri cho o chua su dung} type ElementType = integer; Dictionary = array[ N-1] of elementType; Var T : Dictionary; c) Cài đặt phép toán từ điển bảng băm đóng: Với giá khoá x, để thực phép toán Insert, Delete, Member ta phải xác định vị trí bảng có chứa x, hoăc vị trí bảng cần đặt x vào Tư tưởng để tìm vị trí thăm dò vị trí h(x), h1(x), h2(x), … Điều thực thủ tục Location + Cách làm: - Với giá trị khoá x, thủ tục cho phép thăm dò vị trí bảng, xuất phát từ vị trí xác định giá trị băm h(x), qua vị trí h 1(x), h2(x), … tìm vị trí có chứa x , tìm vị trí trống 91 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN - Quá trình thăm dò dừng lại qua toàn bảng mà không thành công (Không tìm vị trí chứa x, tìm vị trí trống đầu tiên) Tham biến k: Lưu vị trí mà trình thăm dò dừng lại Tham biến j: Lưu vị trí loại bỏ (Deleted) vị trí trống mà trình thăm dò phát bảng có vị trí 1- Thủ tục xác định vị trí đặt x Procedure Location(x: keytype; var k,j : integer); Var I : integer; { I ghi lại giá trị băm h(x)} Begin I := h(x); J : = I; If (T[i] = x )or(T[i] = empty )then k := I Else Begin K := (i+1)mod n; While (k i)and(T[k]x)and(T[k]enpty)do Begin If (T[k] = deleted )and(T[j]deleted)then j := k; K := (k+1)mod N; End; If (T[k]= empty)and(T[j]deleted)then j := k; End; End; 2- Thủ tục tìm xem x có thuộc từ điển T hay không? Function Member(x : keytype; var T : Dictionary): boolean; var k, j : integer; Begin Location(x,k,j); If T[k]= x then Member := true Else Member := false; End; 3- Thủ tục thêm phần tử x vào từ điển T Procedure Insert (x : KeyType; var T : Dictionary); var k,j : integer; Begin Location(x,k,j); If (T[k]x) then 92 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN If (T[j] = deleted)or(T[j] = empty )then T[j] := x Else Writeln(„bảng đầy‟) Else Writeln(„ bảng có x‟); End; – Thủ tục xoá phần tử x thuộc từ điển T Procedure Delete (x : keyType; var T : Dictionary); var k, j : integer; Begin Location(x,k,j); If T[k] = x then T[k] := deleted; End; 5.5.3.3 Các phương pháp xác định hàm băm a) Phƣơng pháp chia "Lấy phần dư giá trị khoá chia cho số “rổ”" Tức hàm băm có dạng: H(x)= x mod B Phương pháp rõ ràng đơn giản không cho kết ngẫu nhiên Chẳng hạn B=1000 H(x) phụ thuộc vào ba số cuối khoá mà không phụ thuộc vào số đứng trước Kết ngẫu nhiên B số nguyên tố b) Phƣơng pháp nhân "Lấy khoá nhân với chọn số chữ số làm kết hàm băm" Ví dụ: x h(x) g ồm số x2 5502 367 1256 2983 29181605 00135689 01552516 08898289 181 816 135 356 552 525 898 982 Vì chữ số phụ thuộc vào tất chữ số có mặt khoá khoá có khác đôi chút hàm băm cho kết khác c) Phƣơng pháp tách gấp Đối với khoá dài kích thước thay đổi người ta thường dùng phương pháp phân đoạn, tức phân khoá thành nhiều đoạn có kích thước từ đầu ( trừ đoạn đầu cuối ), nói chung đoạn có độ dài độ dài kết hàm băm Phân đoạn tách sau gấp: 93 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Cách làm: tách khóa đoạn xếp đoạn thành hàng canh thẳng đầu gấp (thực phép toán đó, ví dụ như:cộng, trừ, … chúng lại) áp dụng phương pháp chia để có kết băm ví dụ: khoá 17056329 tách thành 329 056 017 cộng lại ta 392 392 mod 1000 = 392 kết băm khoá cho 94 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN ... nội dung giáo trình trọng cấu trúc liệu giải thuật cấu trúc liệu Chƣơng 1: Trình bày cách tiếp cận từ toán đến chương trình, bao gồm mô hình hoá toán, thiết lập cấu trúc liệu theo mô hình toán, ... giải thuật cấu trúc liệu có mối quan hệ chặt chẽ với nhau, thể qua công thức : Cấu trúc liệu + Giải thuật = Chƣơng trình Với cấu trúc liệu chọn, có giải thuật tương ứng, phù hợp Khi cấu trúc liệu. .. Kiểu liệu có hai loại kiểu liệu sơ cấp kiểu liệu có cấu trúc hay gọi cấu trúc liệu Kiểu liệu c sở : kiểu liệu mà giá trị liệu đơn Ví dụ: kiểu Boolean, Integer… Kiểu liệu có cấu trúc hay gọi cấu trúc