1. Trang chủ
  2. » Giáo án - Bài giảng

Cấu Trúc Dữ Liệu Và Giải Thuật Nâng Cao

102 0 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

Tiêu đề Cấu Trúc Dữ Liệu Và Giải Thuật Nâng Cao
Định dạng
Số trang 102
Dung lượng 11,49 MB

Nội dung

Trang 4 Định nghĩa cây1.Tốn học: thơng qua đồ thị định hướng Trang 6 Cây & Đồ thịđịnh hướng— Câylà một đồ thị định hướng thỏa mãn các tính chất sau— Có một đỉnh đặc biệt được gọi làgốc

Trang 1

Bài 1: Cây

Trang 3

Giới thiệu

— Ví dụ: tập hợp các thành

viên trong một dòng họ với quan hệ cha –con

— Trong ngành công nghệ

thông tin, cây là mô hình trừu tượng của một cấu trúc phâncấp

Trang 4

Định nghĩa cây

1 Toán học: thông qua đồ thị định hướng

Trang 5

— Mỗi cung là một cặp có thứ tự các đỉnh khác nhau (u,v)

— (u,v) và (v,u) là hai cung khác nhau

Trang 6

Cây & Đồ thịđịnh hướng

— Cây là một đồ thị định hướng thỏa mãn các tính chất sau

— Có một đỉnh đặc biệt được gọi làgốc cây

— Mỗi đỉnh Cbất kỳ không phải là gốc, tồn tại duy nhất một đỉnh P

có cung đi từ P đến C Đỉnh P được gọi là cha của đỉnh C, và C là

Trang 7

Các thuật ngữ (1/2)

— Trong cây nếu có đường đi từ đỉnh A tới đỉnh B

thì Ađược gọi là tổ tiên của B, hay B là con cháu

củaA

— Cácđỉnh cùng cha được xem là anh em

— Cácđỉnh không có con được gọi là lá

— Một đỉnh bất kỳ Acùng với tất cả các con cháu

của nó lập thành một cây gốc là A Cây này được gọi là cây con của cây đã cho.

— Độ cao của một đỉnh là độ dài đường đi dài nhất

từ đỉnh đó tới một lá.

— Độ cao của lá bằng0.

— Độ cao của cây là độ cao của gốc

— Độ sâu của một đỉnh là độ dài đường đi từ gốc

Trang 8

— Cây được sắp : các đỉnh concủa

mỗi đỉnhđược sắp sếp theo một thứ thứ tự xác định

A

Trang 10

— tùy theo CTDL đượcsử dụng

để cài đặt KDLTT cây

Trang 13

Bài tập: Điền vào chỗ trống trong bảng

Địachỉ Data FirstChild NextSibling

Trang 17

Duyệt theo thứ tự trước

Trang 19

Duyệt theo thứ tự trong

Trang 20

AlgorithminOrder(r)

if isInternal (r)then

inOrder (leftChild(r)) visit(r)

if isInternal (r)then

s ←leftChild(r)

while hasNextSibling(s)do

s←nextSibling(s) inOrder(s)

Trang 21

Duyệt theo thứ tự sau

— Duyệt lần lượt các cây

con T1, Tk theo thứ tự sau

Trang 22

todo.txt 1K

Trang 24

Cây nhị phân

— Cây nhị phân là cây đượcsắp

với các tính chấtsau:

— Mỗi đỉnh có nhiều nhất 2 con

— Đỉnh con của một đỉnh được gọi là con trái hoặc con phải

— Đỉnh con trái đứng trước đỉnh con phải

— Cây nhị phân được gọilà

chuẩn (proper) nếu mỗiđỉnh

có 2 con hoặc không có con nào

— tức là mỗi đỉnh trong có chính xác 2con

— cây nhị phân không có tính chất này thì gọi là không chuẩn (improper)

Trang 26

Cây quyết định

— Cây nhị phân biểu diễn quy trình ra một quyết định

— đỉnh trong: câu hỏi với câu trả lời yes/no

— lá: quyết định

— Ví dụ: quyết định chọn cửa hàng ăn

Want a fast meal?

How aboutcoffee? On expense account?

Trang 27

Tính chất của cây nhịphân chuẩn

Trang 28

KDLTT cây nhị phân BinaryTree

— KDLTT cây nhị phân BinaryTree thừa kế KDLTT câyTree

Trang 29

Cài đặt cây nhị phân

root

A

F E

T data;

Node<T>* left; Node<T>* right; };

Node<char>* root;

Trang 30

