Tải bản đầy đủ (.doc) (21 trang)

ÁP DỤNG kỹ THUẬT lập TRèNH HƯỚNG đối TƯỢNG xây DỰNG THƯ VIỆN CHO cấu TRÚC “từ điển dữ LIỆU” DICTIONARY

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 (299.32 KB, 21 trang )

Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

Báo cáo tổng hợp
Kết quả thực hiện đồ án

K THUT LP TRèNH HNG I TNG
TI :

P DNG K THUT LP TRèNH HNG I TNG
XY DNG TH VIN CHO CU TRC T IN D LIU
-DICTIONARY-

A. GII THIU V TI :

I. Tng quan - mc ớch :
Nh ta ó bit, ngy nay, vic to phn mm ó tr thnh mt cụng vic
cú phc tp rt ln, ũi hi nhiu nhõn lc v cụng sc.
Vic thit k v thc thi mt ng dng phn mm mi thng liờn quan
n s tng tỏc ca cỏc n th c vit t nhiu ngi khỏc nhau trong
nhiu t chc khỏc nhau. Phn ln nhng ngi ny khụng cú s lờn h mt
thit vi nhau. Ngoi ra, sau mt thi gian, cỏc sn phm phn mm thng
cú xu hng phi c nõng cp, khc phc li, b sung tớnh nng mi.
iu ú dn n xu hng phỏt trin cỏc phng phỏp to cỏc thit
k n gin v mt khớa nim, d hiu trong khi vn mnh gii quyt
cỏc bi toỏn khú mt cỏch hiu qu.
Mt phng phỏp c xem l y ha hn t c th cõn bng
nh vy, ú l thit k hng i tng (Object Oritented Design : OOD).
Bờn cnh ú, vic s dng li mó di dng cỏc th vin cng l mt vn
cn quan tõm, bi vỡ nú gúp phn quan trng cho vic gim thiu s mó phi
vit ra v s dng li c nhng thnh tu ca nhng ngi khỏc.


Trong phm vi ti ny, chỳng ta xem xột mt khớa cnh nh ca
vic ỏp dng cỏc k thut lp trỡnh hng i tng xõy dng th
vin cho cu trỳc T in d liu Dictionary.
Cụng c c s dng ci t cỏc thut toỏn l JAVA.iu ny
cú mt vi thun li : th nht, JAVA l ngụn ng hng i tng, do
ú nú bao cha mt cỏch ng nhiờn cỏc k thut dựng li mó ; th
hai, JAVA cú mt cỳ phỏp sỳc tớch nh C/C++ song nú trỏnh c mt
s c ch thng gõy ln ln nh : bin tr, cỏc struct, cỏc biu thc
gỏn kiu t do v.v.. ; v th ba l trong JAVA ó ci sn cỏc b qun lý
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

1


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

giao din, ca s, chut, qun lý b nh v thu gom rỏc, truyn thụng
gia cỏc nỳt mng, a lp trỡnh thụng qua cỏc phõn tuyn v.v..
Mt iu quan trng na cng phi c k n, ú l khỏc vi
C/C++, JAVA c thit k c lp nn tng, v do ú, cú th n gin
húa vic thc thi cỏc ỏn lp.
II. Nhim v phi gii quyt :
1. Trỡnh by cỏc vn lý thuyt liờn quan :
Trong phn ny, ta nờu mt cỏch c bn cỏc vn lý thuyt liờn quan
n cu trỳc d liu kiu t in - gm mt giao diờn chung cho cỏc phng
thc c dựng trong th vin DictionaryADT v cỏc thc thi c th cho
cỏc phng thc ú : tp tin nht ký, bng bm, bng tra cu v danh sỏch
b qua.

Trong phn trỡnh by chung, ta nờu lờn mt s phộp toỏn c bn v mt
s cỏc chỳ ý quan trng. Ngoi ra, ta cng tham kho n cỏc t in trong
gúi java.util v xột thờm s khỏc bit i vi t in ca chỳng ta.

2. Xõy dng mụ hỡnh kin trỳc th hin lp Dictionary :
a. Phõn tớch quỏ trỡnh phỏt trin ca cu trỳc Dictionary :
Phn ny, ta s phõn tớch c th cỏc bc phỏt trin t n gin n
phc tp ca cu trỳc, xột trờn c 2 loi cú th t v khụng cú th t.
Trong tng phn c th, ta s xem xột chi tit n cỏc tớnh cht c
trng ca cu trỳc v c lý thuyt ln thc hnh ; cựng vi vic phõn tớch quỏ
trỡnh xõy dng s k tha ca cu trỳc.
b. Xõy dng s k tha :
Lp t in s dng v tha k mt s cu trỳc khỏc nh Vector, List,
dóy, dng danh sỏch ni kt n, kộp, v 4 phớa. Bn thõn cỏc lp trong
gúi cng s dng cỏc phng thc ca nhau, ú l cỏc phng thc tỡm
kim, chốn v g b.
S kộ tha c xõy dng theo quy chun ca k thut lp trỡnh
hng i tng.
c. Mụ t bng cỏc s UML :
Phn ny ta s dng UML th hin s k tha ó núi trờn. Phn
mm c s dng l Rational Rose 2002.
S d th hin lp c gúi kốm theo cỏc th vin ó lp di dng
mt b help.

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

2



Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

3. Ci t cỏc th vin bng JAVA:
Trong phn ny, ta s xõy dng cỏc th vin thc thi giao din
DictionarryADT. t c tớnh tng quỏt cao nht, ta cho phộp lu tr
cỏc khúa ln cỏc thnh phn trong mt t din thuc bt k kiu i tng
no.
õy ta phõn bit hai kiu t in, t in khụng sp th t v t in
cú sp th t. Ta dựng mt khúa lm du nh v, trong t in cú sp th t,
vic so sỏnh hai khúa do mt sỏnh t m nhn.
Cỏc mc d liu c lu tr di 3 dng : Item, gm cỏc mc n ;
DoublyLinkedItem, gm cỏc mc cú 2 tham chiu n mc khỏc ; v
AroundLinkedItem, gm cỏc mc cú 4 tham chiu n mc khỏc.
Mó ngun chng trỡnh c kốm theo trong a CD.

4. ng dng th vin gii quyt mt ỏn :
dõy ta xem xột ỏn thc thi mt ADT t in vi mt bng bm s
dng phng phỏp mt xớch tỏch bit i phú vi va chm.
ỏn ny khụng s dng lp java,util.HashTable ó ci sn ca JAVA.

5. ỏnh giỏ cỏc tiờu thc ca phn mm xõy dng c theo
quy trỡnh ỏnh giỏ phn mm hng i tng.
1. Cỏc mc tiờu :
a. Sc mnh : by c hu ht li, lng trc c cỏc nhp liu
khụng theo chun i phú mt v phc hi.
b. Kh nng thớch ng : cú th b sung, phỏt trin v nõng cp, m bo
tớnh kh chuyn cao v tớnh c ng ln.
c. Kh nng dựng li : m bo c kh nng dựng li cho cỏc phn
mm khỏc.

