1. Trang chủ
  2. » Công Nghệ Thông Tin

BÀI GIẢNG cấu TRÚC dữ LIỆU đh HÀNG hải

80 542 1

Đ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

BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HỌC MÁ Y TÍ NH KHOA: CÔNG NGHỆ THÔNG TIN BÀI GIẢNG CẤU TRÚC DỮ LIỆU TÊN HỌC PHẦN : CẤU TRÚC DỮ LIỆU MÃ HỌC PHẦN : 17207 TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY DÙNG CHO SV NGÀNH : CÔNG NGHỆ THÔNG TIN HẢI PHÒNG Thuvientailieu.net.vn MỤC LỤC CHƢƠNG CÁC KHÁI NIỆM MỞ ĐẦU 1.1 Giải thuật cấu trúc liệu 1.2 Cấu trúc liệu vấn đề liên quan 1.3 Ngôn ngữ diễn đạt giải thuật 1.4 Kiểu liệu, cấu trúc liệu, kiểu liệu trừu tƣợng CHƢƠNG CÁC KIỂU DỮ LIỆU TRỪU TƢỢNG CƠ BẢN Ngăn xế p - Stack 2.1.1 Khái niệm 2.1.2 Các thao tác của ngăn xếp 2.1.3 Ví dụ hoạt động của stack 2.1.4 Cài đặt stack bằng mảng 2.1.5 Ứng dụng của stack 10 2.2 Hàng đợi - Queue 12 2.2.1 Khái niệm 12 2.2.2 Các thao tác của hàng đợi 13 2.2.3 Cài đặt hàng đợi sử dụng mảng 13 2.2.4 Ví dụ hoạt động của hàng đợi với cài đặt bằng mảng vòng tròn 16 2.2.5 Ứng dụng của hàng ̣i 16 2.3 Danh sách liên kế t – Linked list 17 2.3.1 Đinh ̣ nghiã 17 2.3.2 Các thao tác danh sách liên kế t 17 2.3.3 Cài đặt danh sách liên kết sử dụng trỏ 18 2.3.4 Các kiểu danh sách liên kết khác 25 2.3.5 Mô ̣t số ví du ̣ sƣ̉ du ̣ng cấ u trúc danh sách liên kế t 26 2.3.6 Cài đặt stack queue bằng trỏ 26 2.4 Bài tập áp dụng 26 CHƢƠNG CÂY (TREE) 28 3.1 Đinh ̣ nghĩa 28 3.1.1 Đồ thị (Graph) 28 3.1.2 Cây (tree) 29 3.3 Cây tìm kiế m nhi ̣phân (Binary Search Tree - BST) 31 3.3.1 Đinh ̣ nghiã 31 3.3.2 Khởi ta ̣o rỗng 32 3.3.3 Chèn thêm nút mới vào 32 3.3.4 Xóa bỏ khỏi nút 33 3.3.5 Tìm kiếm 34 3.3.6 Duyê ̣t 35 3.3.7 Cài đặt BST 36 3.4.Cây cân bằng – AVL 39 CHƢƠNG BẢNG BĂM (HASH TABLE) 54 Định nghĩa bảng băm 54 4.1.1.Định nghĩa : 54 4.1.2.Kích thƣớc của bảng băm : 55 4.1.3 Phân loại : 55 4.1.4.Các phép toán bảng băm : 57 4.2.Hàm băm loại hàm băm : 57 4.2.1.Hàm băm (Hash Function): 57 4.2.2.Một số loại hàm băm : 58 i Thuvientailieu.net.vn 4.3.Xung đột cách xử lý xung đột 61 4.3.1 Định nghĩa : 61 4.3.2.Hệ số tải (Load Factor - ) : 61 4.3.3.Một số phƣơng pháp xử lý xung đột : 61 4.3.4 Đánh giá : 71 4.4.4.Kết luận : 72 4.5 Bài tập áp dụng 72 TÀI LIỆU THAM KHẢO 75 ii Thuvientailieu.net.vn Tên học phần: Cấu trúc liệu Bộ môn phụ trách giảng dạy: Khoa học Máy tính Mã học phần: 17207 TS tiết 60 Lý thuyết 30 Thực hành/Xemina 30 Tự học Loại học phần: Khoa phụ trách: CNTT Tổng số TC: Bài tập lớn Đồ án môn học Điều kiện tiên quyết: Sinh viên phải học xong học phần sau mới đƣợc đăng ký học phần này: Toán cao cấp, Toán rời rạc, Ngôn ngữ C, Tin học đại cƣơng Mục tiêu học phần: Cung cấp kiến thức rèn luyện kỹ thực hành cấu trúc liệu cho sinh viên Nội dung chủ yếu - Những vấn đề cấu trúc liệu; - Các cấu trúc liệu - Danh sách liên kết; - Ngăn xếp, hàng đợi; - Cấu trúc cây; - Bảng băm, Nội dung chi tiết học phần: TÊN CHƢƠNG MỤC Chƣơng I : Khái niệm liên quan đến CTDL 1.1 Giải thuật cấu trúc liệu 1.2 Giải thuật vấn đề liên quan 1.3 Ngôn ngữ diễn đạt giải thuật 1.4 Kiểu liệu, cấu trúc liệu, kiểu liệu trừu tƣợng Chƣơng II : Các kiểu liệu trừu tƣợng 2.1 Danh sách 2.1.1 Khái niệm danh sách 2.1.2 Các phép toán danh sách 2.1.3 Cài đặt danh sách 2.1.4 Các dạng danh sách liên kết (DSLK): DSLK đơn, vòng, kép, … 2.2 Ngăn xếp (stack) 2.2.1 Khái niệm 2.2.2 Cài đặt ngăn xếp mảng, DSLK 2.2.3 Ứng dụng 2.3 Hàng đợi (queue) 2.3.1 Khái niệm 2.3.2 Cài đặt hàng đợi mảng, DSLK 2.3.3 Ứng dụng 2.4 Bài tập áp dụng Chƣơng III: Cây (tree) 3.1 Khái niệm 3.2 Cây tổng quát TS PHÂN PHỐI SỐ TIẾT LT TH/Xemina BT 12 6 18 iii Thuvientailieu.net.vn KT TÊN CHƢƠNG MỤC 3.2.1 Biểu diễn tổng quát 3.2.2 Duyệt tổng quát 3.2.3 Vài ví dụ áp dụng 3.3 Cây nhị phân 3.3.1 Định nghĩa tính chất 3.3.2 Lƣu trữ 3.3.3 Duyệt 3.3.4 Cây nhị phân nối vòng 3.4 Các phép toán thực nhị phân 3.4.1 Dựng 3.4.2 Duyệt để tìm kiếm 3.4.3 Sắp xếp nhị phân 3.5 Cây tìm kiếm nhị phân (binary search tree) 3.5.1 Khái niệm, cài đặt 3.5.2 Cây AVL 3.6 Bài tập Chƣơng IV: Bảng băm (hash table) 4.1 Khái niệm 4.2 Các loại hàm băm 4.3 Các phƣơng pháp giải quyết xung đột 4.4 Đánh giá hiệu phƣơng pháp băm 4.5 Bài tập áp dụng TS 14 PHÂN PHỐI SỐ TIẾT LT TH/Xemina BT Nhiệm vụ sinh viên : Tham dự buổi thuyết trình của giáo viên, tự học, tự làm tập giáo viên giao, tham dự kiểm tra định kỳ cuối kỳ Tài liệu học tập : Đinh Mạnh Tƣờng, Cấu trúc liệu thuật toán, Nhà xuất ĐH QG Hà Nội, 2004 Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, Nhà xuất ĐH QG Hà Nội, 2004 Robert Sedgewick, Cẩm nang thuật toán, NXB Khoa học kỹ thuật, 2000 Hình thức tiêu chuẩn đánh giá sinh viên: - Hình thức thi cuối kỳ : Thi viết - Sinh viên phải đảm bảo điều kiện theo Quy chế của Nhà trƣờng của Bộ Thang điểm: Thang điểm chữ A, B, C, D, F Điểm đánh giá học phần: Z = 0,3X + 0,7Y Bài giảng tài liệu thức thống của Bộ môn Khoa học máy tính, Khoa Công nghệ thông tin đƣợc dùng để giảng dạy cho sinh viên Ngày phê duyệt: / /20 Trƣởng Bộ môn: ThS Nguyễn Hữu Tuân (ký ghi rõ họ tên) iv Thuvientailieu.net.vn KT CHƢƠNG CÁC KHÁI NIỆM MỞ ĐẦU 1.1 Giải thuật cấu trúc liệu Ðể giải toán thực tế bằng máy tính 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 nhƣ thế nào?" Thông thƣờng, khởi đầu, hầu hết toán không đon giản, không rõ ràng Ðể giảm bớt phức tạp của 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 còn 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ụ : Tô màu đồ thế giới Ta cần phải tô màu cho nƣớc đồ thế giới Trong đó nƣớc đƣợc tô màu hai nƣớc láng giềng (cùng biên giới) thì phải đƣợc tô bằng hai màu khác Hãy tìm phƣơng án tô màu cho số màu sử dụng ít Ta có thể xem nƣớc đồ thế giới đỉnh của đồ thị, hai nƣớc láng giềng của thì hai đỉnh ứng với nó đƣợc nối với bằng cạnh Bài toán lúc trở thành toán tô màu cho đồ thị nhƣ sau: Mỗi đỉnh phải đƣợc tô màu, hai đỉnh có cạnh nối thì phải tô bằng hai màu khác ta cần tìm phƣơng án tô màu cho số màu đƣợc sử dụng ít Ðối với toán đƣợc hình thức hoá, có thể tìm kiếm cách giải thuật ngữ của mô hình đó xác định có hay không chƣong trình có sẵn để giải Nếu không có chƣơng trình nhƣ thì ít có thể tìm đƣợc gì biết mô hình dùng tính chất của mô hình để xây dựng giải thuật tốt Khi có mô hình thích hợp cho toán ta cần cố gắng tìm cách giải quyết toán mô hình đó Khởi đầu tìm giải thuật, đó chƣỗi hữu hạn thị (instruction) mà thị có ý nghĩa rõ ràng thực đƣợc lƣợng thời gian hữu hạn Nhƣng xét cho cùng, giải thuật phản ánh phép xử lý, còn đói tƣợng để xử lý máy tính chính liệu (data ), chúng biểu diễn thông tin cần thiết cho toán: liệu vào, liệu ra, liệu trung gian, … Không thể nói tới giải thuật mà không nghĩ tới: giải thuật đó đƣợc tác động liệu nào, còn xét tới liệu thì phải biết liệu cần đƣợc giải thuật gì tác động để đƣa kết mong muốn Nhƣ vậy, cấu trúc liệu giải thuật có mối liên quan mật thiết với 1.2 Cấu trúc liệu vấn đề liên quan Trong toán, liệu bao gồm tập phần tử sở, đƣợc gọi liệu nguyên tử Dữ liệu nguyên tử có thể chữ số, ký tự, … có thể số, xâu, … tùy vào toán Trên sở liệu nguyên tử, cung cách khả dĩ theo đó lien kết chúng lại với nhau, đãn đến cấu trúc liệu khác Lựa chọn cấu trúc liệu thích hợp để tổ chức liệu vào sở đó xây dựng đƣợc giải thuật xử lý hữu hiệu đƣa tới kết mong muốn cho toán (dữ liệu ra), khâu quan trọng Cách biểu diễn cấu trúc liệu nhớ đƣợc gọi cấu trúc lƣu trữ Đây chính cách cài đặt cấu trúc máy tính sở cấu trúc lƣu trữ mà thực phép xử lý Có thể có nhiều cấu trúc lƣu trữ khác cho cấu trúc liệu ngƣợc lại Khi đề cập tới cấu trúc lƣu trũ, cần phân biệt: cấu trúc lƣu trữ tƣơng ứng với nhớ – lƣu trữ trong; cấu trúc lƣu trữ ứng với nhớ – lƣu trữ Chúng có đặc điểm cách xử lý riêng Thuvientailieu.net.vn 1.3 Ngôn ngữ diễn đạt giải thuật Việc sử dụng ngôn ngữ lập trình bậc cao để diễn đạt giải thuật, nhƣ Pascal, C, C++, … gặp số hạn chế sau: - Phải tuân thủ quy tắc chặt chẽ cú pháp của ngôn ngữ khiến cho việc trình bày giải thuật cấu trúc liệu có thiên hƣớng nặng nề, gò bó - Phải phụ thuộc vào cấu trúc liệu tiền định của ngôn ngữ nên có lúc đƣợc đầy đủ ý cấu trúc mà ta muỗn biểu đạt Một có mô hình thích hợp cho toán, ta cần hình thức hoá giải thuật, cấu trúc liệu thuật ngữ của mô hình đó Khởi đầu viết mệnh đề tổng quát rồi tinh chế dần thành chuỗi mệnh đề cụ thể hơn, cuối thị thích hợp ngôn ngữ lập trình Ở bƣớc này, nói chung, ta có giải thuật, cấu trúc liệu tƣơng đói rõ ràng, nó gần giống nhƣ chƣơng trình đƣợc viết ngôn ngữ lập trình, nhƣng nó chƣơng trình chạy đƣợc vì viết giải thuật ta không trọng nặng đến cú pháp của ngôn ngữ kiểu liệu còn mức trừu tƣợng khai báo cài đặt kiểu ngôn ngữ lập trình Chẳng hạn với giải thuật tô màu đồ thị GREEDY, giả sử đồ thị G, giải thuật xác định tập hợp Newclr đỉnh của G đƣợc tô màu, mà ta gọi màu mới C Ðể tiến hành tô màu hoàn tất cho đồ thị G thì giải thuật phải đƣợc gọi lặp lại cho đến toàn thể đỉnh đƣợc tô màu void GREEDY ( GRAPH *G, SET *Newclr ) { Newclr = ; /*1*/ for (mỗi đỉnh v chƣa tô màu của G) /*2*/ if (v không đƣợc nối với đỉnh Newclr) /*3*/ { đánh dấu v đƣợc tô màu; /*4*/ thêm v vào Newclr; /*5*/ } } Trong thủ tục bằng ngôn ngữ giả dùng số từ khoá của ngôn ngữ C xen lẫn mệnh đề tiếng Việt Ðiều đặc biệt ta dùng kiểu GRAPH, SET có vẻ xa lạ, chúng "kiểu liệu trừu tƣợng" mà sau viết bằng khai báo thích hợp ngôn ngữ lập trình cụ thể Dĩ nhiên, để cài đặt thủ tục ta phải cụ thể hoá dần mệnh đề bằng tiếng Việt cho đến mệnh đề tƣơng ứng với doạn mã thích hợp của ngôn ngữ lập trình Chẳng hạn mệnh đề if /*3*/ có thể chi tiết hoá nhƣ sau: void GREEDY ( GRAPH *G, SET *Newclr ) { Newclr= ; /*1*/ for (mỗi đỉnh v chƣa tô màu của G) /*2*/ { int found=0; /*3.1*/ for (mỗi đỉnh w Newclr) /*3.2*/ if (có cạnh nối v w) /*3.3*/ found=1; /*3.4*/ if (found==0)/*3.5*/ { đánh dấu v đƣợc tô màu; /*4*/ thêm v vào Newclr; /*5*/ } Thuvientailieu.net.vn } } GRAPH SET ta coi nhƣ tập hợp Có nhiều cách để biểu diễn tập hợp ngôn ngữ lập trình, để đơn giản ta xem tập hợp nhƣ danh sách (LIST) số nguyên biểu diễn số của đỉnh kết thúc bằng giá trị đặc biệt NULL Với qui ƣớc nhƣ ta có thể tinh chế giải thuật GREEDY bƣớc nhƣ sau: void GREEDY ( GRAPH *G, LIST *Newclr ) { int found; int v,w ; Newclr= ; v= đỉnh chƣa đƣợc tô màu G; while (vnull) { found=0; w=đỉnh newclr; while( wnull) && (found=0) { if ( có cạnh nối v w ) found=1; else w= đỉnh kế tiếp newclr; } if (found==0 ) { Ðánh dấu v đƣợc tô màu; Thêm v vào Newclr; } v= đỉnh chƣa tô màu kế tiếp G; } } 1.4 Kiểu liệu, cấu trúc liệu, kiểu liệu trừu tƣợng Khái niệm trừu tƣợng hóa Trong tin học, trừu tƣợng hóa nghĩa đơn giản hóa, làm cho nó sáng sủa dễ hiểu Cụ thể trừu tƣợng hóa che di chi tiết, làm bật tổng thể Trừu tƣợng hóa có thể thực hai khía cạnh trừu tƣợng hóa liệu trừu tƣợng hóa chƣơng trình Trừu tƣợng hóa chƣơng trình Trừu tƣợng hóa chƣơng trình định nghĩa chƣơng trình để tạo phép toán trừu tƣợng (sự tổng quát hóa của phép toán nguyên thủy) Chẳng hạn ta có thể tạo chƣơng trình Matrix_Mult để thực phép toán nhân hai ma trận Sau Matrix_mult đƣợc tạo ra, ta có thể dùng nó nhƣ phép toán nguyên thủy (chẳng hạn phép cộng hai số) Trừu tƣợng hóa chƣơng trình cho phép phân chia chƣơng trình thành chƣơng trình Sự phân chia che dấu tất lệnh cài đặt chi tiết chƣơng trình Ở cấp độ chƣơng trình chính, ta thấy lời gọi chƣơng trình điều đƣợc gọi bao gói Ví dụ nhƣ chƣơng trình quản lý sinh viên đƣợc viết bằng trừu tƣợng hóa có thể là: void main() { Nhap(Lop); Thuvientailieu.net.vn Xu_ly (Lop); Xuat (Lop); } Trong chƣơng trình trên, Nhap, Xu_ly, Xuat phép toán trừu tƣợng Chúng che dấu bên nhiều lệnh phức tạp mà cấp độ chƣơng trình chính ta không nhìn thấy đƣợc Còn Lop biến thuộc kiểu liệu trừu tƣợng mà ta xét sau Chƣơng trình đƣợc viết theo cách gọi phép toán trừu tƣợng có lệ thuộc vào cách cài đặt kiểu liệu không? Trừu tƣợng hóa liệu Trừu tƣợng hóa liệu định nghĩa kiểu liệu trừu tƣợng Một kiểu liệu trừu tƣợng mô hình toán học với tập hợp phép toán (operator) trừu tƣợng đƣợc định nghĩa mô hình Ví dụ tập hợp số nguyên với phép toán hợp, giao, hiệu kiểu liệu trừu tƣợng Trong ADT phép toán có thể thực đói tƣợng (toán hạng) không thuộc ADT đó, nhƣ kết không thiết phải thuộc ADT Tuy nhiên, phải có ít toán hạng hoặc kết phải thuộc ADT xét ADT tổng quát hoá kiểu liệu nguyên thƣỷ Ðể minh hoạ ta có thể xét phác thảo cuối của thủ tục GREEDY Ta dùng danh sách (LIST) số nguyên phép toán danh sách newclr là: - Tạo danh sách rỗng - Lấy phần tử danh sách trả giá trị null nếu danh sách rỗng - Lấy phần tử kế tiếp danh sách trả giá trị null nếu không còn phần tử kế tiếp h Nếu viết chƣơng trình thực phép toán này, thì ta dễ dàng thay mệnh đề hình thức giải thuật bằng câu lệnh đơn giản Câu lệnh Mệnh đề hình thức MAKENULL(newclr) newclr=; w=FIRST(newclr) w=phần tử newclr w=NEXT(w,newclr) w=phần tử kế tiếp newclr INSERT( v,newclr) Thêm v vào newclr Ðiều cho thấy thuận lợi của ADT, đó ta có thể định nghĩa kiểu liệu tuỳ ý với phép toán cần thiết nó rồi dùng nhƣ đói tƣợng nguyên thuỷ Hơn có thể cài đặt ADT bằng cách nào, chƣơng trình dùng chúng không thay đổi, có chƣơng trình biểu diễn cho phép toán của ADT thay đổi Cài đặt ADT thể phép toán mong muốn (các phép toán trừu tƣợng) thành câu lệnh của ngôn ngữ lập trình, bao gồm khai báo thích hợp thủ tục thực phép toán trừu tƣợng Ðể cài đặt ta chọn cấu trúc liệu thích hợp có ngôn ngữ lập trình hoặc cấu trúc liệu phức hợp đƣợc xây dựng lên từ kiểu liệu của ngôn ngữ lập trình Sự khác kiểu liệu kiểu liệu trừu tƣợng gì? Mặc dù thuật ngữ kiểu liệu (hay kiểu - data type), cấu trúc liệu (data Thuvientailieu.net.vn structure), kiểu liệu trừu tƣợng (abstract data type) nghe nhƣ nhau, nhƣng chúng có ý nghĩa khác Kiểu liệu tập hợp giá trị tập hợp phép toán giá trị đó Ví dụ kiểu Boolean tập hợp có giá trị TRUE, FALSE phép toán nó nhƣ OR, AND, NOT … Kiểu Integer tập hợp số nguyên có giá trị từ -32768 đến 32767 phép toán cộng, trừ, nhân, chia, Div, Mod… 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 còn gọi cấu trúc liệu Kiểu liệu sơ cấp kiểu liệu mà giá trị liệu của nó đơn Ví dụ: kiểu Boolean, Integer… Kiểu liệu có cấu trúc hay còn gọi cấu trúc liệu kiểu liệu mà giá trị liệu của nó kết hợp của giá trị khác Ví dụ: ARRAY cấu trúc liệu Một kiểu liệu trừu tƣợng mô hình toán học với tập hợp phép toán nó Có thể nói kiểu liệu trừu tƣợng kiểu liệu định nghĩa mức khái niệm (conceptual), nó chƣa đƣợc cài đặt cụ thể bằng ngôn ngữ lập trình Khi cài đặt kiểu liệu trừu tƣợng ngôn ngữ lập trình cụ thể, phải thực hai nhiệm vụ: Biểu diễn kiểu liệu trừu tƣợng bằng cấu trúc liệu hoặc kiểu liệu trừu tƣợng khác đƣợc cài đặt Viết chƣơng trình thực phép toán kiểu liệu trừu tƣợng mà ta thƣờng gọi cài đặt phép toán Bài tập: Tìm hiểu kiểu liệu sở C Tìm hiểu cấu trúc liệu mảng, cấu trúc C thực số tập nhƣ nhập, xuất Thuvientailieu.net.vn  Có tính chất ngẫu nhiên  Đảm bảo khoá ít xảy xung đột Gọi H tập hữu hạn hàm băm ánh xạ tập khoá U thành giá trị nằm khoảng {0, 1, …, m - 1} H gọi phổ quát nếu :  Mỗi cặp khoá riêng biệt x, y  U số hàm băm h  H cho kết h(x) = h(y) |H| / m  Nói cách khác với hàm băm ngẫu nhiên từ H khả xung đột x y ( xy ) xác 1/m( m kích thƣớc bảng băm cho trƣớc ) Tập H đƣợc xây dựng nhƣ sau :  Chọn kích thƣớc bảng m số nguyên tố  Phân tích khoá x thành r + byte để x có dạng x = {x1, x2, , xr}  Giá trị lớn của chuỗi sau phân tích < m  Gọi  = {1, 2,…, r} biểu thị cho chuỗi r + phần tử đƣợc chọn khoảng {0, 1,…, m - 1}  Hàm băm h  H tƣơng ứng đƣợc định nghĩa nhƣ sau : r h(x) = a x i 0 i i mod m Theo định nghĩa H có mr+1 phần tử 4.3.Xung đột cách xử lý xung đột 4.3.1 Định nghĩa : Xung đột phép băm đƣợc hiểu trạng thái hai khoá khác đƣợc băm thành giá trị địa Tổng quát ta có: k1  k2 ta nói k1 k2 hai khoá xung đột khi: HF(k1) = HF(k2) 4.3.2.Hệ số tải (Load Factor - ) : Giả sử có bảng băm có kích thƣớc m với n mục liệu Khi đó tỷ số  = n/m đƣợc gọi hệ số tải Hệ số tải cho biết trạng thái lấp đầy của bảng Ví dụ bảng băm có hệ số tải 0.25 thì có nghĩa bảng băm sử dụng 25% kích thƣớc bảng để lƣu liệu Hệ số tải quyết định xác suất xảy tƣơng tranh của khoá Do đó cần phải chọn hệ số tải thích hợp để giảm thiểu xung đột Giá trị của hệ số tải thƣờng đƣợc sử dụng nhỏ hoặc bằng 30% 4.3.3.Một số phƣơng pháp xử lý xung đột : Có hai cách tiếp cận chủ yếu để giải quyết xung đột : sử dụng bảng băm địa mở cấu trúc lại bảng băm 61 Thuvientailieu.net.vn Để giải quyết xung đột thông qua bảng băm địa mở ngƣời ta có phƣơng pháp : dò tuyến tính, dò bậc hai, băm kép băm lại Đối với cách tiếp cận thay đổi cấu trúc bảng ngƣời ta có phƣơng pháp : Móc nối trực tiếp, sử dụng Bucket Ngoài đối với trƣờng hợp liệu có kích thƣớc lớn ngƣời ta có thể sử dụng phƣơng pháp băm khác nhƣ : băm lại, băm mở rộng Dƣới chi tiết phƣơng pháp 3.3.1.Băm theo địa mở (Open-adressing hashing) : Băm theo địa mở giải quyết xung đột bằng cách lƣu tất mục liệu chính bảng băm Phƣơng pháp thích hợp có thể ƣớc lƣợng đƣợc số mục vào Khi đó có thể có đủ vị trí để lƣu tất mục bảng (kể vị trí sử dụng để ngăn cách) giảm đƣợc không gian lƣu trữ nhiều so với phƣơng pháp móc nối Ngƣời ta định nghĩa hàm băm chung cho phƣơng pháp băm theo địa mở Nhƣ hàm băm lúc gồm có tham số : khoá k số lần dò tìm p , đó  p  m-1 Tham số p sử dụng để giới hạn số lần dò cho phép biết thuật toán dừng Sau xét số phƣơng pháp băm theo địa mở cụ thể 3.3.1.1.Phương pháp dò tuyến tính : Dò tuyến tính mô hình địa mở đơn giản Phƣơng pháp gồm thao tác: tìm kiếm, chèn thêm mục liệu Hàm băm sử dụng cho phƣơng pháp có dạng : h(k,p) = ( h(k) + p )mod m  Thao tác tìm kiếm : Khi xung đột xảy phƣơng pháp đơn giản dò vị trí trống bảng Để tìm mục liệu trƣớc hết ta phải thực băm khoá của mục liệu để tìm số của nó bảng Nếu mục liệu không có vị trí của số mà thu đƣợc thì bắt đầu thực dò theo tuyến vị trí Có khả có thể xảy : Vị trí tiếp theo có chứa mục liệu tìm kiếm kết thúc thành công Vị trí tiếp theo trống, liệu không tìm thấy, trình tìm kiếm kết thúc không thành công Vị trí tiếp theo bị chiếm giữ nhƣng khoá lại không phù hợp vì thế vị trí tiếp theo đó đƣợc dò Số vị trí cần dò phƣơng pháp phụ thuộc vào yếu tố : + Hàm băm đƣợc chọn nhƣ thế + Bảng sử dụng không gian để lƣu liệu 62 Thuvientailieu.net.vn Nếu chọn đƣợc hàm băm thích hợp bảng sử dụng khoảng 30% - 50% thì đảm bảo đƣợc số vị trí cần dò nhỏ có thể Chúng ta có ví dụ cách cài đặt thao tác tìm kiếm đó : int jsw_find ( void *key, int len ) { unsigned h = hash ( key, len ) % N; void *save = table[h]; while ( table[h] != NULL ) { if ( compare ( key, table[h] ) == ) return 1; h = ( h + ) % N; if ( compare ( table[h], save ) == ) return 0; } return 0; }  Thao tác chèn : Để chèn thêm mục mới cần thực :  Tính giá trị băm cho khoá thông qua hàm băm chọn  Nếu vị trí có giá trị băm có liệu thì thao tác dò đƣợc thực từ vị trí Thao tác dò đƣợc thực cho đến tìm đƣợc vị trí trống Thao tác dò tiếp vị trí đầu nếu nó đạt đến vị trí cuối của tuyến  Khi tìm đƣợc ô trống thì mục liệu đƣợc chèn vào Thao tác có thể cài đặt nhƣ sau : void jsw_insert ( void *key, int len ) { unsigned h = hash ( key, len ) % N; while ( table[h] != NULL ) h = ( h + ) % N; table[h] = key; }  Thao tác xoá : Thao tác không đơn giản nhƣ hai thao tác Việc xoá trực tiếp mục khỏi bảng khôn thể vì phép dò tiếp theo đó có thể nhận khoá bị bỏ nếu bucket rỗng đƣợc tạo buket khác đầy thì trính tìm kiếm có thể không 63 Thuvientailieu.net.vn chính xác Nhƣ thao tác xoá có thể phá vỡ cấu trúc liệu của bảng Giải pháp đƣa xoá khoá đoạn của bucket thì ta lại chèn khoá vào đoạn tƣơng tự của nó Nhƣng cách dƣờng nhƣ phức tạp Sau ví dụ thao tác xoá : void jsw_remove ( void *key, int len ) { unsigned h = hash ( key, len ) % N; while ( table[h] != NULL ) h = ( h + ) % N; table[h] = DELETED; }  Đánh giá : Trong phƣơng pháp khoá có khuynh hƣớng bị đƣa vào đoạn gọi Cluster ( bó cụm ) Điều có nghĩa nhiều phần bảng có thể đầy lên nhanh chóng phần khác còn trống Do phƣơng pháp cần sử dụng lƣợng lớn Bucket rỗng nằm xen kẽ với Bucket sử dụng nên việc bó cụm làm cho nhiều Bucket bị duyệt qua trƣớc tìm đƣợc Bucket rỗng Vì thao tác tìm kiếm bị chậm kéo theo thao tác chèn xoá chậm Một bảng băm có hệ số tải lớn thì khả bó cụm xảy lớn Do đó hàm băm tốt kích thƣớc bảng số nguyên tố cải thiện đƣợc vấn đề 3.3.1.2.Phương pháp dò bậc : Để khắc phục vấn đề bó cụm chính ngƣời ta đƣa phƣơng pháp dò bậc hai Phƣơng pháp sử dụng hàm băm có dạng : h(k,p) = ( h(k) + c1p + c2p2 ) mod m Các giá trị c1, c2, m xác định liệu toàn bảng có đƣợc sử dụng hay không  Thao tác tìm kiếm : Theo hàm băm nhƣ để tìm kiếm mục bảng ngƣời ta vị trí bảng đƣợc xác định hàm băm, gọi vị trí i tiếp tục dò tới vị trí i + 12, i + 22 , …, i + ( m - )2 ( tất mod m ) Cứ nhƣ trình tìm kiếm đƣợc thực cho đến tìm thấy mục liệu bảng ( kết thúc thành công ) hoặc gặp vị trí trống ( kết thúc không thành công ) Thuật toán sử dụng cho phƣơng pháp có phần phức tạp phƣơng pháp dò tuyến tính Dƣới ví dụ cụ thể : int jsw_search ( void *key, int len ) { 64 Thuvientailieu.net.vn unsigned h = hash ( key, len ) % N; unsigned step; for ( step = 1; table[h] != NULL; ++step ) { if ( compare ( key, table[h] ) == ) return 1; h = ( h + step * step ) % N; } return 0; }  Thao tác chèn : void jsw_insert ( void *key, int len ) { unsigned h = hash ( key, len ) % N; unsigned step; for ( step = 1; table[h] != NULL; ++step ) h = ( h + step * step ) % N; table[h] = key; }  Thao tác xoá : void jsw_remove ( void *key, int len ) { unsigned h = hash ( key, len ) % N; unsigned step; for ( step = 1; table[h] != NULL; ++step ) h = ( h + step * step ) % N; table[h] = DELETED; }  Đánh giá : Phƣơng pháp dò theo bậc hai giảm đáng kể tƣợng bó cụm chính Tuy nhiên vì chuỗi dò tìm bắt đầu bucket ( ô của bảng) nên lại gặp phải tƣợng bó cụm thứ cấp ( Secondary Clustering ) Đây tƣợng đáng quan tâm nhƣ bó cụm chính Nhƣng phƣơng pháp dò bậc hai hoạt động hệ số tải < 0.5 kích thƣớc của bảng số nguyên tố nên tƣợng lại làm chậm đáng kể tốc độ tìm kiếm 65 Thuvientailieu.net.vn Nói chung phƣơng pháp nhanh tránh đƣợc tƣợng bó cụm chính nhƣng lại ít đƣợc sử dụng thực tế vì giới hạn thời gian Phƣơng pháp đảm bảo hoạt động hiệu kích thƣớc bảng số nguyên tố dung lƣợng bảng sử dụng chƣa nửa 3.3.1.3.Phương pháp băm kép : Phƣơng pháp giải pháp đáng lƣu ý thay cho phƣơng pháp dò theo bậc hai Nó có thể khắc phục đƣợc tƣợng bó cụm chính mà không chịu giới hạn Phƣơng pháp sử dụng hai hàm băm độc lập Hàm băm thứ đƣợc sử dụng nhƣ bình thƣờng ( theo hai phƣơng pháp kể ) Hàm băm thứ hai đƣợc sử dụng để tạo kích thƣớc bƣớc dò Do thân khoá có thể xác định đƣợc bƣớc dò nên tránh đƣợc tƣợng bó cụm chính Phƣơng pháp có thuật toán đơn giản nhƣng có điều cần ý để đảm bảo phƣơng pháp hoạt động chính xác :  Hàm băm thứ hai không đƣợc trả giá trị để tránh tƣợng lặp vô hạn  Giống nhƣ dò theo tuyến, kích thƣớc bảng phải số nguyên tố hoặc giá trị luỹ thừa của với kết hàm băm thứ hai trả số lẻ Nhƣ cách cài đặt cho phƣơng pháp tƣơng tự nhƣ phƣơng pháp băm theo địa mở khác Một ví dụ minh hoạ cụ thể :  Thao tác tìm kiếm : int jsw_search ( void *key, int len ) { unsigned h = hash ( key, len ) % N; unsigned h2 = hash2 ( key ) % ( N - ) + 1; while ( table[h] != NULL ) { if ( compare ( key, table[h] ) == ) return 1; h = ( h + h2 ) % N; } return 0; }  Thao tác chèn : void jsw_insert ( void *key, int len ) { unsigned h = hash ( key, len ) % N; unsigned h2 = hash2 ( key ) % ( N - ) + 1; while ( table[h] != NULL ) 66 Thuvientailieu.net.vn h = ( h + h2 ) % N; table[h] = key; }  Thao tác xoá : void jsw_remove ( void *key, int len ) { unsigned h = hash ( key, len ) % N; unsigned h2 = hash2 ( key ) % ( N - ) + 1; for ( table[h] != NULL ) h = ( h + h2) % N; table[h] = DELETED; } 3.3.2.Cấu trúc lại bảng băm : Phƣơng pháp giải quyết xung đột bằng cách thay đổi cấu trúc của bảng băm Theo đó vị trí có thể chứa đƣợc nhiều mục liệu Sau số phƣơng pháp cấu trúc lại bảng băm 3.3.2.1.Sử dụng Bucket : Trong phƣơng pháp thân phần tử bảng băm mảng đƣợc gọi ngăn chứa( Bucket ) Các khoá đƣợc băm vị trí đƣợc đặt cột tƣơng ứng với vị trí Ví dụ : K K 2 k3 k5 k5 k7 k8 k4 10 k9 Bảng 2.2 : Mô hình Bucket Giả sử có hai khoá k1, k2 hai khoá xung đột Kết sau băm hai khoá Vậy ta xếp k1 k2 vào cột tƣơng ứng với vị trí thứ Tƣơng tự nhƣ nếu kết băm khoá khác cho vị trí thì khoá lần lƣợt đƣợc xếp vào cột Nhƣ có thể thấy phƣơng pháp cần nhiều không gian lƣu trữ thực tế liệu yêu cầu Trong phƣơng pháp này, để tìm khoá định ngƣời ta phải kiểm tra tất cột liên quan tới vị trí của khoá ( ít cho đến tìm đƣợc vị trí trống 67 Thuvientailieu.net.vn ) Nếu khoá có thứ tự, nên lƣu khoá theo trật tự tăng dần Nhƣ có thể loại bớt cột cần kiểm tra Độ phức tạp trung bình của thao tác tìm kiếm phụ thuộc vào số vị trí Bucket đƣợc điền Do đó bảng chƣa đƣợc điền đầy đó khả xung đột có thể xảy 3.3.2.2.Phương pháp móc nối trực tiếp : Theo phƣơng pháp bảng băm mảng danh sách liên kết Phƣơng pháp đặt khoá bị xung đột vào danh sách liên kết vị trí kết sau băm Một bảng băm theo phƣơng pháp có thể mô tả nhƣ sau : Hình 2.3 : Bảng băm theo phương pháp móc nối Vấn đề đặt danh sách liên kết đƣợc cấu trúc nhƣ thế Khi việc tìm kiếm của bảng băm phụ thuộc vào việc tìm kiếm danh sách liên kết thì danh sách đƣợc xếp cấu trúc đáng lƣu ý Cấu trúc có hiệu ít với thao tác chèn thao tác tìm kiếm thành công hoặc không thành công ( tính trung bình ) Khi đó nửa số danh sách liên kết đƣợc tìm kiếm Nếu danh sách không đƣợc xếp thì lần tìm kiếm không thành công có thể duyệt qua toàn danh sách liên kết Tuy nhiên điều nói mặt lý thuyết Trên thực tế còn có nhiều thao tác cần thiết Vì với hàm băm tốt chuỗi ( danh sách liên kết ) phải đảm bảo đủ ngắn để thấy đƣợc khác danh sách đƣợc xếp danh sách chƣa đƣợc xếp Chúng ta giả sử rằng hầu hết thời gian thực phƣơng pháp sử dụng để thực so sánh khoá tìm kiếm với khoá khác danh sách Chúng ta giả sử thời gian cần thiết để băm tới danh sách thích hợp xác định đến vị trí cuối của danh sách tƣơng đƣơng với so sánh Nhƣ tất thao tác cần + Số so sánh (lần) Giả sử bảng băm có kích thƣớc m có n mục đƣợc chèn vào bảng Khi đó danh sách trung bình chứa n/m mục Ở ta có thể thấy số mục trung bình danh sách chính hệ số tải  = n/m Sau số thao tác chính của phƣơng pháp  Thao tác tìm kiếm : Khi tìm khoá bảng, khoá đƣợc băm trả kết số nơi có danh sách liên kết đƣợc tìm kiếm Nhƣ hàm băm quyết định phải tìm danh sách 68 Thuvientailieu.net.vn Khi tìm kiếm thành công thuật toán thực băm tìm tới danh sách thích hợp Tính trung bình thì nửa số mục đƣợc kiểm tra trƣớc mục chính xác đƣợc tìm thấy Do đó thời gian tìm kiếm : + /2 Trong trƣờng hợp tìm kiếm không thành công, nếu danh sách không có trật tự thì tất mục đƣợc kiểm tra thời gian tìm kiếm : +  Sau cài đặt của thao tác : struct jsw_node { void *key; struct jsw_node *next; }; struct jsw_node *table[N]; int jsw_find ( void *key, int len ) { unsigned h = hash ( key, len ) % N; if ( table[h] != NULL ) { struct jsw_node *it = table[h]; while ( it != NULL ) { if ( compare ( key, it->key ) == ) return 1; it = it->next; } } return 0; }  Thao tác chèn : Chèn vào danh sách liên kết đơn giản tìm kiếm Khi cần chèn thêm mục liệu vào bảng thì khoá đƣợc băm cho kết vị trí của danh sách cần chèn Một nút đƣợc thêm vào danh sách ( tạo phần header của nút nếu cần thiết ) sau đó khoá giá trị đƣợc đẩy vào phần trƣớc của nút Việc chèn nút vào cuối danh sách liên kết đơn giản Nếu nút đƣợc chèn vào phía đầu của danh sách liên kết thì danh sách liên kết đƣợc sử dụng nhƣ ngăn xếp với tính chất truy cập Trên thực tế chèn nút vào trƣớc danh sách cách đơn giản đạt hiệu tốt nhất.Ví dụ cài thao tác : int jsw_insert ( void *key, int len ) 69 Thuvientailieu.net.vn { unsigned h = hash ( key, len ) % N; struct jsw_node *it = malloc ( sizeof *it ); if ( it == NULL ) return 0; it->key = key; it->next = table[h]; table[h] = it; return 1; }  Thao tác xoá : Khi xoá mục liệu thì cần thực thao tác tìm khoá cũ int jsw_remove ( void *key, int len ) { unsigned h = hash ( key, len ) % N; struct jsw_node *save; if ( table[h] == NULL ) return 0; if ( compare ( key, table[h]->key ) == ) { save = table[h]->next; table[h]->next = table[h]->next; free ( save ); } else { struct jsw_node *it = table[h]; while ( it->next != NULL ) { if ( compare ( key, it->next->key ) == ) break; it = it->next; } if ( it->next == NULL ) return 0; save = it->next; it->next = it->next->next; 70 Thuvientailieu.net.vn free ( save ); } return 1; }  Đánh giá : Phƣơng pháp móc nối trực tiếp phƣơng pháp xử lý xung đột phổ biến vì nó linh hoạt Nội dung của phƣơng pháp đơn giản nó có số ƣu điểm sau :  Giới hạn kích thƣớc bảng không cứng nhắc  Việc thực thi tránh tối đa tƣợng xung đột  Bảng dễ dàng xử lý khoá trùng lặp  Thao tác xoá đơn giản có thể thực thƣờng xuyên Tuy nhiên việc cài đặt phƣơng pháp phức tạp phƣơng pháp khác Nó có số nhƣợc điểm :  Phải xây dựng lại bảng việc thay đổi kích thƣớc gặp khó khăn  Sử dụng nhiều không gian nhớ cho liên kết  Tốc độ xử lý có thể chậm tham chiếu qua lại của liên kết 3.3.3.Các phương pháp băm khác :  Băm lại : Chúng ta thấy rằng tất phƣơng pháp hiệu hệ số tải < 2/3, tức bảng không đầy Khi bảng băm bị lấp đầy phƣơng pháp không còn hiệu Giải pháp đƣa tạo bảng mới có kích thƣớc lớn gấp đôi bảng ban đầu Sau đó tất khoá đƣợc băm lại Độ phức tạp của phƣơng pháp O(n) đó phƣơng pháp sử dụng kích thƣớc liệu lớn Cá biệt phƣơng pháp dò theo bậc hai phải băm lại ½ bảng đƣợc sử dụng  Băm mở rộng : Đây phƣơng pháp hỗ trợ hữu hiệu cho việc sử dụng có hiệu không gian lƣu trữ 4.3.4 Đánh giá : Khi xây dựng bảng băm nếu biết trƣớc số mục liệu đƣợc chèn vào bảng thì mô hình băm theo địa mở với hệ số tải < ½ cho kết tốt Mặt khác nếu không biết trƣớc có mục liệu đƣợc chèn vào bảng thì phƣơng pháp móc nối trực tiếp có hiệu 71 Thuvientailieu.net.vn Khi hệ số tải tăng sử dụng phƣơng pháp băm theo địa mở gặp bất lợi chủ yếu thực thi Nhƣng đối với phƣơng pháp móc nối hiệu của nó bị giảm tuyến tính hệ số tải tăng Do đó nếu không chắn hệ số tải thì phƣơng pháp đƣợc lựa chọn phƣơng pháp móc nối 4.4.4.Kết luận : Bảng băm cấu trúc liệu thích hợp cho việc lƣu trữ tìm kiếm liệu không có trật tự Tuy phải xử lý xung đột nhƣng hầu hết thao tác của bảng băm dễ thực thao tác có hiệu gần nhƣ không đổi hầu hết trƣờng hợp Hàm băm ánh xạ khoá liệu vào ô có sẵn của bảng Một bảng băm có hiệu chọn đƣợc hàm băm tốt Vấn đề cốt yếu :  Sử dụng bảng băm có kích thƣớc số nguyên tố  Sử dụng hàm băm có thể đảm bảo khoá đƣợc phân bố bảng.Tuy nhiên trƣờng hợp chọn đƣợc hàm băm tốt thì tƣợng xung đột có thể xảy Băm theo địa mở phƣơng pháp giải quyết xung đột Trong đó :  Phƣơng pháp dò tuyến tính : sử dụng nếu ô đƣợc duyệt toàn tìm vị trí thành công Nhƣng phƣơng pháp có thể gây tƣợng bó cụm  Phƣơng pháp dò bậc : Phƣơng pháp tốt có thể giảm xác suất xảy tƣợng bó cụm  Hệ số tải nên < ½ để tránh làm giảm hiệu thực của phƣơng pháp Móc nối biện pháp xử lý xung đột hiệu Xong phƣơng pháp đòi hỏi không gian lƣu trữ lớn 4.5 Bài tập áp dụng Tạo bảng băm chứa số nguyên theo loại giải quyết xung đột Tạo bảng băm chứa họ tên sinh viên theo loại giải quyết xung đột Tạo từ điển đơn giản Một số đề thi tham khảo Đề Câu 1: Cho biểu thức (a+b-c)*(d-e*f)-(x+y)/z Hãy vẽ nhị phân tƣơng ứng suy dạng tiền tố dạng hậu tố của biểu thức đó Câu 2: a) Khai báo cấ u trúc dƣ̃ liê ̣u danh sách liên kế t đơn chƣ́a các thông tin về nhân sƣ̣ gồ m có trƣờng thông tin:  Họ tên  Thâm niên công tác (tính theo năm)  Hê ̣ số lƣơng  Lƣơng bản b) Viế t hàm thêm mô ̣t bản ghi chƣ́a thông tin nhân sƣ̣ của mô ̣t ngƣời vào cuố i danh sách đã khai báo ở phầ n a 72 Thuvientailieu.net.vn c) Viế t hàm tiń h xem có nhân viên phải đóng thuế thu nhâ ̣p biế t r ằng lƣơng của ngƣời tháng đƣợc tính bằng công thức : ̣ số lƣơng * lƣơng bản + thâm niên * 200 (ngàn đồng) ngƣời đóng thuế thu nhập ngƣời có thu nhập năm lớn 1000000000 Đề Câu 1: a) Chèn khóa sau lầ n lƣơ ̣t vào mô ̣t tim ̀ kiế m nhi ̣phân rỗng : 20, 5, 17, 30, 24, 7, 18, 23, 9, 32, 25 Xóa khỏi nút chứa khóa sau: 24, 10, b) Khai báo cấ u trúc nhi ̣phân chƣ́a các thông tin nhƣ ở phầ n a của câu viết hàm duyê ̣t theo thƣ́ tƣ̣ trƣớc Chuyể n biể u thƣ́c trung tố sau thành biể u thƣ́c : x*y + z*(t-u) Trong đó z, y, z, t, u là các biế n (toán hạng) Câu 2: Khai báo danh sách liên kế t đơn chƣ́a các trƣờng thông tin về mô ̣t khách hàng nhƣ sau:  Mã khách hàng,  Họ tên khách hàng,  Số điê ̣n thoa ̣i của khách hàng (13 chƣ̃ số ) a) Viế t hàm có input là danh sách đã đƣơ ̣c khai báo ở phầ n a và mô ̣t xâu sdt là mô ̣t phầ n số điê ̣n thoa ̣i trƣờng điê ̣n thoa ̣i của mô ̣t khác h hàng nào đó Viế t hàm trả về nút đầ u tiên danh sách liên kế t có phầ n đầ u trƣờng số điê ̣n thoa ̣i trùng với xâu sdt b) Viế t hàm sắ p xế p danh sách khách hàng theo chiề u tăng dầ n của tên khách hàng Đề Câu 1: a) Hãy chèn khóa sau vào tìm kiếm nhị phân rỗng mà nút chứa số nguyên: 17, 4, 19, 27, 7, 18, 8, 30, 15 Xóa khỏi lần lƣợt nút chứa khóa : 19, 8, 17 b) Chuyể n biể u thƣ́c trung tố sau thành biể u thƣ́c tiề n tố : 12 – 7*(3+9 – 2*5) c) Hãy khai báo cấu trúc tìm kiếm nhị phân chứa trƣờng thông tin sinh viên nhƣ sau:  Mã sinh viên,  Họ tên,  Điể m trung biǹ h đó mã sinh viên là trƣờng khóa Viế t hàm chèn thêm mô ̣t sinh viên vào vừa khai báo Câu 2: a) Khai báo danh sách liên kế t đơn chƣ́a các số thƣ̣c b) Viế t hàm đảo ngƣơ ̣c danh sách liên kế t đơn chƣ́a các số thƣ̣c đƣơ ̣c khai báo ở phầ n a c) Viế t hàm sắ p xế p danh sách số thƣ̣c theo chiề u tăng dầ n Đề 4: Câu 1: a) Hãy chèn khóa sau vào tìm kiếm nhị phân rỗng mà nút chứa số nguyên: 20, 17, 29, 15, 80, 6, 19, 51, 32 Xóa khỏi lần lƣợt nút chứa khóa : 29, 20, 17 b) Chuyể n biể u thƣ́c trung tố sau thà nh biể u thƣ́c hâ ̣u tố : * ( + ) – * ( 15 - 10 ) + 21 c) Hãy khai báo cấu trúc tìm kiếm nhị phân chứa trƣờng thông tin nhân nhƣ sau:  Họ tên  Mã nhân viên 73 Thuvientailieu.net.vn  Lƣơng đó mã nhân viên là trƣờng khóa Viế t hàm tính trung bình cộng lƣơng của nhân viên vừa khai báo Câu 2: a) Khai báo danh sách liên kế t đơn chƣ́a các trƣờng thông tin về hàng hóa nhƣ sau:  Tên mă ̣t hàng  Giá mặt hàng  Số lƣơ ̣ng còn kho b) Hãy cài đặt hàm sắ p xế p danh sách theo chiề u tăng dầ n của giá mă ̣t hàng , nế u giá thì theo tên c) Viế t hàm nhâ ̣n input là mô ̣t danh sách đƣơ ̣c khai báo nhƣ và hai số nguyên dƣơng x < y, in tên các mă ̣t hàng có số lƣơ ̣ng còn kho lớ n x và nhỏ y Đề 5: Câu 1: a) Khai báo danh sách liên kế t đơn chƣ́a các trƣờng thông tin về phầ n mề m nhƣ sau:  Tên phầ n mề m  Dung lƣơ ̣ng (tính bằng Mb)  Điạ chỉ download b) Hãy cài đặt hàm thêm phần tử vào cuối danh sách c) Viế t hàm tiń h dung lƣơ ̣ng trung biǹ h của các phầ n mề m danh sách liên kế t Câu 2: a) Hãy chèn khóa sau vào tìm kiếm nhị phân rỗng mà nút chứa số nguyên: 19, 7, 1, 9, 25, 21, 70, 30, Xóa khỏi nút gốc Đƣa kế t quả duyê ̣t theo thƣ́ tƣ̣ trƣớc và thƣ́ tƣ̣ sau b) Chuyể n biể u thƣ́c hâ ̣u tố sau thành biể u thƣ́c tiề n tố và tiń h giá tri ̣của nó : 11 * + * + / + c) Hãy khai báo cấu trúc tìm kiếm nhị phân chƣ́a các trƣờng thông tin về nhân sƣ̣ nhƣ sau:  Họ tên  Mã nhân viên  Lƣơng đó mã nhân viên là trƣờng khóa Viế t hàm tim ̀ nút chƣ́a thông tin về nhân viên có lƣơng thấ p nhấ t 74 Thuvientailieu.net.vn TÀI LIỆU THAM KHẢO Đinh Mạnh Tƣờng, Cấu trúc liệu thuật toán, NXB Đại học Quốc gia Hà nội, 2002 Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, NXB Khoa học Kỹ thuật, 1997 Nguyễn Quốc Lƣợng, Hoàng Đức Hải ,Cấu trúc liệu + giải thuật = chƣơng trình, NXB Giáo dục, 1996 Hoare, C.A.R, Note on date Structuring in structured Programming Dahl, Dijkstra, and Hoare, pp 83-174 Robert Sedgewick , Cẩm thuật toán, NXB KH Kỹ thuật, 2000 75 Thuvientailieu.net.vn [...]... danh sách liên kế t chƣ́a các đỉnh liền kề của một đỉnh của đồ thị 2.3.6 Cài đặt stack và queue bằ ng con trỏ Về bản chấ t , các cấu trúc dữ liệu stack và queue là các cấu trúc danh sách liên kết hạn chế , các thao tác đƣợc giới hạn so với cấu trúc danh sách liên kết Vì thế có thể coi một stack hay queue là mô ̣t danh sách liên kế t, và có thể lợi dụng cài đặt bằng con trỏ... cây tim ̀ kiế m nhi ̣phân là : nó cung cấ p thuâ ̣t toán sắ p xế p và tim ̀ kiế m dƣ̣a trên kiể u duyê ̣t thƣ́ tƣ̣ giƣ̃a (in-order) mô ̣t cách rấ t hiê ̣u quả, và là cấu trúc dữ liệu cơ bản cho các cấu trúc dữ liệu cao cấp hơn (trƣ̀u tƣơ ̣ng hơn) nhƣ tâ ̣p hơ ̣p (set), các mảng liên kế t 31 Thuvientailieu.net.vn ... toán 2.2 Hàng đợi - Queue 2.2.1 Khái niệm Hàng đợi là một tập hợp các phần tử cùng kiểu đƣợc tổ chức một cách tuần tự (tuyế n tính) trong đó phầ n tƣ̉ đƣơ ̣c thêm vào đầ u tiên sẽ là phầ n tƣ̉ đƣơ ̣c loa ̣i bỏ đầ u tiên khỏi hàng đơ ̣i Các hàng đợi thƣờng đƣợc gọi là các cấu trúc FIFO (First In First Out) Các ví dụ thực tế về hàng đợi mà chúng ta có thể thấy trong cuộc sống hàng ngày... Ứng dụng của hàng đợi Trong các hê ̣ điề u hành:    Hàng đợi các công việc hoặc các tiến trình đang đợi để đƣợc thực hiện Hàng đợi các tiến trình chờ các tín hiệu từ các thiết bị IO Các file đƣơ ̣c gƣ̉i tới máy in Mô phỏng các hê ̣ thố ng hàng đơ ̣i thời trong thƣ̣c tế     Các khách hàng trong các cửa hàng tạp hóa, trong các hê ̣ thố ng ngân hàng Các đơn đặt hàng của... vào vi ̣trí ở cuố i hàng đơị pop(): loại bỏ phần tử ở đầu hàng đợi front(): trả về giá trị phần tử ở đầu hàng đợi back(): trả về giá trị phần tử ở cuối hàng đợi size(): trả về số phần tử đang ở trong hàng đợi empty(): kiể m tra hàng đơ ̣i có rỗng hay không full(): kiể m tra hàng đơ ̣i đầ y (chỉ cần khi cài đặt hàng đợi bằng mảng) Ví dụ: Thao tác Khởi ta ̣o push(7) push(8)... Các cuộc gọi điện thoại hoă ̣c các đă ̣t hàng vé máy bay , các đặt hàng của khách hàng … Các ứng dụng khác: Thƣ́ tƣ̣ topo: với mô ̣t tâ ̣p các sƣ̣ kiê ̣n, và các cặp (a, b) trong đó sƣ̣ kiê ̣n a có đô ̣ ƣu tiên cao hơn so với sƣ̣ kiê ̣n b (bài toán lập lịch), duyệt đồ thị theo chiều rộng (Breadth First Search) Bài tập: Hãy viết chƣơng trình chuyển đổi một biểu thức dạng infix (dạng... cây T1, , Tk đƣợc gọi là các cây con Tập rỗng cũng đƣợc coi là một cây và gọi là cây rỗng kí hiệu Ví dụ: Xét mục lục của một quyển sách Mục lục này có thể xem là một cây Xét cấu trúc thƣ mục trong tin học, cấu trúc này Sách cũng đƣợc xem nhƣ một cây C1 1.1 C2 1.2 2.1 2.1.1 C3 2.2 3.2 2.1.2 Hình III.1 - Cây mục lục một quyển sách Nếu n1, , nk là một chƣỗi các nút trên cây sao cho ni là nút... cụ thể cài đặt một danh sách liên kết bằng mảng nhƣ thế nào nhƣng cũng không quá khó để hình dung cách thức hoạt động của các danh sách kiểu nhƣ thế Kết luận: Danh sách liên kết là các cấu trúc dữ liệu rất giống với các mảng Các thao tác chính thƣờng đƣợc sử dụng đối với một danh sách liên kết là thêm, xóa và tìm kiếm trên danh sách Thao tác chèn và xóa có thể thực hiện với thời gian... của mô ̣t ngƣời … 12 Thuvientailieu.net.vn Cũng có thể định nghĩa hàng đợi là một danh sách tuyến tính các phần tử giống nhau với mô ̣t số thao tác ha ̣n chế tới các phầ n tƣ̉ trên danh sách đó 2.2.2 Các thao tác cơ bản của một hàng đơ ̣i Tƣơng tƣ̣ nhƣ cấ u trúc ngăn xế p , chúng ta định nghĩa các thao tác trên hàng đợi tuân theo cài đă ̣t chuẩ n của hàng đơ ̣i trong thƣ viê...CHƢƠNG 2 CÁC KIỂU DỮ LIỆU TRỪU TƢỢNG CƠ BẢN 2 1 Ngăn xế p - Stack 2.1.1 Khái niệm Khái niệm: Ngăn xế p (stack) là một tập hợp các phần tử (items) cùng kiểu đƣợc tổ chƣ́c mô ̣t cách tuầ n tƣ̣ (chính vì thế một số tài liệu còn định nghĩa ngăn xếp là một danh sách tuyế n tiń h các phầ n tƣ̉ với các thao tác

Ngày đăng: 15/08/2016, 05:44

Xem thêm: BÀI GIẢNG cấu TRÚC dữ LIỆU đh HÀNG hải

TỪ KHÓA LIÊN QUAN