Tải bản đầy đủ (.ppt) (83 trang)

Cấu Trúc Dữ Liệu 2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (554.67 KB, 83 trang )

Chương 1:
Các thuật toán trên chuỗi
GV: TRẦN HỮU QUỐC THƯ
1.3 Thuật toán nén chuỗi
GV: TRẦN HỮU QUỐC THƯ
+ Trong thực tế khi biểu diễn thông tin là van bản thì
máy tính thường dùng bộ mã ASCII, Unicode, … đây
là các bộ mã mà độ dài dãy bít dành cho ký tự luôn là
cố định
+ Tối ưu hoá dãy bít biểu diễn chuỗi => cho phép các
dãy bít biểu diễn các ký tự là không bằng nhau về
chiều dài
- Làm giảm đáng kể số lượng bit biểu diễn cho
cả chuỗi
- Nhưng làm nảy sinh sự nhập
nhằng khi giải mã
1.3Thuật toán nén chuỗi
GV: TRẦN HỮU QUỐC THƯ
Ví dụ: với chuỗi: “This is a book”
Ký tự Dãy bit Ký tự Dãy bit
T 0 I 00
H 01 S 10
T H I S

0 01 00 10
0 0 10 0 10

T T S T S
0 0 10 01 0

T T S H S


Mã hoá chữ this thành 0010010
Nhập nhằng khi giải mã:
1.3 Thuật toán nén chuỗi
GV: TRẦN HỮU QUỐC THƯ
+ Khắc phục sự nhập nhằng bằng cách:
Sử dụng các bộ mã đầu ngữ trong đó dãy bit
biểu diễn cho 1 ký tự này không là phần đầu (prefix)
của bất kỳ dãy bit biểu diễn cho ký tự nào khác
* Thuật toán xây dựng mã Huffman
GV: TRẦN HỮU QUỐC THƯ
Vdụ: Xét chuỗi sau:
“ a fast runner need never be afraid of the dark”
Thống kê tần suất xuất hiện của các ký tự trong chuỗi
└┘
a b d e f h i k n o r s t u v
9 5 1 3 7 3 1 1 1 4 1 5 1 1 1 1
* Thuật toán xây dựng mã Huffman
GV: TRẦN HỮU QUỐC THƯ
a e i o u
1 2 3 2 2
o
o
u
u
3
3
i
i
a
a

e
e
6
6
4
4
10
10
Trái mã bit 0
Phải mã bit 1
0 1
0
0
0
1
1
1
K.tự
Dãy
bit
o 00
u 01
a 100
e 101
i 11
Chương 2:
Bảng băm
(Hashing Table)
GV: TRẦN HỮU QUỐC THƯ
2.1. Giới thiệu về bảng băm

GV: TRẦN HỮU QUỐC THƯ
-
Là CTDL trong đó các phần tử của nó được lưu
trữ sao cho việc tìm kiếm sẽ được thực hiện bằng
cách truy xuất trực tiếp thông qua từ khóa
Ví dụ một bảng băm đơn giản
GV: TRẦN HỮU QUỐC THƯ
Khóa k sẽ được lưu trữ tại vị trí k mod M (M
kích thước mảng)
0 1 2 3 4 5 6 7 8 9
95
Thêm phần tử x = 95 vào mảng
95 mod 10 = 5
Ví dụ một bảng băm đơn giản
GV: TRẦN HỮU QUỐC THƯ
Với các giá trị: 31, 10 , 14, 93, 82, 95,79,18,27
0 1 2 3 4 5 6 7 8 9
10 31 82 93 14 95 46 27 18 79
Vấn đề nảy sinh
GV: TRẦN HỮU QUỐC THƯ
Giả sử thêm 55 vào mảng
0 1 2 3 4 5 6 7 8 9
82 95 27
+ 55 phải lưu vào vị trí 5. Tuy nhiên vị trí này đã
có chứa 95
=> Giải quyết đụng độ
3.2. Vấn đề xung đột khi xử lý bảng băm
GV: TRẦN HỮU QUỐC THƯ
- Trong thực tế có nhiều trường hợp có nhiều
hơn 2 phần tử sẽ được “băm” vào cùng 1 vị trí