2. Cỏc nguyờn tc :
a. Kh nng tru tng : ADT tc l kiu d liu tru tng. Mt ADT
ch nh ni dung thc hin mt phộp toỏn, ch khụng phi l cỏch thc hin
nú. Tc l nú din t di dng cỏc giao din. ADT c hin thc húa bi
mt lp trong JAVA.
b. Kh nng gúi riờng : gm cú vic che du cỏc vựng v phng thc
riờng ca giao din hay lp. Kh nng ny cho phộp t do trong vic thc thi
cỏc chi tit trong mt h thng.
c. Tớnh mụ-un : H thng phi m bo c vic chia thnh cỏc gúi
riờng bit, mang tớnh chuyờn mụn húa cao, m bo tớnh sỏng sa, mch lc
ca chng trỡnh v kh nng dựng li cỏc mụun ny.

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

3


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

B. NHNG VN C BN CA CU TRC DICTIONARY.

I. Nhng vn chung v ADT từ điển.
1. Giao din chung ca th vin Dictionary :
ADT từ điển hỗ trợ các phơng pháp :
size (): Trả lại số lợng các mục trong D
Input : None ; outpu t: integer;
isEmpty(): Kiểm tra, trả lại giá trị nếu rỗng
Input : None ; Output : boolean;

elements(): Trả lại các phần tử lu trong D
Input : None ; Output : Iterator of objects (elements).
findElement(k) : Nếu D chứa mục cùng khoá bằng k, thì trả lại đối tợng
của mục nh thế, nếu không trả lại phần tử đặc biệt NO_SUCH_KEY.
Input : đối tợng (key) ; output : đối tợng (elements)
findAllElements(k) : Trở lại bớc lặp của các phần tử cùng với các khoá
bằng k
Input : đối tợng (key) ; output : lặp tử (của elements)
insertItem (k, e) : Chèn mục với phần tử e và khoá k vào D.
input : object (key) and (element) ; output : None
removeElement(k) : G b khi D mục cùng khoá bằng k, trả về thành
phần của nó, nếu không trả lại phần tử đặc biệt NO_SUCH_KEY.
Input : đối tợng (key) ; output : đối tợng (elements)
removeAllElements(k) : G b khi D tất cả mục cùng khoá bằng k, trả
về lặp tử các thành phần của nó, nếu không trả lại phần tử đặc biệt
NO_SUCH_KEY.
Input : đối tợng (key) ; output : lặp tử (elements)
2. Phõn tớch :
Khi thao tác FindElement(k) và RemovElement(k) không thành công
(điều đó có nghĩa là từ điển D không có tin với từ khoá Equal to k), ta sử
dụng sự hoán đổi trong các sự trả về phần tử đặc biệt NO_SUCH_KEY.
Phần tử đợc biết đến nh là lính canh. Chúng ta sử dụng sự hoán đổi lựa chọn
của sự trở lại phần tử rỗng. Nhng nó ngăn cản ta từ việc lu trữ trong D tin mà
phần tử của nó là rỗng. Một sự lựa chọn khác, tất nhiên, có thể bỏ qua sự loại
trừ khi một số vấn đề yêu cầu 1 khoá mà không có ở trong từ điển. Điều này
có thể không có ứng dụng thịch hợp trong trờng hợp loại trừ. Tuy nhiên, khi
bình thờng hỏi về vấn đề nào đó có thể không có trong từ điển. Hơn nữa bỏ
qua và thu thập lại việc loại trừ là đặc trng chậm trễ hơn các kiểm tra lại lính
canh; kể từ đó, sử dụng các lính canh ngày càng linh hoạt hơn nữa ( và, trong
trờng hợp này, nhiều khái niệm đặc trng hơn).

Ghi nhớ rằng, nh chúng ta xác định từ điển D có thể chứa đựng các tin
với các khoá ngang nhau. Trong trờng hợp này, thao tác find element(k) và
remove element(k) trả lại phần tử tuỳ ý mà các khoá đợc kết nối của nó là
equal to k. Nếu chúng ta mong muốn lu trữ tin l trong từ điển mà tin này bản

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

4


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

thân lại là khoá của chính nó, sau đó chúng ta có thể thêm l với phơng pháp
gọi là insertitem(e,l).
Mỗi thao tác của từ điển tiêu chuẩn đa ra những yêu cầu ở trên rằng
chúng ta có 1 cơ cấu đối với sự phân chia trong bất cứ trờng hợp nào có 2
khoá cân bằng.
Nếu từ điển đợc sắp xếp thự tự thì có phơng pháp cân bằng của phép so
sánh kết nối với mục đích phục vụ từ điển. Mặt khác, đối với từ điển phổ cập,
chúng ta sẽ sử dụng đối tợng kiểm tra cân bằng mà hỗ trợ cho phép toán cân
bằng trên các khoá.
Một thao tác đợc xét nh là phạm vi của mức kiểm tra cân bằng và có thể
đợc dùng thay cho mức kiểm tra cân bằng đối với TĐTT. Khi từ điển đợc
thuyết minh, ta nối chúng với mức kiểm tra cân bằng hoặc 1 thao tác điều đó
dẫn đến kiêmt nghiệm trong bất cứ khi nào có 2 khoá cân bằng là định nghĩa
đợc xác định khả thi.
3. Từ điển trong Package java.util.
a. Kiểm nghiệm đẳng thức với java.util.Map

