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

Chương 11: Cây đa phân pdf

25 1,7K 13

Đ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 25
Dung lượng 386 KB

Nội dung

 Mỗi node gồm có nhiều nhánh con Mỗi node có 2 liên kết first_child và next_sibling  Dùng cây nhị phân... Giải thuật tìm kiếm trên TrieAlgorithm trie_search Input: target là khóa cần

Trang 1

CẤU TRÚC DỮ LIỆU VÀ

GIẢI THUẬTChương 11: Cây đa phân

Trang 2

 Mỗi node gồm có nhiều nhánh con

 Mỗi node có 2 liên kết first_child và next_sibling

 Dùng cây nhị phân

Trang 3

Biểu diễn

Trang 4

Biểu diễn dạng nhị phân

Nhị phân:

left = black right = color

Trang 5

Cây từ điển: Trie

Trang 6

Thiết kế Trie

class Trie {

public: // Add method prototypes here.

private: // data members

Trie_node *root;

};

const int num chars = 28;

struct Trie_node { // data members

Trang 7

Giải thuật tìm kiếm trên Trie

Algorithm trie_search

Input: target là khóa cần tìm

Output: mẫu tin tìm thấy

1 Bắt đầu tìm từ node root với ký tự đầu tiên của target

2 while (còn node để tìm và chưa xét hết chuỗi target)

2.1 Nhảy đến node con tương ứng tùy theo ký tự từ target

2.2 Xét ký tự kế tiếp trong chuỗi target

3 if (có node và dữ liệu của nó khác rỗng)

3.1 return dữ liệu của node này

4 return not_present

End trie_search

Trang 8

Mã C++ tìm kiếm trên Trie

Error_code Trie :: trie_search(const Key &target, Record &x) const {

int position = 0;

char next_char;

Trie_node *location = root;

while (location != NULL &&

(next_char = target.key_letter(position)) !=‘ ’) { location = location->branch[alphabetic order(next char)];

Trang 9

Giải thuật thêm vào Trie

Algorithm trie_insert

Input: new_entry là dữ liệu cần thêm vào

Output: cây sau khi thêm vào dữ liệu mới

1 if (cây rỗng)

1.1 Thêm node mới vào đây

1.2 Kết thúc

2 Bắt đầu từ node root và ký tự đầu tiên trong khóa của new_entry

3 while (vẫn chưa xét hết chuỗi của khóa của new_entry)

3.1 next_char là ký tự hiện tại trên khóa

3.2 if (node con tại vị trí next_char không có)

//Tìm và thêm các node trung gian không có dữ liệu vào

3.2.1 Thêm một node có dữ liệu rỗng vào đây

3.3 Nhảy đến node con tương ứng với vị trí của next_char

3.4 Xét ký tự kế tiếp của khóa

4 Thêm dữ liệu vào node hiện tại

End trie_insert

Trang 10

Mã C++ thêm vào Trie

Error_code Trie :: insert(const Record &new_entry) {

Error_code result = success;

if (root == NULL) root = new Trie_node;

int position = 0;

char next_char;

Trie_node *location = root;

while ((next char = new entry.key letter(position)) != ‘ ’) {

int next_position = alphabetic_order(next_char);

if (location->branch[next_position] == NULL)

location->branch[next_position] = new Trie_node;

location = location->branch[next_position];

position++; }

if (location->data != NULL) result = duplicate_error;

else location->data = new Record(new_entry);

return result;

Trang 11

Đánh giá trie

 Tìm kiếm: Lần so sánh = chiều dài khóa

 Từ điển tiếng Anh 100.000 từ, chiều dài tối đa 15 ký tự:

 Trie: Số lần so sánh tối đa = 15

 Tìm nhị phân = k*lg (100.000) = 17k (k: chiều dài trung bình của từ tiếng Anh)

Trang 12

Cây đa phân tìm kiếm

Cây đa phân tìm kiếm

bậc m: mỗi node có tối đa

m nhánh con

Trang 13

Cây đa phân cân bằng (B-tree)

Một B-tree bậc m là một cây đa phân tìm kiếm bậc m:

 1 Tất cả các node lá ở cùng một mức.

2 Tất cả các node trung gian trừ node gốc có tối đa m

nhánh con và tối thiểu m/2 nhánh con (khác rỗng).

 3 Số khóa của mỗi node trung gian ít hơn một so với số

nhánh con và phân chia các khóa trong các nhánh con theo cách của cây tìm kiếm.

4 Node gốc có tối đa m nhánh con, tối thiểu là 2 nhánh con khi node gốc không là node lá hoặc không có nhánh con khi

cây chỉ có node gốc.

Trang 14

Ví dụ B-tree

B-tree bậc 4

Trang 15

Thiết kế B-tree

template <class Record, int order>

class B_tree {

public: // Add public methods.

private: // data members

B_node<Record, order> *root;

// Add private auxiliary functions here.

};

template <class Record, int order>

struct B_node { // data members:

Trang 16

Giải thuật tìm kiếm trên B-tree

Algorithm search_B_tree

Input: subroot là gốc của cây và target là khóa cần tìm

Output: dữ liệu tìm thấy

//Tìm không thấy sẽ ngừng tại vị trí có khóa vừa lớn hơn khóa cần

//tìm, ở đó có liên kết đến nhánh con gồm các khóa nhỏ hơn nó.

2.3.1 Nhảy đến nhánh con của vị trí không tìm thấy

2.3.1 Call search_B_tree với nhánh con mới

Trang 17

Mã C++ tìm kiếm trên B-tree

template <class Record, int order>

Error_code B_tree<Record, order> :: recursive_search_tree

(B_node<Record, order> *current, Record &target) { Error_code result = not_present;

Trang 18

Thêm vào B-tree

Trang 19

Thêm vào B-tree (tt.)

Trang 20

Thêm vào B-tree (tt.)

Trang 21

Thêm vào B-tree (tt.)

Trang 22

Xóa giá trị trên B-tree

Trang 23

Xóa giá trị trên B-tree (tt.)

Trang 24

Xóa giá trị trên B-tree (tt.)

Trang 25

Xóa giá trị trên B-tree (tt.)

Ngày đăng: 22/03/2014, 18:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w