Bài tập: Vẽ cây có root = 60

Trang 31

Duyệt cây nhị phân theo thứ tự giữa

— y(v) = độ sâu củav

AlgorithminOrder(v)

if isInternal(v)

inOrder (leftChild(v)) visit(v)

if isInternal(v)

inOrder (rightChild(v))

31

Trang 33

Vấn đề

chức cấu trúc dữ liệu để thực hiện các phép toán sau một cách hiệu quả

Trang 34

Cây tìm kiếm nhịphân

— Cây tìm kiếm nhị phân là cây

nhị phân lưu khóa (hoặc cặp khóa -dữ liệu) ở các đỉnh trong của nó và thỏa mãn tính chất sau:

— Gọi u, v, w là 3 đỉnh sao chou

nằm trong cây con tráicủa v và

w nằm trong cây con phảicủa

v Tacó key(u) £ key(v) £key(w)

— Cáclá tạm thời không lưu dữ

liệu

— Duyệt cây tìm kiếm nhị phân theo thứ tự trong sẽ thăm các khóa theo thứ tự tăng dần

6

9 2

4

Trang 35

— Nếu ta tiến tới một lá thì kết

luận không thấy khóa và trả

Trang 36

w

5

Trang 37

9 2

<

>

Trang 38

— sao key(w) vào đỉnh v

— ta loại đỉnh w và con tráiz của

2

Trang 39

Phân tích độ phứctạp

— Xét tập hợp có n phần tử cài đặt

bởi cây tìm kiếm nhị phân độ caoh

— không gian sử dụnglà O(n)

— các hàm find , insert và erase thực hiện trong thời gianO(h)

— Độ cao h bằng O(n) trongtrường hợp xấu nhấtvà O(log n) trong

trường hợp tốtnhất

Trang 41

Bài 2: Bảng băm

Trang 43

KDLTT từ điển

— Là tập hợp trong đó mỗi phần

tử là một cặp(khóa, dữ liệu)

— Có thể tìm kiếm theo khóa

— Được sắp hoặc không được sắp

— Ứng dụng

— Từ vựng –nghĩa

— Tên miền – địa chỉIP

— Mã sinh viên – hồsơ SV

— Các phép toán

— find(k) trả về 1 phần tử có khóa k Nếu không thấy trả

về NULL.

— insert(k, v) thêm phần tử (k, v) và trả về con trỏ tới nó

— erase(k) loại bỏ phần tử bất

kì có khóa bằngk

— erase(p) loại bỏ phần tử trỏ bởi p

— size() trả về số lượng phần tử

— empty() kiểm tra xem từ điển rỗng haykhông

Trang 44

Phương án cài KDLTT từ điển

Trang 45

Cài KDLTT từ điển bằngmảng

— Nếu khoá của dữ liệu là số nguyên không âm và nằm trong khoảng[0 SIZE-1]

— có thể sử dụng một mảng data có cỡ SIZE

— dữ liệu có khoá k sẽ được lưu trong data[k]

— tìm kiếm, xen, loại đều thực hiện trong thời gian O(1)

— Thực tế không khả thi vì

— số phần tử dữ liệu có thể rất nhỏ so với SIZE

— khoá có thể không phải là số nguyên

— Tamuốn lợi dụng tính ưu việt của phép truy cập trực tiếp củamảng

Trang 46

Phương pháp băm

— Lưu tập dữ liệu trong mảng Tvới cỡ là SIZE

— Hàm băm: là hàm ứng với mỗi giá trị khoá k của dữ liệu với một chỉ

số i (0 <= i<= SIZE-1)

— Dữ liệu này sẽ được lưu trongT[i]

— h : K à {0,1,…,SIZE-1}

0 1

i

SIZE-1

… Hàm băm h

Tập các giá trị khoá

Trang 50

Khóa là số nguyên khôngâm

— số nguyên tố có dạng đặc biệt, chẳng hạn có dạng 4k+3

— Phương pháp nhân

Ø h(k) = ë(ak -ëakû) SIZEû

Ø Ký hiệu ëxûchỉ phầnnguyên của số thực x

Ø Thực tế thườngchọn

a = F- 1 » 0,61803399

Trang 51

Khoá là xâu kýtự

— Trước tiên, đổi các xâu ký tự thành các số nguyên, dùng bảng mãASCII

— Xâu ký tự có thể xem như một số trong hệ đếm cơ số 128

— Sau đóchuyển sang hệ đếm cơ số 10

Trang 52

Giải quyết vachạm