Khác biệt đầu tiên là trong giao diện java.util.Map đợc thấy rằng cách
thực hiện của phơng pháp cân bằng ,đợc hỗ trợ bởi bất ks đối tợng java
nào ,dẫn đến quyết định bất cứ khi nào có hai khoá cân bằng.Theo cách
đó ,nếu chúng ta dùng java.util.Map ta phải dùng phơng pháp hand code
cân bằntrong phạm vi khoá lớp .Sự xấp xỉ này không thật hữu hiệu,tuy nhiên
khi có các điều kiện ngữ cảnh nơ các khoá không đợc nhạn biết khi chúng
cân bằng.Ví dụ : trong toán hình có thể coi điểm là cân bằngnếu chúng có
cùng toạ độ x ,trong khi với thuật toán khác coi chúng là cân bằng nếu chúng
khi chúng có toạ độ y(xem về vấn đề thảo luận trong7.1.3.Để thay thế ta
đồng ý với cách kiểm tra ngang bằng nh la thao tác để xác nhận khi mà
chúng có hai khoá bằng nhau.
Các kiểm tra ngang bằng có thể luôn dùng nh phơng pháp ngang bằng
của lớp khoá ,nếu cách dùng này là thích hợp.

b. Dùng nul làm thành phần và cờ hiệu :

Sự khác biệt thứ hai giữa từ điển ADT và java.util.Map là nó sử dụng
có vật thể đối tợng rỗng, nh là yếu tố đặc biệt trả lai để biểu thị tính lí thuyết
của tin cùng với khoá đợc cho trớc đó, trong khi đó nút rỗng nh là phần tử ở
tin mà khoá -phần tử lu trữ trong từ điển.Lu trữ 1 đối tợng rỗng nh kiểu phần
tử có thể phát sinh.Ví dụ chúng ta muốn lu trữ 1 khoá mà khong có phần tử
gán giá trị thực.Tuy nhiên ,lớp đối tợng java.util.Đictionảy vẫn có thể đợc sử
dụngcác đối tợng rỗng nh là giá trị NO-SUCH-KEY,nhng không cho phép
với các phần tửlà đối tử là đối tợng rỗng.Vì vậy đối tợng rỗng một mặt là 1
phần tử bình thờng ,mặt khác lại là phần tử đặc biệt ,đối tợng NO-SUCHKEY đối với từ điển ADT,lựa chọn đối tợng rỗng nh giá trị NO-SUCH-KEY
có thể chấp nhận trong các mẫu so xánh thử nghiệm đơn giản ,nhng nó vẫn
còn có thể sảy ra sự bác bỏ,Một phần nào đó ,nếu rỗng là phần tử chính
thống thì không có cách nào chuyển tải giữa đờng dẫn trả lại phần tử chính
thống rỗng ,từ từ điển và mộ vấn đề khía cạnh khác không thể thấy trong
khoá yêu cầu.Để chuẩn hoá lại sự bác bỏ này java.util.map cung cấp cho ta

phơng pháp Boolean cantainskey(k) ,trả lại giá trị true khi và chỉ khi k tồn tại
trong từ điển .

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

5


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

Còn những điểm khó nhận bíêt ra kết quả khi khóa gần nh là khoá duy
nhất,

II. Tp tin nht ký:
1. Phân tích cấu trúc dữ liệu Tập tin nhật kí :
Trờng hợp xấu nhất với thời gían chạy của phơng pháp này xảy ra rõ
ràng khi mà ta truy nhập không thành công ,tiếp theo thứ tự trong n tin.Vì
vậy phơng pháp findElement chạy trong khoảng thời gian 0(n).
Tong tự ,số lợng dòng của thời gian là cần thiết trong trờng hợp xấu
nhất để trình bày thao tác removeElement(k) trên D ,nh vấn đề hay đối với
thứ tự đẻ dich chuyển tin cùng khoá cho theo đó,đầu tiên chúng ta phải tìm
ra nó bằng cách dò theo thứ tự S .Vì vậy thời gian chạy trong việc trình bày
removeElement(k) trong file log là 0(n)
Thao tác findAllElements và removeAllElements luôn luôn yêu cầu dò
tìm theo thứ tự nối tiếp S,và kể từ đó thời gian chạy của chúng là 0(n).Có
nghĩa ,chúng chạy trong khoảng thời gian cận nhất trong cả hai tròng hợp tồi
nhất và tốt nhất.
2. Kết luận :

Từ điển D tơng thích với tập tin nhật kí cung cấp chèn nhanh nhng lại
tiêu tốn của truy nhập chậm và di chuyển .Vì vậy ta chỉ dùng nó ở nơi mà ta
không cần nhiều thao tác tìm kiếm. Tất nhiên cơ sở dữ liệu lu trữ và sự thực
hiện hệ điều hành có vị trí đặc biệt nh thế.

III. Bng bm :
1. Mng Bucket.
Mt mng bucket cho mt bng bm l mt mng A vi kớch c N, m
mi ụ ca A c xem nh l mt bucket ( tc l thựng cha cỏc cp
khúa thnh phn ) v s nguyờn N xỏc nh dung lng ca mng. Nu
khúa l nhng s nguyờn c phõn phi trong phm vi [0, N-1], mng
bucket ny l tt c nhng gỡ cn thit. Mt phn t e vi khúa k thỡ n
gin c chốn vo bucket A[k]. Bt kỡ nhng ụ no c kt hp vi
nhng khúa m khụng tn ti trong t in thỡ c gi thit cha ng i
tng NO_SUCH_KEY c bit. (Xem hỡnh 8.3)
0

9

1
10

2

3

4

5


6

7

8

Bucket của phần tử có khoá
bằng 6
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

6


X©y dùng th viÖn cho cÊu tróc tõ ®iÓn d÷ liÖu - Dictionary

Hình 8.3 Một minh họa của mảng bucket.
Tất nhiên, nếu các khóa là không duy nhất., thì 2 phần tử khác nhau có
thể được ánh xạ tới những bucket giống nhau trong A. Trong trường hợp
này, chúng ta nói rằng, một va chạm đã xảy ra. Rõ ràng, nếu mỗi bucket của
A có thể lưu trữ chỉ một phần tử đơn, thì ta không thể kết hợp nhiều phần tử
vào một bucket đơn lẻ, đây là một vấn đề trong trường hợp của các va
chạm.Thực ra, có nhiều cách đối phó với va chạm., mà chúng ta sẽ mô tả
sau, nhưng trước hết chiến lược tốt nhất là ngăn ngừa chúng.
2. Hàm băm.
Phần thứ 2 của cấu trúc bảng băm là 1 hàm, h, được gọi là hàm băm,
hàm này ánh xạ mỗi khóa k trong từ điển của chúng ta tới một số nguyên
trong phạm vi [0. N-1], với N là dung lượng của mảng bucket cho bảng này.
Theo quy ước trong Java, chúng ta xem sự đánh giá một của hàm băm ,

h(k), như thể bao gồm 2 tác động – ánh xạ khóa k tới 1 số nguyên, gọi là mã
băm, và ánh xạ mã băm tới 1 số nguyên nằm trong phạm vi của các chỉ mục
của mảng bucket, điều này được gọi là ánh xạ nén.
3. Mã băm
a. Mã băm trong JAVA.
Lớp Object tổng quát được định nghĩa trong Java được trang bị một
phương thức mặc định hashCode() cho phép ánh xạ mỗi đối tượng tách biệt
tới 1 số nguyên, được gọi là ”biểu diễn“ ( representation) của đối tượng đó.
Một cách cụ thể, phương thức hashCode() trả lại 1 số nguyên 32 bit kiếu int.
Trừ trường hợp bị thiết kế lại, phương thức này được thừa kế bởi mọi đối
tượng được sử dụng trong một chương trình Java. Chúng ta nên cẩn thận
trong sử dụng phiên bản Object mặc định của hashCode(), mặc dù, cả khi
điều này chỉ là một diễn dịch số nguyên của vị trí đối tượng trong bộ nhớ
( như nhiều trường hợp trong các thực thi Java (implementation)). Kiểu này
của mã băm làm việc 1 cách kém hiệu quả với các chuỗi kí tự, ví dụ như 2
đối tượng chuỗi khác nhau trong bộ nhớ có thể thực sự bằng nhau, trong
trường hợp này chúng ta muốn rằng chúng có mã băm giống nhau. Thực
vậy, lớp Java String thì thiết kế lại phương thức hashCode() của lớp Object
để làm một vài thứ phù hợp hơn cho chuỗi kí tự. Cũng như vậy, nếu ta có ý
định sử dụng đối tượng nào đó như là một khóa trong từ điển, thì chúng ta
nên thiết kế lại phương thức hashCode() cài sẵn cho các đối tượng này, thay
§å ¸n m«n häc Kü thuËt lËp tr×nh Híng ®èi tîng.

Trang

7


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary


th nú bng mt ỏnh x m n nh mt cỏch rng rói cỏc s nguyờn phự hp
cho cỏc loi ny ca cỏc i tng.
b. Chuyn kiu ti 1 s nguyờn.
bt u, ta chỳ ý rng, vi kiu d liu X bt k no m c biu
din bng cỏch s dng s bit nh mó bm nguyờn ca ta, ta cú th n gin
chp nhn mt biu din nguyờn ca cỏc bit ca nú nh l 1 mó bm cho X.
Do ú, vi cỏc kiu c s ca Java nh l byte, short, int, v char, ta cú th
t c 1 mó bm tt ch n gin bng cỏch chuyn kiu ny ti int. Cng
nh vy, cho cỏc bin x ca kiu c s float, ta cú th chuyn i x ti mt
s nguyờn bng cỏch s dng mt li gi ti phng thc
Float.floatTointBits(x), v sau ú s dng s nguyờn ny nh l mó bm ca
x.
c. Tớnh tng cỏc thnh phn.
Vi cỏc kiu c s, nh l long v double, m s biu din bit l gp
ụi ca mó bm, lc trờn thỡ khụng th ỏp dng ngay c. Tuy nhiờn,
nú vn cú th cú kh nng l mó bm, v qu thc nú oc s dng bi
nhiu thc thi Java (implementation), l ch n gin chuyn mt biu din
integer (hay long) ca kiu xung mt kớch c nguyờn ca mó bm. Mó bm
ny, tt nhiờn, b qua 1 na ca thụng tin hin ti trong giỏ tr nguyờn thu,
v nu nhiu loi khoỏ trong t in ch khỏc trong cỏc bit ny, thỡ chỳng s
va chm khi s dng mó bm n gin ny. Mt mó bm thay th m chn
tt c cỏc bit nguyờn thu vo xem xột, l tớnh tng mt biu din
nguyờn ca cỏc bit th t cao vi mt biu din nguyờn ca cỏc bit th t
thp. Vớ d nh mt mó bm cú th c vit trong Java nh sau :
static int hashCode(long i) {

return (int)((i>>32) + (int) i);
}
Qu thc, cỏch tip cn tớnh tng cỏc thnh phn cú th m rng ti bt
kỡ mt i tng x no m biu din nh phõn cú th c xem nh l mt

b-k (x0, x1, .., xk-1) gm cỏc s nguyờn, bi vỡ chỳng ta cú th sau ú thit
k 1
lp 1 mó bm cho x nh l t =0 xi . Vớ d, cho mt s du chm ng bt kỡ,
ta cú th tớnh tng phn nh tr v phn m ca nú nh l s nguyờn dng
long, sau ú ỏp dng 1 mó bm cho cỏc s nguyờng dng long ny cho
kt qu.
d. Mó bm a thc.
Mó bm tng, c mụ t trờn, khụng phi l s la chn toot cho cỏc
chui kớ t hoc cỏc i tng a chiu di khỏc m cú th c xem nh
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

8


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

nhng b cỏc hỡnh thc (x0, x1, , xk-1) m th t ca cỏc xi l quan trng.
Vớ d, ta hóy xem 1 mó bm cho chui kớ t s m tl tng cỏc giỏ tr ASCII
(hoc Unicode) ca cỏc kớ t trong s. Mó bm ny khụng may li to ra
nhiu va chm khụng mong mun cho cỏc nhúm thụng thng ca cỏc
chui. c bit, temp01 v temp10 va chm khi s dng hm ny, cng
nh stop, tops, pots, spot. Mt mó bm tt hn thỡ nờn bng cỏch
ny hay cỏch khỏc nờn quan tõm ti v trớ ca cỏc x i. Mt mó bm thay th,
m lm ỳng iu ny, ú l chn mt hng s khỏc 0, a1, v s dng giỏ
tr sau nh l 1 mó bm :
x0ak-1 + x1ak-2 + ..+ xk-2a + xk-1,
m, theo quy tc Horner ( Xem bi tp C-3.9), cú th c vit nh
sau :

xk-1 + a( xk-2 + a( xk-3 + . + a( x2 + a( x1 + ax0 )) )),
m, núi mt cỏch toỏn hc, l n gin húa mt a thc theo a, ly cỏc
thnh phn (x0, x1, , xk-1) ca i tng x nh l nhng h s ca nú. Mó
bm ny do vy c gi l mó bm a thc.
e. Mó bm dch vũng.
Mt bin th ca mó bm a thc ú l thay th phộp nhõn vi a bng
mt phộp dch vũng ca mt tng cc b theo mt s no ú cỏc bit. Mt
hm nh vy, c ỏp dng cho cỏc chui kớ t trong Java cú dng nh sau :
static int hashCode9String s) {
int h=0;
for (int i=0; ih= (h<<5) | (h>>>27);
// 5-bit dch vũng ca vic tớnh tng
h += (int) s.charAt(i);
// thờm vo kớ t tip theo
}
return h;
}
4. nh x nộn :.
a. Phơng pháp chia (division method) :
Một ánh xạ nén đơn giản ta dùng là : h(k)=|k|mod N.
mà ta gọi là phơng pháp chia. Ngoài ra, nếu cho N là một số nguyên tố, thì
hàm băm giúp ta trải rộng ra sự phân bổ của các mã băm. Thực vậy, nếu N
không phải là số nguyên tố, sẽ có khả năng cao hơn xảy ra là các mẫu trong
phân bố các khoá sẽ đợc lặp lại trong phân bố của các mã băm ; do vậy là
nguyên nhân của va chạm.

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang


