Tải bản đầy đủ (.pdf) (110 trang)

Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm

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 (2.03 MB, 110 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-----------------------

NGUYỄN THỊ THANH VÂN

CÁC CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
HIỆU QUẢ CHO BÀI TOÁN TÌM KIẾM
Chuyên ngành: CÔNG NGHỆ THÔNG TIN
Mã đề tài: CNTTVINH13B-10

LUẬN VĂN THẠC SĨ KỸ THUẬT
CÔNG NGHỆ THÔNG TIN

NGƢỜI HƢỚNG DẪN KHOA HỌC:
TS. NGUYỄN THỊ THANH HUYỀN

Hà Nội – Năm 2015


LỜI CAM ĐOAN
Luận văn thạc sỹ này do em nghiên cứu và thực hiện dƣới sự hƣớng dẫn của
Cô giáo TS. Nguyễn Thị Thanh Huyền. Với mục đích học tập, nghiên cứu để nâng
cao kiến thức và trình độ chuyên môn nên em đã làm luận văn này một cách nghiêm
túc và hoàn toàn trung thực.
Để hoàn thành bản luận văn này, ngoài các tài liệu tham khảo đã liệt kê, em
cam đoan không sao chép toàn văn các công trình hoặc thiết kế tốt nghiệp của ngƣời
khác.
Hà nội, tháng 7 năm 2015
Học viên


Nguyễn Thị Thanh Vân


LỜI CẢM ƠN

Đầu tiên, em xin gửi lời cảm ơn đến thầy, cô giáo Viện Công nghệ Thông tin
và Truyền thông đã tận tình dạy dỗ, dìu dắt chúng em trong suốt quá trình học tập
tại Viện.
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc tới cô giáo Tiến sĩ Nguyễn Thị
Thanh Huyền, Viện Toán ứng dụng và Tin học, Trƣờng Đại học Bách khoa Hà Nội
đã tận tình hƣớng dẫn, đƣa ra những góp ý, chỉnh sửa vô cùng quý báu cho em
trong quá trình làm luận văn này.
Cuối cùng, xin chân thành cảm ơn gia đình, bạn bè đã giúp đỡ, chia sẻ với
em trong quá trình học tập và nghiên cứu làm luận văn.


DANH MỤC CÁC HÌNH VẼ

Hình 1.1 Kết quả thực hiện chƣơng trình với ví dụ 1.1………………….………..5
Hình 1.2 Kết quả thực hiện chƣơng trình với ví dụ 1.2………………….………..9
Hình 1.3 Kết quả thực hiện chƣơng trình với ví dụ 1.2………………….………10
Hình 1.4. Thứ tự ƣu tiên hàng và cột cho bảng chữ nhật. ……………….………11
Hình 1.5. Mảng truy xuất cho bảng chữ nhật. ………………………….….….....13
Hình 1.6. Các bảng tam giác với nhiều dạng khác nhau ………………..….……14
Hình 1.7. Hiện thực liên tục của bảng tam giác. ……………………….……......15
Hình 1.8. Mảng truy xuất cho bảng lồi lõm. ………………………………….....16
Hình 1.9. Mảng truy xuất cho nhiều khóa bảng chuyển đổi. ……………………18
Hình 1.10. Mô tả hàm băm...…………………….………………………………19
Hình 1.11. Hàm băm dạng bảng tra đƣợc tổ chức dƣới dạng danh sách kề...........21
Hình 1.12. Kết quả thực hiện chƣơng trình chèn khóa k vào bảng ………….…..30

Hình 1.13. Kết quả thực hiện chƣơng trình trƣờng hợp không tìm thấy khóa k
trong bảng ……………………………………………………………32
Hình 1.14. Kết quả thực hiện chƣơng trình trƣờng hợp không tìm thấy khóa k
trong bảng ……………………………………………………..…… .33
Hình 2.1. Cây nhị phân đầy đủ. …………………….……………………………36
Hình 2.2. Cây nhị phân không đầy đủ. ……………………………………..........36
Hình 2.3. Các cây nhị phân suy biến ……………………………………..……...37
Hình 2.4. Đánh số các nút của cây nhị phân đầy đủ biểu diễn bằng mảng..….….38
Hình 2.5. Biểu diễn cây nhị phân bằng cấu trúc liên kết. ……………………….40
Hình 2.6. Cây nhị phân tìm kiếm. …………………….………………………....43
Hình 2.7. Kết quả thực hiện chƣơng trình tìm kiếm trên cây nhị phân……….....46
Hình 2.8. Sau khi thêm nút 6 vào cây nhị phân tìm kiếm. ……….…………......48


Hình 2.9. Kết quả thực hiện chƣơng trình chèn thêm nút trên cây nhị phân…....50
Hình 2.10. Sau khi xóa nút 9 trên cây nhị phân tìm kiếm. …………………..…..51
Hình 2.11. Xóa nút có một nút con. …………………….………………….…....52
Hình 2.12. Xóa nút có hai con. …………………….……………………….…...52
Hình 2.13. Kết quả thực hiện chƣơng trình xóa nút lá trên cây nhị phân.…….....57
Hình 2.14. Kết quả thực hiện chƣơng trình xóa nút có một cây con trên cây
nhị phân ………………………………………………………......….58
Hình 2.15. Kết quả thực hiện chƣơng trình xóa nút có hai cây con trái và phải
trên cây nhị phân ……………………………………………………...58
Hình 2.16. Cây nhị phân cân bằng AVL……………………………………..…..59
Hình 3.1 Cấu trúc kiểu thứ bậc. …………………….………………………..….64
Hình 3.2. Kiến trúc Lucene. …………………….…………………….……..…..69
Hình 3.3. Kiến trúc file Index. …………………….………………………….....70
Hình 3.4. Chỉ mục đảo ngƣợc. ….………………….………………………..…..72
Hình 4.1. Ý nghĩa của mảng next. …………………….….………………….….76
Hình 4.2. Ý nghĩa của mảng next tại vị trí m+1. ………….……………….……76

Hình 4.3. Kết quả thực hiện thuật toán KMP_trƣờng hợp tìm thấy chuỗi……….81
Hình 4.4. Kết quả thực hiện thuật toán KMPtrƣờng hợp không tìm thấy chuỗi…82
Hình 4.5. Giao diện sử dụng của phần mềm. ………………..…………………..92
Hình 4.6. Kết quả tìm kiếm có giá trị là “Anh” ………………..………………..98
Hình 4.7. Kết quả tìm kiếm có giá trị là “Vân” ………………..………………..99
Hình 4.8. Kết quả tìm kiếm theo số điện thoại……………………………........100


MỤC LỤC

MỞ ĐẦU .....................................................................................................................1
CHƢƠNG 1. TỔNG QUAN VỀ CÁC GIẢI THUẬT TÌM KIẾM CƠ BẢN ...........3
1.1.Tìm kiếm tuyến tính........................................................................................... 3
1.2. Tìm kiếm nhị phân ............................................................................................ 5
1.3. Tìm kiếm thông tin trên bảng ......................................................................... 10
1.3.1. Bảng chữ nhật ...........................................................................................11
1.3.2. Các bảng tam giác ....................................................................................14
1.3.3. Các bảng lồi lõm.......................................................................................16
1.3.4. Các bảng chuyển đổi ................................................................................17
1.4 . Tìm kiếm theo phƣơng pháp băm .................................................................. 18
1.4.1. Bảng băm ..................................................................................................19
1.4.2. Hàm băm ..................................................................................................20
1.4.3. Bảng băm mở ...........................................................................................23
1.4.4. Bảng băm đóng .........................................................................................25
1.5. Phƣơng pháp địa chỉ mở ................................................................................. 27
1.6.Tìm kiếm xâu ................................................................................................... 34
CHƢƠNG 2. CÂY NHỊ PHÂN TÌM KIẾM ............................................................36
2.1 Cây nhị phân .................................................................................................... 36
2.1.1 Khái niệm cây ............................................................................................36
2.1.2 Khái niệm cây nhị phân .............................................................................36

2.1.3 Biểu diễn cây nhị phân ..............................................................................38
2.2 Cấu trúc dữ liệu cây nhị phân tìm kiếm ........................................................... 43
2.2.1 Khái niệm cây nhị phân tìm kiếm ............................................................43
2.2.2. Các thao tác trên cây nhị phân tìm kiếm ..................................................43
2.3 Cây nhị phân cân bằng AVL ........................................................................... 59
2.3.1 Khái niệm cây cân bằng ............................................................................59
2.3.2 Cấu trúc dữ liệu biểu diễn cây nhị phân cân bằng ....................................60


2.3.3 Các thao tác trên cây nhị phân cân bằng ...................................................60
2.4. Cây nhị phân tìm kiếm tối ƣu ......................................................................... 61
CHƢƠNG 3. TÌM KIẾM INDEX TRONG CƠ SỞ DỮ LIỆU ................................63
3.1 Khái niệm index ............................................................................................... 63
3.2 Index trong SQL Server ................................................................................... 63
3.2.1 Giới thiệu ...................................................................................................63
3.2.2 Các kiểu index ...........................................................................................65
3.2.3.Phƣơng pháp thiết kế index .......................................................................67
3.2.4 Truy vấn với cấu trúc index.......................................................................68
3.3 Index Lucene.................................................................................................... 69
3.3.1 Giới thiệu về Lucene .................................................................................69
3.3.2

Kiến trúc Lucene ...................................................................................69

3.3.3

Kiến trúc File Index ..............................................................................70

3.3.4 Chỉ mục đảo ngƣợc ...................................................................................72
CHƢƠNG 4. TÌM KIẾM XÂU MẪU ......................................................................73

4.1 Bài toán đối sánh mẫu trong vấn đề tìm kiếm ................................................. 73
4.1.1. Giới thiệu tổng quan về bài toán đối sánh mẫu trong vấn đề tìm kiếm ...73
4.1.2. Bài toán đối sánh mẫu ..............................................................................74
4.1.3 So đơn mẫu ................................................................................................75
4.2 Thuật toán đối sánh mẫu KMP (Knuth Morris Pratt) ...................................... 75
4.3 Thuật toán đối sánh mẫu BM (Boyer-Moore) ................................................. 82
4.4 Thuật toán KMP mờ ........................................................................................ 85
4.4.1 Khái niệm tập mờ ......................................................................................85
4.4.2 Tiếp cận mờ cho bài toán tìm kiếm ...........................................................87
4.4.3 Mô hình Otomat mờ so mẫu......................................................................87
4.4.4 Thuật toán KMP mờ ..................................................................................89
4.5 Ứng dụng thuật toán tìm kiếm xâu .................................................................. 92
4.5.1. Cài đặt ứng dụng ......................................................................................93
4.5.2. Kết quả tìm kiếm ......................................................................................98


KẾT LUẬN .............................................................................................................101
TÀI LIỆU THAM KHẢO .......................................................................................102


MỞ ĐẦU
1. Lý do chọn đề tài
Máy tính ngày nay đã đƣợc sử dụng trong hầu hết tất cả các lĩnh vực và đã
góp phần quan trọng vào việc thúc đẩy sự phát triển kinh tế, xã hội, khoa học kỹ
thuật, … Máy tính ra đời nhằm phục vụ cho những mục đích nhất định của con
ngƣời. Từ thu thập thông tin đến xử lý thông tin, đặc biệt giúp con ngƣời trong việc
tìm kiếm thông tin với khối lƣợng lớn, độ chính xác cao trong thời gian nhanh nhất.
Ngày nay, kích thƣớc của các hệ thống thông tin ngày càng lớn, trong khi
nhu cầu tìm kiếm của ngƣời dùng đòi hỏi ngày càng cao và phức tạp. Ngƣời dùng
luôn mong muốn nhận đƣợc kết quả trả về trong thời gian nhanh, đáp ứng linh hoạt,

đa dạng các yêu cầu tìm kiếm. Vậy nghiên cứu và ứng dụng Các cấu trúc dữ liệu
và giải thuật hiệu quả cho bài toán tìm kiếm là rất cần thiết.
2. Mục đích nghiên cứu
-

Nghiên cứu cấu trúc dữ liệu lƣu trữ hiệu quả cho việc tìm kiếm.

-

Tìm hiểu các bài toán về tìm kiếm, nghiên cứu, cài đặt một số thuật toán tìm
kiếm.

3. Phạm vi nghiên cứu
Luận văn tập trung nghiên cứu các kỹ thuật cơ bản cho bài toán tìm kiếm,
cấu trúc biểu diễn, các thao tác trên cây nhị phân tìm kiếm, tìm kiếm theo phƣơng
pháp băm, kỹ thuật index trong cơ sở dữ liệu, tìm kiếm xâu.
Nội dung luận văn gồm có phần mở đầu, 4 chƣơng, phần kết luận, tài liệu
tham khảo và phụ lục.
Chƣơng 1. Tổng quan về các giải thuật tìm kiếm cơ bản. Chƣơng này trình
bày: Tìm kiếm tuyến tính, Tìm kiếm nhị phân, Tìm kiếm thông tin trên bảng, Tìm
kiếm theo phƣơng pháp băm, Phƣơng pháp địa chỉ mở, Tìm kiếm xâu.
Chƣơng 2. Cây nhị phân tìm kiếm. Chƣơng này trình bày: khái niệm về cây,
cây nhị phân tìm kiếm, cấu trúc dữ liệu biểu diễn cây nhị phân tìm kiếm, các thao
1


tác trên cây nhị phân tìm kiếm, khái niệm cây cân bằng AVL, cấu trúc dữ liệu biểu
diễn cây nhị phân cân bằng, các thao tác trên cây nhị phân cân bằng và cây nhị phân
tìm kiếm tối ƣu.
Chƣơng 3. Tìm kiếm index trong cơ sở dữ liệu. Chƣơng này trình bày: về

khái niệm index, phƣơng pháp thiết kế index và truy vấn với cấu trúc index. Giới
thiệu về Index Lucene, kiến trúc Lucene, kiến trúc File Index và chỉ mục đảo
ngƣợc.
Chƣơng 4. Tìm kiếm xâu mẫu. Chƣơng này trình bày: về tổng quan vấn đề
tìm kiếm, bài toán đối sánh mẫu trong vấn đề tìm kiếm - so đơn mẫu, một số thuật
toán đối sánh mẫu điển hình: KMP (Knuth Morris Pratt), BM (Boyer-Moore), khái
niệm tập mờ, tiếp cận mờ cho bài toán tìm kiếm, mô hình Otomat mờ so mẫu và
thuật toán KMP mờ. Luận văn cài đặt thuật toán KMP thử nghiệm xây dựng một
ứng dụng tìm kiếm trên danh bạ điện thoại.

2


CHƢƠNG 1. TỔNG QUAN VỀ CÁC GIẢI THUẬT TÌM KIẾM CƠ BẢN

1.1.Tìm kiếm tuyến tính
Tìm kiếm tuyến tính([2], [3], [4], [9]) hay tìm kiếm tuần tự là phƣơng pháp tìm
kiếm một phần tử cho trƣớc trong một danh sách bằng cách duyệt lần lƣợt từng
phần tử của danh sách đó cho đến lúc tìm thấy giá trị mong muốn hoặc đã duyệt qua
toàn bộ danh sách mà chƣa thấy giá trị mong muốn.
Bài toán Cho mảng a gồm n phần tử khác nhau: a1, a2, a3, ..., an và một phần tử X,
ta cần tìm vị trí i (1 ≤ i ≤ n) sao cho ai = X hoặc trả lại giá trị -1 nếu không có
phần tử nhƣ vậy trong mảng đã cho.
Ý tưởng thuật toán
Thuật toán tiến hành so sánh phần tử đã cho trƣớc với các phần tử thứ nhất,
thứ hai, … của mảng cho đến khi thấy phần tử cần tìm hoặc đã tìm hết mảng mà
không thấy phần tử.
Thuật toán 1.1
Bƣớc 1: i := 1; { Bắt đầu phần tử đầu tiên của dãy}
Bƣớc 2: So sánh a[i] với x:

+ Nếu a[i] = x: Tìm thấy. Dừng - trả về giá trị i.
+ Ngƣợc lại a[i] ≠ x: chuyển sang bƣớc 3.
Bƣớc 3: i := i+1; {xét phần tử kế tiếp trong mảng}
Nếu i > N: Hết mảng, không tìm thấy. Dừng - trả về giá trị -1.
Ngƣợc lại: Lặp lại Bƣớc 2.

Ví dụ 1.1 Cho dãy số a : 10, 6, 2, 14, 9, 15. Tìm x = 9
10

6

2

14

3

9

15


Với i = 1 thì a[i] = 10 ≠ x = 9
Với i = 2 thì a[i] = 6 ≠ x = 9
Với i = 3 thì a[i] = 2 ≠ x = 9
Với i = 4 thì a[i] = 14 ≠ x = 9
Với i = 5 thì a[i] = 9 = x.
Tìm thấy x = 9 tại vị trí i = 5. Dừng thuật toán.

Độ phức tạp của thuật toán

Giải thuật tìm kiếm tuyến tính có độ phức tạp tính toán cấp n: T(n) = O(n).
Cài đặt thuật toán
int TimkiemTT(int x, int n, int a[])
{
int i = 0;
while ((i< n) & !(x == a[i]))
{
i += 1;
}
if (i < n)
{
return i;
}
else
{
return -1;
}
}

4


Kết quả thử nghiệm

Hình 1.1 Kết quả thực hiện chương trình với ví dụ 1.1

1.2. Tìm kiếm nhị phân
Tìm kiếm nhị phân([2], [3], [4], [9]) là một phƣơng pháp tìm kiếm khá thông dụng,
dùng để tìm kiếm phần tử trong một danh sách đã đƣợc sắp xếp. Ví dụ nhƣ trong
một danh bạ điện thoại sắp xếp theo tên, có thể tìm kiếm số điện thoại của một

ngƣời theo tên ngƣời đó, tìm một học sinh trong danh sách lớp học hoặc tìm kiếm
một từ trong từ điển, ...
Bài toán Cho mảng a gồm n phần tử khác nhau đã đƣợc sắp xếp theo thứ tự tăng:
a1, a2, a3, …, an và một phần tử X, ta cần tìm vị trí i (1 ≤ i ≤ n) sao cho ai = X
hoặc trả lại giá trị -1 nếu không có phần tử nhƣ vậy trong mảng đã cho.

5


Ý tưởng thuật toán
Trong mỗi bƣớc, so sánh phần tử cần tìm với phần tử nằm ở chính giữa danh
sách. Nếu hai phần tử bằng nhau thì phép tìm kiếm thành công và thuật toán kết
thúc. Nếu chúng không bằng nhau thì tùy vào phần tử nào lớn hơn, thuật toán lặp lại
bƣớc so sánh trên với nửa đầu hoặc nửa sau của danh sách. Số lƣợng phần tử trong
danh sách cần xem xét sẽ giảm đi một nửa sau mỗi bƣớc.
Giả sử, dãy khóa đang xét là a1, a2, …, ar thì khóa ở giữa dãy sẽ là ai với
i= [

]. Tìm kiếm sẽ kết thúc nếu X = ai. Nếu X < ai tìm kiếm sẽ đƣợc thực hiện

tiếp với a1, a2, …, ai-1; còn nếu X > ai tìm kiếm lại đƣợc làm với ai+1, …, ar. Tiếp tục
sử dụng kỹ thuật tìm kiếm tƣơng tự trên dãy sau. Quá trình tìm kiếm đƣợc tiếp tục
cho đến khi tìm thấy khóa mong muốn hoặc không còn dãy khóa để xét.

Thuật toán 1.2
Bƣớc 1: Nhập N, các số hạng a1, a2, ...an và khóa X
Bƣớc 2: left := 1; right := N;

{ tìm kiếm trên tất cả các phần tử}


Bƣớc 3: mid := (left+right)/2;

{lấy mốc so sánh}

{ So sánh a[mid] với x:}
+ Nếu a[mid] = X:

Tìm thấy. Dừng lại.

+ Nếu a[mid] > X: { tìm tiếp x trong dãy con a[left]...a[mid-1]:}
right := mid-1;
+ Nếu a[mid] < X: {tìm tiếp x trong dãy a[mid+1]...a[right]:}
left := mid+1;
Bƣớc 4: Nếu left <= right

{còn phần tử chƣa xét=>tìm tiếp}

Lặp lại Bƣớc 3
Ngƣợc lại: Dừng;

{ không còn dãy phần tử để xét }

6


Ví dụ 1.2
-

Trường hợp tìm thấy khóa: Giả sử với n = 10, x = 21
A


2

4

5

6

9

21

22

30

31

33

I

1

2

3

4


5

6

7

8

9

10

Left

1

6

6

Right

10

10

7

mid


5

8

6

a[mid]

9

30

21

Lần duyệt

1

2

3

Ở ví dụ trên thì lần duyệt thứ ba a[mid] = x. Vậy chỉ số i cần tìm là i = mid = 6

-

Trường hợp không tìm thấy khóa: Giả sử với n = 10, x = 25
A


2

4

5

6

9

21

22

30

31

33

I

1

2

3

4


5

6

7

8

9

10

Left

1

6

6

7

8

Right

10

10


7

7

7

mid

5

8

6

7

a[mid]

9

30

21

22

2

3


4

Lần duyệt 1

5

Ở ví dụ trên thì lần duyệt thứ năm left > right nên kết luận trong dãy a không
có số hạng nào có giá trị là 25 cả.

7


Cài đặt thuật toán
int TimkiemNP(int x, int n, int a[])
{

int left, right, mid;
Bool Found;
left = 1;
right = n;
Found = false;
while ((left <= right) & !Found)
{
mid = (int)(left+right)/2;
if(x == a[mid])
{
Found = true;
}
else
{


if (x > a[mid])
{
left = mid + 1;
}
else
{
right = mid - 1;
}

}
}
if (Found)
8


{
return mid;
}
else
{
return -1;
}
}

Độ phức tạp của thuật toán
Giải thuật tìm kiếm nhị phân có độ phức tạp tính toán cấp log2n: T(n) = O(log2n).
Kết quả thử nghiệm
- Trường hợp tìm thấy khóa


Hình 1.2 Kết quả thực hiện chương trình với ví dụ 1.2

9


- Trường hợp không tìm thấy khóa

Hình 1.3 Kết quả thực hiện chương trình với ví dụ 1.2

1.3. Tìm kiếm thông tin trên bảng
Tìm kiếm thông tin trên bảng([6]) là một phƣơng pháp tìm kiếm bắt đầu từ một
khóa và tìm một phần tử chứa khóa này. Cách thực hiện và truy xuất các bảng trong
vùng nhớ liên tục, bắt đầu từ các bảng hình chữ nhật thông thƣờng, sau đó đến các
bảng tam giác, bảng lồi lõm… Việc tra cứu bảng có thể đạt hiệu quả hơn nhiều so
với bất kỳ phƣơng pháp tìm kiếm nào do thời gian cần thiết là O(1) - có nghĩa là
thời gian có giới hạn là một hằng số và độc lập với kích thƣớc của bảng.
Các phần tử của bảng mà chúng ta xem xét đƣợc đánh chỉ số bằng một mảng
các số nguyên, tƣơng tự cách đánh chỉ số của mảng.

10


1.3.1. Bảng chữ nhật
-

Thứ tự ƣu tiên hàng và thứ tự ƣu tiên cột:

Thứ tự ƣu tiên hàng: Là đọc các phần tử ở hàng thứ nhất trƣớc, từ trái sang
phải, sau đó đến các phần tử hàng thứ hai và cứ thế tiếp tục cho đến đọc hàng cuối
cùng .

Thứ tự ƣu tiên cột: Là đọc các phần tử ở cột thứ nhất trƣớc từ trên xuống,
sau đó đến các phần tử cột thứ hai và cứ thế tiếp tục cho đến đọc cột cuối cùng.
Ví dụ 1.3 Giả sử có một bảng trừu tƣợng gồm 3 hàng, 4 cột và hàng đƣợc
đánh số là từ 1 đến 3 và cột đƣợc đánh số từ 6 đến 9 thì thứ tự của các phần tử theo
thứ tự ƣu tiên hàng nhƣ sau: (1,6) (1,7) (1,8) (1,9) (2,6) (2,7) (2,8) (2,9) (3,6)
(3,7) (3,8) (3,9); thứ tự của các phần tử theo thứ tự ƣu tiên cột nhƣ sau: (1,6) (2,6)
(3,6) (1,7) (2,7) (3,7) (1,8) (2,8) (3,8).

A

B

C

D

E

G

H

P

M

N

A


K

Thứ tự ƣu tiên hàng


A

B

C



D

E

G

H



P

M

N

A


K

P

K



Thứ tự ƣu tiên cột


A

E

M



B

G

N



C


H

A



D

Hình 1.4. Thứ tự ưu tiên hàng và cột cho bảng chữ nhật.

11




-

Đánh chỉ số cho bảng chữ nhật:

Giả sử có bảng chữ nhật gồm m hàng, n cột và thứ tự hàng đƣợc đánh số từ 0
đến m – 1, và cột từ 0 đến n – 1. Số phần tử của bảng là m*n, đó cũng là số phần tử
thực hiện liên tục trong mảng và đƣợc đánh số các phần tử trong mảng từ 0 đến
m*n-1. Phần tử (0, 0) nằm tại vị trí 0, các phần tử thuộc hàng đầu tiên trong bảng
(0, j) nằm tại vị trí j. Phần tử đầu của hàng thứ hai (1, 0) nằm ngay sau phần tử (0, n
– 1), đó là vị trí n. Tiếp theo, phần tử (1, j) nằm tại vị trí n + j. Các phần tử của hàng
kế tiếp cũng sẽ nằm sau số phần tử của hai hàng trƣớc đó (2*n phần tử). Do đó phần
tử (2, j) nằm tại vị trí 2*n + j. Tổng quát, các phần tử thuộc hàng i có n*i phần tử
phía trƣớc, nên suy ra công thức tính vị trí trong mảng nối tiếp mà một phần tử
trong bảng chữ nhật đƣợc lƣu trữ (hàm chỉ số) là: Phần tử (i, j) trong bảng chữ nhật
nằm tại vị trí n*i + j trong mảng nối tiếp.


-

Mảng truy xuất:

Tính toán cho các hàm chỉ số của các bảng chữ nhật, các trình biên dịch của
hầu hết các ngôn ngữ bậc cao sẽ dịch hàm này sang ngôn ngữ máy thành một số
bƣớc tính toán cần thiết. Vì trên các máy tính nhỏ, phép nhân thƣờng thực hiện rất
chậm nên có thể sử dụng phƣơng pháp khác để tránh phép nhân. Phƣơng pháp này
lƣu một mảng phụ chứa một phần của bảng nhân với thừa số là n:
0, n, 2*n, 3*n, … , (m-1)*n

Lƣu ý, mảng này nhỏ hơn bảng chữ nhật rất nhiều nên nó có thể đƣợc lƣu
thƣờng trực trong bộ nhớ. Các phần tử của nó chỉ phải tính một lần (và chúng có thể
đƣợc tính chỉ bằng phép cộng). Khi gặp một yêu cầu tham chiếu đến bảng chữ nhật,
trình biên dịch có thể tìm vị trí của phần tử (i, j) bằng cách lấy phần tử thứ i trong
mảng phụ cộng thêm j để đến vị trí cần có.

12


Ví dụ 1.4 Về mảng truy xuất:
Giả sử có bảng chữ nhật:

B

O

P


G

A

H

T

A

G

T

A

H

Ƣu tiên thứ tự theo hàng:
B O P

G  A H T

B O P

G A H T

A  G T

A G T


A H

Mảng truy xuất:
0
4
8

Hình 1.5. Mảng truy xuất cho bảng chữ nhật.

13

A H


1.3.2. Các bảng tam giác
Một bảng tam giác chỉ cần các địa chỉ (i, j) với i

j.

Cách biểu diễn bảng tam giác nhƣ Hình 1.6

0

xx

x

x
x


xx
x
0
x

xx

0
X
X

X

X

Hình 1.6. Các bảng tam giác với nhiều dạng khác nhau

Để xây dựng hàm chỉ số mô tả cách ánh xạ này, giả sử các hàng, cột đều
đƣợc đánh số bắt đầu từ 0. Để tìm vị trí của phần tử (i, j) trong mảng liên tục ta cần
tìm vị trí bắt đầu của hàng i, sau đó để tìm cột j ta chỉ việc cộng thêm j vào điểm bắt
đầu hàng i. Nếu các phần tử của mảng liên tục đƣợc đánh số bắt đầu từ 0 thì chỉ số
của điểm bắt đầu của hàng thứ i cũng chính là số phần tử nằm ở các hàng trên hàng
i. Vậy trên hàng thứ 0 có 0 phần tử và chỉ có một phần tử của hàng 0 là xuất hiện
trƣớc hàng 1. Đối với hàng 2, có 1 + 2 = 3 phần tử đi trƣớc và trƣờng hợp tổng quát
ta thấy số phần tử có trƣớc hàng i là: 1 + 2 + … + i =
trong bảng tam giác tƣơng ứng phần tử

i *(i+1). Vậy phần tử (i, j)


i*(i+1) + j của mảng liên tục.
14


Ví dụ 1.5 Giả sử có bảng tam giác sau:
G
A M
O N

E

T H

A

T

G O

V

E S

A G W A Y S
Ta có thể hiện thực một bảng tam giác trong một mảng liên tục bằng cách
trƣợt mỗi hàng ra sau hàng nằm ngay trên nó, đƣợc biểu diễn nhƣ Hình 1.7 dƣới
đây.
G

G

A M

A M

O N E
T H A T

O N E
T H A T

G O V E S

G O V E S
A G W A Y S

A G W A Y S

G A M O N E T H A T GOV E S A G W A Y S
0
1
3
6
10
13
Hình 1.7. Hiện thực liên tục của bảng tam giác.

15


Tƣơng tự nhƣ bảng chữ nhật, tránh mọi phép nhân và chia bằng cách tạo một

mảng truy xuất chứa các phần tử tƣơng ứng với các chỉ số của các hàng trong bảng
tam giác. Vị trí i trong mảng truy xuất là

i*(i + 1). Mảng truy xuất đƣợc tính

toán một lần khi bắt đầu chƣơng trình và đƣợc sử dụng lặp lại cho mỗi truy xuất đến
bảng tam giác.
1.3.3. Các bảng lồi lõm
Để tạo mảng truy xuất, ta phải xây dựng bảng lồi lõm theo thứ tự bắt đầu từ
hàng đầu tiên. Phần tử 0 của mảng truy xuất, là bắt đầu của mảng liên tục. Sau khi
mỗi hàng của bảng lồi lõm đƣợc xây dựng xong, chỉ số của vị trí đầu tiên chƣa sử
dụng tới của vùng nhớ liên tục chính là giá trị của phần tử kế tiếp trong mảng truy
xuất và đƣợc sử dụng để bắt đầu xây dựng hàng kế của bảng lồi lõm.
Bảng lồi lõm không có một quan hệ có thể đoán trƣớc nào giữa vị trí của một
hàng và chiều dài của nó. Ví dụ nhƣ Hình 1.8 dƣới đây.

0
4
14
14
16
23
24
29

Hình 1.8. Mảng truy xuất cho bảng lồi lõm

16



1.3.4. Các bảng chuyển đổi
Các bảng chuyển đổi là việc sử dụng nhiều mảng truy xuất để tham chiếu
cùng lúc đến một bảng các phần tử qua một vài khóa khác nhau. Với phƣơng pháp
này các thành phần dữ liệu đƣợc xem nhƣ là khóa đều đƣợc xử lý cùng một cách.
Các phần tử có thể lƣu trữ theo một thứ tự tùy ý (thứ tự mà các phần tử đƣợc nhập
từ hệ thống). Các phần tử thuộc danh sách liên kết (các phần tử của các mảng truy
xuất chứa các địa chỉ đến từng phần tử riêng).

Ví dụ 1.6
Giả sử, xét nhiệm vụ của một công ty điện thoại trong việc truy xuất đến các
phần tử về các khách hàng.
Để in danh mục điện thoại, các phần tử cần sắp xếp thứ tự tên khách hàng
theo bảng chữ cái alphabel. Để xử lý các cuộc gọi đƣờng dài, các phần tử lại cần có
thứ tự theo số điện thoại. Ngoài ra để bảo trì định kỳ, danh sách các khách hàng lại
sắp xếp theo địa chỉ. Để tránh việc lƣu nhiều lần cùng một tập các phần tử bằng
cách sử dụng các mảng truy xuất và có thể tìm các phần tử theo bất kỳ một khóa
nào. Cần tạo mảng truy xuất thứ nhất cho tên khách hàng, phần tử đầu tiên chứa vị
trí của khách hàng đứng đầu danh sách theo bảng chữ cái alphabel. Phần tử thứ hai
chứa vị trí khách hàng thứ hai và cứ thế... Trong mảng truy xuất thứ hai, phần tử
đầu tiên chứa vị trí của khách hàng có số điện thoại nhỏ nhất. Tƣơng tự, mảng truy
xuất thứ ba có các phần tử chứa vị trí của các khách hàng theo thứ tự địa chỉ của họ.
Ví dụ nhƣ Hình 1.9

17


×