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

Cấu trúc dữ liệu và giải thuật - chương 9

24 5 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

Cấu trúc

  • CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

  • Ma trận 2 chiều vs. 1 chiều

  • Bảng và chỉ mục

  • Radix sort

  • Đánh giá Radix sort

  • Radix sort trên DSLK

  • Giải thuật Radix sort trên DSLK

  • Mã C++ Radix sort trên DSLK

  • Nối các queue liên kết

  • Tăng tốc tra cứu

  • Bảng Hash

  • Hàm Hash

  • Ví dụ dùng bảng Hash

  • Phương pháp Địa chỉ mở (Open Addressing)

  • Thiết kế bảng Hash dùng địa chỉ mở

  • Giải thuật thêm phần tử dùng bảng Hash địa chỉ mở

  • Mã C++ thêm phần tử dùng bảng Hash địa chỉ mở

  • Phương pháp nối kết (chained hash table)

  • Lợi ích của phương pháp nối kết

  • Thiết kế bảng Hash nối kết

  • Thiết kế các phương thức của bảng Hash nối kết

  • Đánh giá phương pháp dùng bảng Hash

  • So sánh các phương pháp

  • So sánh các phương pháp (tt.)

Nội dung

Chương 9: Bảng của bộ slide bài giảng đầy đủ (gồm 11 chương) về môn CTDL & GT của trường ĐHBK TP.HCM. Trình bày ngắn gọn dễ hiểu với những hiệu ứng minh họa sinh động. Hướng dẫn kẻ bảng, tạo bảng trong các file trong word hay excel.