9


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

b. Phơng pháp MAD :
Một ánh xạ nén phức tạp hơn, mà giúp ta khử đợc mẫu lặp lại trong tập
các khoá nguyên là MAD. Trong việc sử dụng phơng thức này, chúng ta xác
định hàm nén nh sau:
H(k)=| a*k + b | mod N
trong đó N là số nguyên tố, và a, b là các số nguyên không âm ngẫu
nhiên đợc lựa chọn đồng bộ với hàm nén, thì đợc xác định để cho a mod N
0. Hàm nén này thì đợc chọn để khử mẫu lặp lại trong tập mã băm và cho
phép chúng ta tạo lập đợc một hàm băm tốt, tức là, chúng đảm bảo rằng 2
khoá giống nhau thì sự va chạm lớn nhất là 1/N. Việc đối phó tốt này sẽ tơng
tự nh đã có nếu các khoá này phát triển trong A không thay đổi ngẫu nhiên.
5. Lc gii quyt va chm :
a. Mắt xích tách biệt :
Một cách thức đơn giản và có hiệu quả để đối phó với các va chạm là
cho phép mỗi bucket A[i] lu trữ một tham chiếu tới một danh sách, vectơ,
hoặc dãy, Si, lu trữ tất cả các mục mà hàm băm của ta đã ánh xạ đến bucket
A[i]. Dãy Si có thể đợc xem nh một từ điển thu nhỏ, đợc thi hành bằng việc
sử dụng dãy không sắp thứ tự, hay là phơng thức taap tin nhật ký (log file),
nhng đợc hạn chế chỉ lu giữ các mục (k,e) mà h(k)=i. Cách giải quyết va
chạm này gọi là mắt xích tách biệt. Giả thiết rằng, chúng ta thực thi mỗi
bucket không rỗng trong một từ điển thu nhỏ nh là một tập tin nhật ký theo
cách thức này, ta có thể thi hành các thao tác từ điển cơ bản nh sau:
+ findElement(k)
B