— Dữ liệu d1với khoá k1 đã được lưu trong T[i], h(k1)=i

Ta cần thêm dữ liệu d2 với khoák2

— nếu h(k2) = i thì dữ liệu d2 cần được đặt vào vị trí nào?

— Phương pháp tạodây chuyền (separate chaining)

— tạo ra một CTDLlưu giữ tất cả các dữ liệu có cùng vị trí i và

“gắn” CTDLnày vào vị trí đó trong bảng

Trang 53

Phương pháp định địa chỉmở

— Giả sử vị trí ứng với khoá k là i, i=h(k)

— Từ vị trí này, lần lượt xem xét các vị trí i0,i1, i2,…, im,…

— Trong đó i0= i, im là vị trí thăm dò lần thứ m.

— Dãy này được gọi là dãy thăm dò.

— Xác định dãy thăm dò

— Thăm dò tuyến tính (linear probing)

— Dãy thăm dò là i , i+1, i+2 , …

— Thăm dò bình phương (quadratic probing)

— Dãy thăm dò là i , i + 1 2 ,i + 2 2 ,… , i + m 2 ,…

— Băm kép (double hashing)

— Dãy thăm dò là h1(k) + m h2(k), với m = 0, 1,2, …

Trang 54

có data}

Trang 55

Nhận xét (1/2)

— Thăm dò tuyếntính

— Ưu điểm: cho phép xét tất cả các vị trí trong mảng

— phép insert luôn thực hiện được, trừ khi mảng đầy

— Nhược điểm:

— dữ liệu tập trung thành các đoạn

— tìm kiếm tuần tự trong từng đoạn

Trang 56

— phép insert có thể không thực hiện được

— nếu cỡ của mảng là số nguyên tố, thì thăm dò bình phương cho phép ta tìm đến một nửa số vị trí trong mảng

— Băm kép

— nếu cỡ của mảng và bước thăm dò h2(k) nguyên tố cùng nhau thì phương pháp băm kép cho phép tìm đến tất cả các vị trí trong mảng

Trang 57

Phương pháp tạo dâychuyền

Trang 58

Hiệu quả của phương phápbăm

— Tham số a

— Băm đ/c mở: mức độ đầy (load factor)

— a tăng thì khả năng va chạm tăng

— Khi thiết kế, cần đánh giá max của N để lựa chọn SIZE

— a không nên vượt quá 2/3

— Băm dây chuyền: độ dài trung bình của một dây chuyền

SIZE

N

a =

Băm đ/c mở, Thăm dò tuyến tính

Băm đ/c mở, Thăm dò bình phương

Băm dây chuyền

Thời gian

trung

bình

Tìm kiếm thành công

Trang 59

Bài 3: Hàng ưu tiên

Trang 60

Nội dung chính

1 KDLTT hàng ưu tiên

2 Các phương pháp cài đặt

Trang 61

— Các phép toán

— insert(k, o) xen vào hàng

ưu tiên đối tượng o có giá trịưu tiên k

— findMin()tìm đối tượng có giá trị ưu tiên nhỏ nhất

Thực hiện được nếu hàng không rỗng

— removeMin() loại bỏvà trả

về đối tượng có giá trị ưu tiên nhỏ nhất.Thực hiệnđược nếu hàng khôngrỗng

— findMinKey() tìm giá trị ưutiên nhỏ nhất.Thực hiệnđược nếu hàng khôngrỗng

Trang 63

Wikipedia: priority queue

Trang 64

NIST’s DADS: priority queue

Trang 65

Standard Template Library

Trang 66

Nội dung chính

2 Các phương pháp cài đặt

Trang 68

Cài đặt hàng ưu tiên bởi mảng

Mảng không

sắp

Q = {(7,D), (3,B), (9,C), (5,A)} 7,D 3,B 9,C 5,A

Trang 69

Cài đặt hàng ưu tiên bởi cây tìm kiếm

5,A

7,D

9,C 3,B

Trang 70

Cây thứ tựbộ phận (heap)

— Cây nhị phân hoàn toàn

— có tất cả các mức của câyđều không thiếu đỉnh nào, trừ mức thấp nhất được lấp đầy kể từ bên trái

— Min heap là một cây nhị phân

hoàn toàn với tính chất

— khóa của một đỉnh bất kỳ nhỏ hơn hoặc bằng khóa của các đỉnh con của nó

Trang 71

Cài đặt hàng ưu tiên bởi heap

7,D 9,C

0

2,F 5,A 3,B 9,C 7,D 8,E

Trang 72

Xen thêm vàoheap