A C CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040) B F D E Chương 9: Bảng G K H Ma trận chiều vs chiều A[i, j] B[ max_row*i + j] ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin C[i + max_col*j] Chương Bảng Bảng mục ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Radix sort Bước Bước Bước r a t m o p m a p c a r m o p m a p r a p c a t c a t t o p c a r c o t m a p r a p t a r m a p c a r c a r r a t m o p t o p t a r c a t r a p c o t r a t m o p r a t t a r c a t t o p t a r r a p c o t c o t t o p ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Đánh giá Radix sort Số lần so sánh Θ(n k), n số phần tử k số ký tự khóa So sánh với phương pháp khác n lg n: Nếu k lớn n nhỏ radix sort chậm Nếu k nhỏ n lớn radix sort nhanh Bất tiện: Việc tách thành 27 danh sách ghép lại lúc sau DS liên tục gây việc di chuyển nhiều phần tử Khóa so sánh chuỗi nhị phân khơng tốt ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Radix sort DSLK ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Giải thuật Radix sort DSLK Algorithm radix_sort Input: danh sách cần thứ tự Output: danh sách thứ tự //Mỗi queue chứa phần tử có ký tự tương ứng queues dãy có max_character hàng //Lặp k bước, kiểm tra ký tự vị trí k for position = size(khóa) to 2.1 while (danh sách còn) 2.1.1 Lấy phần tử 2.1.2 Tính tốn thứ tự chữ vị trí k khóa 2.1.3 Đẩy phần tử vào queue tương ứng 2.2 Nối tất queue lại với thành danh sách End radix_sort ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Mã C++ Radix sort DSLK const int max_chars = 28; template void Sortable_list :: radix_sort( ) { Record data; Queue queues[max_chars]; for (int position = key_size − 1; position >= 0; position−−) { // Loop from the least to the most significant position while (remove(0, data) == success) { int queue_number = alphabetic_order(data.key_letter(position)); queues[queue_number].append(data); // Queue operation } rethread(queues); // Reassemble the list } } ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Nối queue liên kết Cách 1: Dùng CTDL queue Phải dùng queue.retrieve list.insert(list.size(),x) Cách 2: Viết lại CTDL kiểu queue chương trình Chỉ cần tìm đến cuối queue nối trỏ vào đầu queue sau (hoặc đến NULL) ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Tăng tốc tra cứu Tìm kiếm: hàm f: key -> position =>O (lg n) Nếu có hàm f: key -> position với tốc độ O(1) Ví dụ: Tra bảng với key position Hàm đổi key thành position: hàm Hash position key search ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin position key search Magic Chương Bảng 10 Bảng Hash Bảng Hash Bảng Vị trí phần tử tính hàm hash Hàm hash: Nhận vào khóa Trả số vị trí (Có thể chuyển vài khóa vị trí) Đụng độ bảng hash: Nếu vị trí tìm liệu cần tìm: O(1) Khơng đúng: giải đụng độ (phải đảm bảo O(1)) ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 11 Hàm Hash Đảm bảo O(1) Ví dụ: f(x) = x % m; f(‘abc’) = (char_index(‘a’)*base_number2 + char_index(‘b’)*base_number1 + char_index(‘c’)*base_number0) % hash_size ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thơng tin Chương Bảng 12 Ví dụ dùng bảng Hash T U V M D O Các khóa: M, O, T, V, I, D, U hash(x) = char_index(x) % 10 Tìm V Tìm F I Khơng có char_index: Space=0, A=1, B=2, …, Z=27 M O ĐH Bách Khoa Tp.HCM T V I D U Khoa Công nghệ Thông tin F Chương Bảng 13 Phương pháp Địa mở (Open Addressing) Bảng hash array Các vị trí có đụng độ tìm vị trí phương pháp giải quyết: Thử tuyến tính (linear probing): Tăng số lên một: h = (h+i) % hash_size Thử bậc hai (quadratic probing): Tăng số lên theo bình phương: h = (h + i2)% hash_size Phương pháp khác Ngẫu nhiên ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 14 Thiết kế bảng Hash dùng địa mở Đảm bảo phép thử tuyến tính khơng bị lặp vòng const int hash_size = 997; // a prime number of appropriate size class Hash_table { public: Hash_table( ); void clear( ); Error_code insert(const Record &new entry); Error_code retrieve(const Key &target, Record &found) const; private: Record table[hash_size]; }; ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 15 Giải thuật thêm phần tử dùng bảng Hash địa mở Algorithm Hash_Insert Input: bảng Hash, mẫu tin cần thêm vào Output: bảng Hash có mẫu tin thêm vào probe = hash(input_key) increment = while (table[probe] khơng rỗng) //Dùng đụng độ //Có đụng độ //Dùng phép thử (tuyến tính, bậc hai, …) 3.1 probe = (probe + increment) % hash_size 3.2 increment = increment + //Thử bậc hai table[probe] = new_data End Hash_insert ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 16 Mã C++ thêm phần tử dùng bảng Hash địa mở Error_code Hash_table :: insert(const Record &new entry) { Error_code result = success; int probe_count = 0, increment = 1, probe; Key null; probe = hash(new_entry); while (table[probe] != null && table[probe] != new_entry && probe_count < (hash size + 1)/2) { probe_count++; probe = (probe + increment)%hash_size; increment += 2; } if (table[probe] == null) table[probe] = new_entry; else if (table[probe] == new_entry) result = duplicate_error; else result = overflow; return result; } ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 17 Phương pháp nối kết (chained hash table) ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 18 Lợi ích phương pháp nối kết Nếu số lượng mẫu tin lớn: tiết kiệm vùng nhớ Giải đụng độ: đơn giản đẩy vào danh sách liên kết Bảng hash nhỏ nhiều so với số lượng mẫu tin Xóa phần tử đơn giản nhanh chóng Độ phức tạp tìm kiếm: Nếu có n mẫu tin, bảng hash có kích thước m Độ dài trung bình DSLK n/m ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 19 Thiết kế bảng Hash nối kết const int hash_size = 997; // a prime number of appropriate size class Hash_table { public: //Specify methods here private: List table[hash_size]; }; ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 20 Thiết kế phương thức bảng Hash nối kết Constructor: Gọi constructor danh sách array Clear: Gọi phương thức clear cho danh sách array Retrieval: sequential_search(table[hash(target)], target, position); Insertion: table[hash(new_entry)].insert(0, new_entry); Deletion: remove(const Key type &target, Record &x); Nếu tìm thấy danh sách tương ứng xóa ĐH Bách Khoa Tp.HCM Khoa Cơng nghệ Thông tin Chương Bảng 21 Đánh giá phương pháp dùng bảng Hash load factor λ = số mẫu tin/kích thước bảng hash Tìm kiếm với bảng hash nối kết: 1+(1/2)λ phép thử tìm thấy λ phép thử khơng tìm thấy Tìm với bảng hash địa mở (thử ngẫu nhiên): (1/λ)ln (1/(1-λ)) phép thử tìm thấy 1/(1-λ) phép thử khơng tìm thấy Tìm với bảng hash địa mở (thử tuyến tính): (1/2)(1 + 1/(1-λ)) phép thử tìm thấy (1/2)(1 + 1/(1-λ)2) phép thử khơng tìm thấy ĐH Bách Khoa Tp.HCM Khoa Cơng nghệ Thông tin Chương Bảng 22 So sánh phương pháp ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 23 So sánh phương pháp (tt.) ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng 24 ... Công nghệ Thông tin Chương Bảng 15 Giải thuật thêm phần tử dùng bảng Hash địa mở Algorithm Hash_Insert Input: bảng Hash, mẫu tin cần thêm vào Output: bảng Hash có mẫu tin thêm vào probe = hash(input_key)... search Magic Chương Bảng 10 Bảng Hash Bảng Hash Bảng Vị trí phần tử tính hàm hash Hàm hash: Nhận vào khóa Trả số vị trí (Có thể chuyển vài khóa vị trí) Đụng độ bảng hash: Nếu vị trí tìm liệu cần... khơng tốt ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Radix sort DSLK ĐH Bách Khoa Tp.HCM Khoa Công nghệ Thông tin Chương Bảng Giải thuật Radix sort DSLK Algorithm radix_sort Input: danh

Ngày đăng: 08/05/2021, 19:36