A[h(k)]
if b còn trống then
return NO_ SUCH_KEY
else {Tìm kiếm cho khoá k trong dãy với bucket này }
return B.findElement (k)
+ insertItem (k)
if A [h(k)] còn trống then
Tạo một từ điển B khởi đầu rỗng trên cơ sở dãy
A[h(k)]
B
else
B
A[h(k)]
B.insertItem(k, e)
+ removeElement(k) :
if B còn trống then
return NO_SUCH_KEY
esle
return B. removeElement(k)
6. Phng phỏp ỏnh a ch m :
a. Thăm dò tuyến tính:
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

10


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary


Một chiến lợc đơn giản giải quyết va chạm bằng phơng pháp đánh địa
chỉ mở là thăm dò tuyến tính. Trong chiến lợc này, nếu ta cố gắng chèn một
mục(k, e) vào một bucket A[i] đã đợc chiếm giữ, mà i= h(k), thì ta thử vào vị
trí tiếp theo A[(i+1) mod N]. Nếu A[(i+1) mod N] cũng đã bị chiếm giữ, ta
thử vào A[(i+2) mod N], v.v.., cho đến khi ta tìm đợc một bucket rỗng trong
A mà có thể chấp nhận mục mới. Một khi bucket này đã đợc xác định, ta chỉ
đơn giản chèn mục(k, e)vào đấy. Tất nhiên, việc sử dụng chiến lợc giải quyết
va chạm này yêu cầu ta thay đổi cách thức thi hành của thao tác
findElement(k). Đặc biệt, để thi hành một phép tìm kiếm nh vậy, ta phải
kiểm tra các bucket một cách liên tục, bắt đầu từ A[h(k)] cho đến khi chúng
ta, hoặc là tìm thấy một mục với khoá bằng k, hoặc là tìm thấy một bucket
rỗng( trong trờng hợp này, phép tìm kiếm là không thành công).
0

1

2

3

4
5
6
7
8
9
10
21
26 5 37 16
13

Hình 8.6 : Một phép chèn vào bảng băm, sử dụng thăm dò tuyến
tính để giải quyết va chạm. ở đây là chúng ta sử dụng ánh xạ nén h(k)=
k mod 11.
Tuy nhiên, thao tác removeElement(k) thì phức tạp hơn. Quả thực, để
thi hành đầy đủ phơng thức này, chúng ta phải khôi phục nội dung của mảng
bucket để xem nh thể là các mục với khoá k, thì cha hề đợc chèn đợc vào
trong bucket A[i] trong lần đầu tiên. Mặc dù việc thi hành một thao tác phục
hồi thì chắc chắn là có khả năng, nó vẫn yêu cầu chúng ta chuyển các mục
xuống trong các bucket trên A[i], trong khi không chuyển các mục khác
trong nhóm (tức là, các mục mà đã nằm đúng vị trí của chúng). Một cách
điển hình để khắc phục khó khăn này là thay thế các mục bị xoá với các mục
đặc biệt : "mục bị khử hoạt động". Đối tợng này phải đợc đánh dấu theo một
vài cách mà ta có thể ngay lập tức phát hiện khi nó chiếm giữ một bucket
nhất định. Với các con dấu đặc biệt này, có khả năng chiếm giữ bucket trong
bảng băm, ta thay đổi thuật toán tìm kiếm cho removeElement(k) hoặc
findElement(k), sao cho việc tìm kiếm khoá k nên bỏ qua các mục bị khử
hoạt động và tiếp tục thăm dò cho đến khi tới đợc mục mong muốn hoặc tới
đợc một bucket rỗng, nhng thay vì thế, thuật toán insertItem(k, e) thì nên
dừng tại một mục bị khử hoạt động và thay thế nó bằng mục mới sẽ đợc chèn
vào.
b. Thăm dò bậc hai:
Một chiến lợc đánh địa chỉ mở khác, gọi là "thăm dò bậc hai" liien quan
đến việc thử liên tục các bucket A[(i+f(j)) mod N], với j = 0, 1, 2, ... mà f(j) =
j2, cho đến khi tìm thấy một bucket rỗng. Giống nh thăm dò tuyến tính, thăm
dò bậc 2 làm phức tạp hơn các thao tác xóa, nhng nó ngăn ngừa đợc các kiểu
mẫu kết nhóm xảy ra với thăm dò tuyến tính. Tuy nhiên, nó tạo ra một loại
kết nhóm rieng, gọi là "kết nhóm thứ cấp" mà tập các ô mảng đã đầy sẽ tng"
(bounces) quanh mảng trong các mẫu cố định. Nếu N không đợc lựa chọn
nh là số nguyên tố, thì thăm dò bậc hai là chiến lợc không thể tìm thây một
bucket rỗng trong A ngay cả khi nó tồn tại. Trên thực tế, ngay cả khi N là số

nguyên tố, chiến lợc này không tìm thấy khe rỗng, nếu nh mảng bucket thì ít
nhất một nửa là đầy.
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

11


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

c, Băm kép:
Một chiến lợc đánh địa chỉ mở khác không gây ra kết nhóm nh kiểu tạo
ra bởi thăm dò bậc hai hay thăm dò tuyến tính, gọi là băm kép. Trong cách
tiếp cận này, chúng ta lựa chọn một hàm băm thứ hai, h', và nếu h ánh xạ một
vài khoá k tới bucket A[i], với i= h(k), mà đã đợc chiếm giữ, thì ta sẽ thử các
bucket A [ (i + f(j)) mod N ], với j = 1, 2, 3, .... mà f(j)= j.h'(k).
Trong lợc đồ này, hàm băm thứ 2 thì không cho phép đánh giá theo 0, và
lựa chọn chung đó là h'(k)= q - (k mod q), cho một vài số nguyên tố q N.
Ngoài ra, N phải là số nguyên tố. Hơn nữa, ta nên lựa chọn một hàm băm thứ
hai mà sẽ cố găng tối thiểu hoá việc kết nhóm hết sức có thể.
7. Tham s ti v bm li :
Trong tât cả lợc đồ bảng băm đợc mô tả ở trên, ta muốn rằng, tham số
tải, = [n/N], đợc giữ ở mức dới 1.Thực nghiệm và việc phân tích trung bình
đề nghị rằng ta nên duy trì < 0,5 cho phơng pháp đánh địa chỉ mở, và nên
duy trì < 0,9 cho phơng pháp mắt xích tách biệt.Thực vậy, nh ta sẽ tìm hiểu
bài tập C-8.7 ; một vài lợc đồ đánh địa chỉ mở có thể bắt đầu tồi tệ khi
0,5. Mặc dù chi tiết của việc phân tích trờng hợp trung bình vợt ra ngoài
phạm vi của sách này, cơ sở xác suất của nó thì khá trực giác. Nếu hàm băm
của ta là tốt, thì ta mong đợi rằng giá trị hàm băm đợc phân bố đồng đều