- Hiển nhiên phần tử được “băm” đầu tiên sẽ
chiếm lĩnh vị trí đó, các phần tử sau cần phải
được lưu vào các vị trí trống khác sao cho vấn đề
truy xuất và tìm kiếm phải dễ dàng
a. Làm giảm xung đột
GV: TRẦN HỮU QUỐC THƯ
-
Hàm băm cần được sao cho:
-
Xác xuất phân bố khoá là đều nhau
-
Dễ dàng tính toán thao tác
Thông thường, hàm băm sử dụng các số nguyên
tố (vì xác suất ngẫu nhiên phân bố các số nguyên
tố là đều nhất
b. Giải quyết xung đột
GV: TRẦN HỮU QUỐC THƯ
i. Sử dụng danh sách liên kết (nối kết)
GV: TRẦN HỮU QUỐC THƯ
-
Ý tưởng:”Các phần tử băm vào trùng vị trí được
nối vào DS nối kết” tại vị trí đó
0 1 2 3 4
21 18
Hàm băm:
F(k) = k mod 5
Thêm
6, 16
6
16

*Phân tích
GV: TRẦN HỮU QUỐC THƯ
PP DSLK có nhiều khuyết điểm:
- Khi có quá nhiều khoá vào cùng vị trí,
DSLK thì tại vị trí đó sẽ rất dài => Tăng chi phí
tìm kiếm
- Các ô trống còn dư nhiều => lãng phí về
thời gian tìm kiếm và không gian lưu trữ
ii. Sử dụng PP “Dò tuyến tính”
GV: TRẦN HỮU QUỐC THƯ
-
Ý tưởng:”Nếu có 1 khóa bị băm vào vị trí đã có
phần tử thì nó sẽ được chèn vào ô trống gần nhất
theo phía bên phải (hoặc trái)
0 1 2 3 4
21 18
Hàm băm:
F(k) = k mod 5
Thêm
6, 16
6 16
*Phân tích
GV: TRẦN HỮU QUỐC THƯ
- PP này dễ thực hiện
- Nếu có nhiều phần tử băm trùng nhau thì
đặc tính bảng băm bị mất đi
- Trong trường hợp xấu nhất tìm kiếm trên
bảng băm thành tìm kiếm tuyến tính trên mảng
c. Cài đặt xử lý xung đột
GV: TRẦN HỮU QUỐC THƯ

i. Danh sách liên kết
GV: TRẦN HỮU QUỐC THƯ
- Sử dụng DSLK tại mỗi vị trí lưu trữ
- Nếu xảy ra xung đột thì lưu vào cuối DS
tại vị trí trùng
A B C D E F X Y Z
1 2 3 4 5 6 24 25 26
i. Danh sách liên kết
GV: TRẦN HỮU QUỐC THƯ
A SEARCHING EXAMPLE
0 1 2 3 4 5 6 7 8 9
1
0
* * * * * * * * * * *
A
A
C
E
R
S
H
code
GV: TRẦN HỮU QUỐC THƯ
const int M = 101; //Kich thuoc bảng băm
LINKLIST HashTable[M]; //bảng băm
Khởi tạo bảng băm
GV: TRẦN HỮU QUỐC THƯ
void Init_HashTable()
{
for (int i = 0 ; i< M; ++ i)

Init_LINKLIST(HashTable[i]);
}
Thêm một khoá vào bảng băm
GV: TRẦN HỮU QUỐC THƯ
//Hàm băm
int Hash(int key)
{
return (key % M)
}
//Chèn một khoá
void Insert(int k)
{
InsertTail_LINKLIST(HashTable[k],k);
}
Xoá một khoá trong bảng băm
GV: TRẦN HỮU QUỐC THƯ
//Hàm băm
int Delete(int key)
{
return
Delete_LINKLIST(InsertTail_LINKLIST(HashTable[k],k);
}

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×