— Phép insert của hàng ưu

tiên tương ứng với phép xen thêm một phần tử có

7 9

2

6 5

7

z

z

Trang 73

Thuật toán upheap

— Sau khi xen thêm một khóa k mới, heap có thể mất đi tính chất thứ tự bộ

phận

— Thuật toán upheap khôi phục lại tính chất này bằng cáchđảo chỗ k dọc theo

đường đi từ đỉnh mới hướng tới gốc

— Upheap dừng lại khi k tiến tới gốc hoặc một đỉnh có khóa của cha ≤ k

2

1 5

7

1

2 5

7

Trang 74

Loại một phần tử khỏi heap

— Phép removeMin của

hàng ưu tiên tươngứng với phép loại gốc của heap

7 9

đỉnh cuối

w

7

6 5

9

w

Trang 75

Thuật toán downheap

9

— Sau khi thay thế đỉnh gốc với đỉnh cuối (có khóa k), heap có thể mất

đi tính chất thứ tự bộ phận

— Thuật toán downheap khôi phục lại tính chất này bằng cách đảo chỗ

đỉnh có khóa k dọc theo đường đi từ gốc xuống

— Downheap dừng khi k tiến tới một lá hay một đỉnh có các khóa con

Trang 76

Cập nhật con trỏ tới đỉnh cuối

— Dùng trong cài đặt heap bằng cấu trúc liên kết

— Có thể tìm chỗ cho đỉnh sẽ thêm vào bằng cách đi theo hành trình

— Đi lên tới khi gặp một con trái hoặc gặp gốc

— Nếu gặp một con trái thì chuyển sang con phải

— Đi xuống tới khi gặp một lá

— Áp dụng thuật toán tương tự cho cập nhật con trỏ tới đỉnh cuối trong phép loại bỏ một đỉnh

Trang 77

Minh họa cài đặt hàng ưu tiên

Trang 78

(11,S)

Trang 79

(6,Z)

Trang 80

Đảo (2,T) và (20,B)

(18,W)

Trang 81

(20,B) (18,W)

(11,S)

Đảo (2,T) và (6,Z)

Trang 82

(20,B) (18,W)

(11,S)

Đảo (2,T) và (4,C)

Trang 83

(20,B) (18,W)

(11,S)

Trang 84

(11,S)

Trang 85

(11,S)

Trang 86

(11,S) Đảo(18,W)

và(5,A)

Trang 87

(11,S)

Đảo(18,W) và(9,F) (18,W)

Trang 89

Đỉnh cuối

Trang 90

Độ phức tạp

— Độ phức tạp khônggian

— Cài bằng cấu trúc liên kết (dùng con trỏ): O(n)

— Cài bằng cấu trúc vector (mảng): tỉ lệ với N (cỡ của mảng)

— Độ phức tạp thờigian

findMin, findMinKey O(1)

Trang 91

Tổng kết

Cây thứ tựbộ phận

Trang 92

Nội dung chính

Trang 93

Nén dữ liệu

— Giả sử cần nén một tệp dữ liệu

chứa 100 ký tự từ bảng 6 chữ cái (từ a đếnf).

§ biểu diễn mỗi chữ cái bởi3 bit (thay vì 8 bit như thường lệ)

Trang 94

— Thuật toán Huffman sử dụng

hàng ưu tiên để xây dựng mãtiền tố dưới dạng cây nhị phân

— Mã sinh ra gọilà mã Huffman

Tần suất (K) 45 13 12 16 9 5 Từmã 0 101 100 111 1101 1100

13 (b)

14 16

(d)

5 (f)

9 (e)

Trang 95

Thuật toán Huffman

— Với mỗi ký tự xuất hiện trong xâu

nguồn, ta tạo ra một đỉnh chứa ký

Trang 96

(a)

12 (c)

13 (b)

16 (d)

5 (f)

9 (e)

Trang 97

(a)

12 (c)

13 (b)

14 16

(d)

5 (f)

9 (e)

Trang 98

(a)

25

12 (c)

13 (b)

14 16

(d)

5 (f)

9 (e)

0

1

Trang 99

(a)

12 (c)

13 (b)

14 16

(d)

5 (f)

9 (e)

0

1

1 1

Trang 100

13 (b)

14 16

(d)

5 (f)

9 (e)

Trang 101

13 (b)

14 16

(d)

5 (f)

9 (e)

Trang 102

Mục tiêu bàihọc

Ngày đăng: 18/02/2024, 08:55

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

TÀI LIỆU LIÊN QUAN

w