trong phạm vi[0, N-1]. Do đó, để lu trữ n mục trong từ điển của ta, con số
các khoá đợc dự trù nằm trong một bucket sẽ là [n/N], mà sẽ là 0(1) nếu n là
0(N). (tức là n N).
Với phơng pháp mắt xích tách biệt, khi đợc cho tiến đến 1, xác suất
của va chạm cũng tiến tới 1, ddiieuf này sẽ làm tăng chi phí các thao tác của
ta, do vậy, ta phải trở lại các phơng pháp thời gian tuyến tính, phơng pháp
dãy cơ sở trong các bucket có va chạm. Tất nhiên, trong trờng hợp xấu nhất,
một hàm băm tồi tệ có thể ánh xạ mọi mục tới cùng bucket, mà kết quả là thi
hành thời gian tuyến tính cho tất cả thao tác từ điển, nhng điều này thì không
thờng xuyên xảy ra.
Với phơng pháp đánh địa chỉ mở, trên một hớng khác, khi tham số tải
lớn dần vợt quá 0,5 và bắt đầu tiến gần đến 1, nhóm các dữ liệu của mảng
bucket củng bắt đầu tăng trởng. Các nhóm này khiến các chiến lợc thăm dò
bị tng lên vòng quanh mảng bucket trong lợng thời gian đáng kể trớc khi
chúng có thể hoàn thành. Tại giới hạn này, khi tiến đến 1, tất cả từ điển
thao tác có thời gian chạy dự trù là tuyến tính, bởi vì trong trờng hợp này, ta
dự kiến gặp một số tuyến tính các bucket đã đợc chiếm giữ, trớc khi tìm thấy
một trong vài ô trống còn lại.
Nh vậy, việc giữ tham số tải dới một ngỡng nào đó là vấn đề sống còn
cho lợc đồ đánh địa chỉ mở cũng nh phơng pháp mắt xích tách biệt. Nếu
tham số tải của mọt bảng băm ở trên vợt quá đáng kể so với ngỡng lý thuyết,
thì thông thờng bảng phải đợc chỉnh lại kích thớc(để trở lại tham số tải lý
thuyết) và tất cả các đối tợng đợc chèn vào bảng này. Quả thực, nếu để bảng
băm của ta trở nên đầy, một vài thực thi, bao gồm cả ví dụ Java đợc cho trong
đoạn mã 8.1, có thể đổ vỡ. Khi băm lại để có một bảng mới, thì điều kiện tất
yếu cho kích cỡ của bảng mới là ít nhất phải gấp đôi kích cỡ trớc. Một khi
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang


12


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

chúng ta đã định rõ mảng bucket mới này, chúng ta phải xác định một hàm
băm mới đi kèm với nó (có khả năng tính toán những tham số mới, chẳng
hạn nh phơng pháp MAD). Với hàm băm mới này, chúng ta chèn trỏ lại mọi
mục từ mảng cũ vào mảng mới sử dụng. Quá trình này gọi là băm lại.
Ngay cả với việc băm lại định kỳ, bảng băm thì vẫn là những phơng tiện
có hiệu quả của việc thi hành một từ điển không sắp thứ tự. Quả thực, nếu
chúng ta luôn luôn gấp đôi kích thớc của bảng băm với mỗi thao tác băm lại,
thì chúng ta cóa thể hoàn tất dần lại phí tổn của việc băm lại tất cả các phần
tử trong bảng dựa vào thời gian đợc sử dụng để chèn chúng vào vị trí đầu
tiên. Việc phân tích quá trình băm lại thì tơng tự nh đã đợc sử dụng để phân
tích vectơ tăng tiến (xem phần 5.1.3) Nói chung, mỗi một lần băm lại sẽ rải
các phần tử khắp nơi trong mảng bucket mới. Nh vậy, trong khi trở nên hữu
hiệu cho một từ điển không sắp thứ tự, bảng băm không phải là một sự lựa
chọn tốt cho việc thi hành một từ điển đã đợc sắp thứ tự.

IV. Bng tra cu.
Nu mt t in ó c sp xp cú trt t,ta cú th lu tr cỏc thnh
phn ca nú di dng mt vecto S vi cỏc khoỏ theo th t khụng
gim.Chỳng ta ch rừ s l mt vecto hn l mt dóy s.Vi vic sp xp cỏc
t khoỏ trong vộct S cho phộp tỡm kim nhanh hn so vi S khi cha sp
xp vớ d nh danh sỏch liờn kt.Ta quy nh cho vic ci t vộct cú th t
ny trong t in d l look-up table.Vic ci t ny hon ton trỏi ngc
vi caỡ dt log-file,trong ú s dng mt dóy s khụng c sp xp vo ci
dt t in.
Khụng gian yờu cõu cho gii thut ny l O(n) ,cng ging nh logfile ,gi s ta cú th thờm v bt cỏc mng ca vộct S gi cho t l cõn

i vi cỏc thnh phn ca S.Khụng ging nh log-file ,vic thc hin cp
nht trờn look-up table mt mt khong thi gian ỏng k.Trong trng
hp riờng , vic thc hin chốn mt thnh phn (k,e) vo look-up table cú
chi phớ thi gian l O(n) trong trng hp xỏu nht,khi m ta cn dch
chuyn ton b cỏc thnh phn tronh vecto vi cỏc khoỏ ln hn k to
nờn mt thnh phn mi (k,e).Tng t nh vy, vic ỏp dng cỏc phộp toỏn
removeElement(k) v removeAllElement (k)s cú chi phớ O(n) trong trng
hp xu nht.V vỡ vy vic ci t look-up table kộm hiu qu hn so vi
log-file trong trng hp xu nht ca vic cp nht.Tuy nhiờn ta cú th thc
hin gii thut findElement v findAllElement nhanh hn so vi look-up
table.
1. Tỡm kim nh phõn :
Gii thut duy trỡ hai tham s high v low.Mi thnh phn d tuyn cú
s th t hng ớt nht l low v cao nht l high.Ban u l=0 v high=n1;Ta t key(k) biu th khoỏ hng th i v elem(i)l cỏc thnh phn tng
ng ca nú.Ta s so sanh k vi giỏ tr gia :
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

13


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

mid=[(low + high)/2]
Nu k= key, thỡ ta ó tỡm c ,quỏ trỡnh tỡm kim kt thỳc
Nu kNu k>key ta thc hin liquỏ trỡnh nh c bng cỏch gỏn high= mid1.
Gii thut Binary Search
u vo:Mt vecto c sp xp vi n thnh phn cỏc khoỏ c truy

nhp vi phng thc key(i)
v ton b cỏc thnh phn c truy nhp
vi phng thc elem(i);
u ra:Mt thnh phn ca S vi khoỏ k v s hng nm trong
khong low and high nu thnh phn ú tn ti.hoc tr v giỏ tr
NO_SUCH-KEY.
if low >high then
Retunr NO_SUCH-KEY
Else
mid = [(low+high)/2]
if k=key(mid) then
return elem(mid)
else if kreturn BinarySearch(S,k,low,mid-1)
else
retunr BinarySearch(S,k,mid+1,high)

V. Danh sỏch b qua :
Mt SkipList ca Dictionary bao gm mt tp hp cỏc danh sỏch
{ S0,S1,,Sh}.Mi thnh phn Si lu tr mt tp hp con cỏc thnh phn
ca D ó c sp xp. Danh sỏch trong S phi tho món iu kin sau:
Danh sỏch S0 phi cha mi thnh phn ca D
Vi i=1,2,,h-1 danh sỏch Si phi bao gm cỏc tp ngu nhiờn
ca danh sỏch Si-1
Danh sỏch Sh ch cha - - v ++
Mt vớ d cho SkipList S vi S0 di ỏy v cỏc S1,S2,..,Sh trờn
nú vi h = log n l chiu cao ca danh sỏch S.

After(p):Tr v v trớ sau v trớ p trong cựng mc


Before(p): Tr v v trớ trc v trớ p trong cựng mc

Below(p): Tr v v trớ di v trớ p trong cựng thỏp

Above (p): Tr v v trớ tr ờn v trớ p trong cựng thỏp
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

14


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

Ta gi s rng cỏc phộp toỏn tr v giỏ tr NULL nu yờu cu khụng
tn ti
1. Gii thut tỡm kim
u vo: khoỏ k cn tỡm kim
u ra: v trớ ca p trong danh sỏch S m thnh phn ti p
cú khoỏ ln nht cng nh hn hoc bng k
t p l v trớ cao nht bờn trỏi ca danh sỏch S
While below(p)null do
pbelow(p)
{i xung}
while key(after(p))k do
pafter(p)
{sang ngang }
return p
2. Gii thut cp nht
a. Gii thut chốn:

TroTa õy s dng mó gi cho gii thut chốn trong danh sỏch c
minh ho Trong gii thut cú s dng phộp toỏn insertAfterAbove(p,q,
(k,e)) chốn vo mt v trớ sau v trớ p trong danh sỏch ( trong cựng mt
mc)
b. Gii thut Skipinsert:
u vo: Thnh phn (k,e)
u ra :Khụng cú
pSkipSearch(k)
qinsertAfterAbove(p,null,(k,e))
while random()<1/2 do
while above (p)= null do
pbefore(p)
pabove(p)
qinsertAfterAbove(p,q,(k,e)) {chốn mt thnh phn
mi}
c. Gii thut xoỏ
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

15


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

Cng ging nh gii thut chốn ,gii thut xoỏ danh sỏch cng khỏ
n gin .Thc vy nú thm chớ cũn n gin hn gii thut chốn,v ta t
tờn l removElement (k) .Ta bt u bng vic tỡm kim vi khoỏ k.Nu
khụng thnh cụng thỡ tr v giỏ tr NO_SUCH_KEY, trng hp cũn li v
trớ p ng vi khoỏ k c tỡm thy cp thp nht,ta s xoỏ ton b cỏc

v trớ trờn p,ni m dng truy nhp bi vic s dng phộp toỏn leo dn lờn
thỏp.gii thut ny cú chi phớ thi gian c
O(log n).
3. Phõn tớch gii thut SkipList
Ta bt u xỏc nh giỏ tr tt nht vi danh sỏch S cú cao h .Rt cú
th thnh phn c lu tr ti mc i ,v bi vy pi ti mc i cú ớt nht l
P i n / 2i
Kh nng m ti cao h ca S cú nhiu hn i cng ging nh kh
nng m m ti mc i cú ớt nht mt phn t,v bi vy nú khụng ln hn
Pi , iu ny cú ngha l h l ln hn 3logn trong a s cỏc trng hp
P3logn n /( 23logn )=n / n3 =1/n2
Núi chung thỡ vi mt s c 1 thỡ h bao gi cng ln hn clogn vi
kh nng l 1 / nc-1 v vỡ vy kh nng h clogn l 1-1 / nc-1 suy ra trong a
s cỏc trng hp thỡ cao ca h l O(log n) ỏnh giỏ v thi gian chi phớ
cho gii thut SkipList , quỏ trỡnh tỡm kim bao gm 2 vũng lp .Vũng lp
trong thc hin thc hin ScanForward (quột lờn phớa trc) trong cựng
mt mc S vi khoỏ sau thỡ ln hn khoỏ trc.V vũng lp ngoi thỡ chy
t trờn xung v lp li quỏ trỡnh quột trong bờn trong thỏp.Vỡ cú kh nng
rt ln l cao h ca S O(logn) nờn s lng cỏc bc trong quỏ trỡnh i
t trờn xuụng l O(logn).
Cuúi cựng ta cp n khụng gian cho gii thut SkipList ,s lng
thnh phn mong i ti mc i l n/2 i iu ú co ngha l tng s lng
thnh phn trong s l
n/2i =n1/2i <2n
V bi vy giỏ tr mong i õy l O(logn)
Bng sau õy bỏo cỏo vic thc hin T in bi SkipList
Phộp toỏn
Kớch thc ,nu rng
K eys,Element
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.


Thi gian chi phớ
O(1)
O(n)
Trang

16


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

FindElement, insertitem,removElement
FindAllElement,removeAllElement

O(logn)
O(log n +s)

C. XY DNG Mễ HèNH KIN TRC TH HIN LP
DICTIONARY.

I. Phõn tớch quỏ trỡnh phỏt trin ca cu trỳc Dictionary :
1. Tng quan :
Phn ny, ta s phõn tớch c th cỏc bc phỏt trin t n gin n
phc tp ca cu trỳc, xột trờn c 2 loi cú th t v khụng cú th t.
Trong tng phn c th, ta s xem xột chi tit n cỏc tớnh cht c
trng ca cu trỳc v c lý thuyt ln thc hnh ; cựng vi vic phõn tớch quỏ
trỡnh xõy dng s k tha ca cu trỳc.
a. Kiu t in khụng sp th t :
Gm cú 2 kiu thc thi, tp tin nht ký v bng bm. Tp tin nht ký s
dng dóy khụng sp th t, v bo m tớnh tng quỏt cao nht, õy ta

dựng mt dóy núi chung ( tc l phi ghộp cỏc Vector v cỏc List ).
Bng bm gm 2 thnh phn chớnh : mt mng bucket v mt hm bm.
C th, hm bm s thc hin 2 thao tỏc : xỏc nh mó bm cho khúa k, v
tip ú xõy dng mt ỏnh x nộn mó bm ny vo min ch mc thớch hp
cho mng bucket.
Trong thc thi c th, bng bm gp phi vn va chm, tc l cú th
cú cỏc mc cựng giỏ tr hm bm. Cú 3 phng phỏp gii quyt vn
ny : dựng mt xớch tỏch bit, dựng thm dũ tuyn tớnh, dựng thm dũ bc 2
v dựng bm kộp.
Ta cng s xem xột n cỏc h s ti v vic bm li khi cú vn cp
nht d liu.
b. Kiu t in cú sp th t :
Gm 2 kiu thc thi, bng tra cu v danh sỏch b qua. Bng tra cu l
mt vector lu tr cỏc mc theo th t khụng gim ca cỏc khúa.
Vic truy cp thnh phn theo hng s mt O(1) thi gian. Vic tỡm
kim theo thut toỏn nh phõn mt O(log n) thi gian.
Danh sỏch b qua s dng cỏc danh sỏch cú th t xõy dng cỏc
thỏp cho mi muc theo phộp ngu nhiờn húa. Chiu cao thỏp theo phộp tớnh
xỏc sut l khong log n, v ú chớnh l thi gian tỡm kim, chốn, g b d
liu trong danh sỏch.
2. Phõn tớch cỏc cu trỳc :
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

17


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary


a. Tp tin nht ký :
Phng phỏp ny s dng dóy khụng sp th t cha cỏc cp khúathnh phn (k, e), nh l mt danh sỏch ni kt ụi chng hn lu tr d
liu.
b. Bng bm :
Trong phn ny, cỏc cp (k, e) c lu vo mt mng bucket theo cỏc
ch mc c xỏc nh bi mt hm bm tỏc ng khúa k.
Tc l, u tiờn, ta gi mt phng thc tỏc ng lờn khúa k xỏc
nh mó bm cho k, sau ú, dựng hm bm ỏnh x nộn mó bm ú v mt
ch mc phự hp lu tr vo mng.
Phng phỏp Mt xớch tỏch bit : Cỏc mc cú ch mc trựng nhau s
c lu vo cựng mt v trớ trờn mng bng mt danh sỏch liờn kt khụng
th t.
Phng phỏp Thm dũ tuyộn tớnh : Cỏc mc cú ch mc trựng nhau s
c lu vo mt v trớ khỏc cũn trng trong mng bng cỏch thm dũ cỏc ụ
k tip cỏch ụ u 1, 2, 3, 4, ... , j , ... ụ.
Phng phỏp Thm dũ bc hai : Cỏc mc cú ch mc trựng nhau s
c lu vo mt v trớ khỏc cũn trng trong mng bng cỏch thm dũ cỏc ụ
k tip theo quy tc cỏch ụ u 1, 4, 9, 16, ... , j2, .... ụ.
Phng phỏp Bm kộp : Cỏc mc cú ch mc trựng nhau s c lu
vo mt v trớ khỏc cũn trng trong mng bng cỏch thm dũ cỏc ụ k tip
theo quy tc cỏch ụ u j*(q (k mod q)) ụ, vi q l mt s nguyờn t.
c. Bng tra cu :
Phng phỏp ny s dng dóy sp th t cha cỏc cp khúa-thnh phn
(k, e), nh l mt vector chng hn lu tr d liu.
Phộp tỡm kim trong phng thc ny l phộp tỡm kim nh phõn.
d. Danh sỏch b qua :
Trong phn ny, cỏc cp (k, e) c lu vo mt tp danh sỏch cú th
t, theo chiu ngang nh l cỏc cp v theo chiu dc nh l cỏc thỏp.
Tc l, u tiờn, ta lu cỏc cp (k, e) vo danh sỏch u tiờn, sau ú
dựng phộp ngu nhiờn húa quyt nh lu bao nhiờu thnh phn theo

chiu dc ca danh sỏch.
Cỏc phộp toỏn tỡm kim, thờm vo, xúa b c thit lp c th trong
thut toỏn.
3. Mó thut toỏn c bn cho cỏc cu trỳc trờn trong JAVA :
//------------------------------------------------------------------------------------public interface DictionaryADT {
public abstract int size();
Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

18


X©y dùng th viÖn cho cÊu tróc tõ ®iÓn d÷ liÖu - Dictionary

public abstract boolean isEmpty();
public abstract Iterator elements();
public abstract Iterator keys();
public
abstract
Object
findElement(Object
k)
throws
InvalidKeyException;
public abstract Iterator findAllElements(Object k) throws
NoSuchElementException;
public abstract void insertItem(Object k, Object e) throws
InvalidKeyException;
public abstract Object removeElement(Object k) throws

InvalidKeyException;
public abstract Iterator removeAllElements(Object k) throws
NoSuchElementException;
}
//------------------------------------------------------------------------------------public class HashComparator {
public HashComparator() {
}
public boolean isComparable(Object a) {
}
public boolean isLessThan(Object a, Object b) {
}
public boolean isLessThanorEqualTo(Object a, Object b) {
}
public boolean isEqualTo(Object a, Object b) {
}
public boolean isGreaterThan(Object a, Object b) {
}
public boolean isGreaterThanorEqualTo(Object a, Object b) {
}
public int hashValue(Object tempkey) {
}
}
//------------------------------------------------------------------------------------public class Item {
}
class DoubleLinkItem {
}
class AroundLinkedItem {
}
§å ¸n m«n häc Kü thuËt lËp tr×nh Híng ®èi tîng.


Trang

19


X©y dùng th viÖn cho cÊu tróc tõ ®iÓn d÷ liÖu - Dictionary

class DoubleLinkList {
}
//------------------------------------------------------------------------------------class SkipList {
}
class LogFile {
}
class LookupTablet {
}
public class SeparateChainingHashTable implements DictionaryADT {
}
public class QuadraticProbingHashTable implements DictionaryADT {
}
public class QuadraticProbingHashTable implements DictionaryADT {
}
public class DoubleHashingHashTable implements DictionaryADT {
}

//------------------------------------------------------------------------------II. Xây dựng sơ đồ kế thừa :

Phần này được đi kèm với bộ báo cáo trong phần thể hiện bằng
UML trên phần mềm Rational Rose 2002.
III. Mô tả bằng sơ đồ UML :
Phần này đi kèm với chương trình thể hiện sơ đồ UML trong đĩa

CD của chương trình.
D. THỰC HIỆN LẬP TRÌNH TRÊN JAVA THỰC THI CẤU
TRÚC tõ ®iÓn d÷ liÖu :
Ta tạo một gói Dictionary gồm gói HashTable, các lớp LogFile,
LookupTable, SkipList.
Gói HashTable bao gồm các lớp SeparateChaining, LinearProbing,
QuadraticProbing, DoubleHash.
Phần này được thể hiện rõ trong mã nguồn kèm theo trong đĩa CD chứa
chương trình.
E. ĐỀ ÁN XÂY DỰNG ADT TỪ DIỂN VỚI BẲNG BĂM SỬ
DỤNG PHƯƠNG PHÁP MẮT XÍCH TÁCH BIỆT.

§å ¸n m«n häc Kü thuËt lËp tr×nh Híng ®èi tîng.

Trang

20


Xây dựng th viện cho cấu trúc từ điển dữ liệu - Dictionary

Dữ liu c dựng l cỏc chui c ngi dựng nhp vo t File vn
bn hoc t File HTML.
Phn ny cng c th hin trong mó ngun kốm theo chng trỡnh.
F. KT LUN :
Bỏo cỏo trờn trỡnh by mt cỏch s b v tng quan v cu trỳc d
liu t in v cỏc ci dt liờn quan.
Th hin rừ hn s c trỡnh by trong mó ngun ca chng trỡnh.
H Ni, ngy 1/11/2002.
Nhúm Sinh viờn thc hiờn :


Vừ S Nam.
Bựi Doón Ngc.
Trn MaiThu.

Đồ án môn học Kỹ thuật lập trình Hớng đối tợng.

Trang

21



×