Á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

21 293 0
Á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

Đ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

Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary Báo cáo tổng hợp Kết thực đồ án K THUT LP TRèNH HNG I TNG ĐỀ TÀI : Á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- A GIỚI THIỆU VỀ ĐỀ TÀI : I Tổng quan - mục đích : Như ta biết, ngày nay, việc tạo phần mềm trở thành cơng việc có độ phức tạp lớn, địi hỏi nhiều nhân lực cơng sức Việc thiết kế thực thi ứng dụng phần mềm thường liên quan đến tương tác đơn thể viết từ nhiều người khác nhiều tổ chức khác Phần lớn người lên hệ mật thiết với Ngồi ra, sau thời gian, sản phẩm phần mềm thường có xu hướng phải nâng cấp, khắc phục lỗi, bổ sung tính Điều dẫn đến xu hướng phát triển phương pháp để tạo thiết kế đơn giẩn mặt khía niệm, dễ hiểu đủ mạnh để giải toán khó cách hiệu Một phương pháp xem đầy hứa hẹn để đạt cân vậy, thiết kế hướng đối tượng (Object – Oritented Design : OOD) Bên cạnh đó, việc sử dụng lại mã dạng thư viện vấn đề cần quan tâm, góp phần quan trọng cho việc giảm thiểu số mã phải viết sử dụng lại thành tựu người khác Trong phạm vi đề tài này, xem xét khía cạnh nhỏ việc á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 liệu” – Dictionary Công cụ sử dụng để cài đặt thuật tốn JAVA.Điều có vài thuận lợi : thứ nhất, JAVA ngôn ngữ hướng đối tượng, bao chứa cách đương nhiên kỹ thuật dùng lại mã ; thứ hai, JAVA có cú pháp súc tích C/C++ song tránh số chế thường gây lẫn lộn : biến trỏ, struct, biểu thức gán kiểu tự v.v ; thứ ba JAVA cài sẵn quản lý Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary giao din, ca s, chuột, quản lý nhớ thu gom rác, truyền thơng nút mạng, đa lập trình thơng qua phân tuyến v.v Một điều quan trọng phải kể đến, khác với C/C++, JAVA thiết kế độc lập tảng, đó, đơn giản hóa việc thực thi đề án lớp II Nhiệm vụ phải giải : Trình bày vấn đề lý thuyết liên quan : Trong phần này, ta nêu cách vấn đề lý thuyết liên quan đến cấu trúc liệu kiểu từ điển - gồm giao diên chung cho phương thức dùng thư viện – DictionaryADT thực thi cụ thể cho phương thức : tập tin nhật ký, bảng băm, bảng tra cứu danh sách bỏ qua Trong phần trình bày chung, ta nêu lên số phép toán số ý quan trọng Ngoài ra, ta tham khảo đến từ điển gói java.util xét thêm khác biệt từ điển Xây dựng mơ hình kiến trúc thể lớp Dictionary : a Phân tích trình phát triển cấu trúc Dictionary : Phần này, ta phân tích cụ thể bước phát triển từ đơn giản đến phức tạp cấu trúc, xét loại có thứ tự khơng có thứ tự Trong phần cụ thể, ta xem xét chi tiết đến tính chất đặc trưng cấu trúc lý thuyết lẫn thực hành ; với việc phân tích q trình xây dựng sơ đồ kế thừa cấu trúc b Xây dựng sơ đồ kế thừa : Lớp từ điển sử dụng thừa kế số cấu trúc khác Vector, List, dãy, dạng danh sách nối kết đơn, kép, phía Bản thân lớp gói sử dụng phương thức nhau, phương thức tìm kiếm, chèn gỡ bỏ Sơ đồ ké thừa xây dựng theo quy chuẩn kỹ thuật lập trình hướng đối tượng c Mơ tả sơ đồ UML : Phần ta sử dụng UML để thể sơ đồ kế thừa nói Phần mềm sử dụng Rational Rose 2002 Sơ dồ thể lớp gói kèm theo thư viện lập dạng help Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary Ci t cỏc thư viện JAVA: Trong phần này, ta xây dựng thư viện thực thi giao diện DictionarryADT Để đạt tính tổng quát cao nhất, ta cho phép lưu trữ khóa lẫn thành phần từ diển thuộc kiểu đối tượng Ở ta phân biệt hai kiểu từ điển, từ điển khơng thứ tự từ điển có thứ tự Ta dùng khóa làm dấu định vị, từ điển có thứ tự, việc so sánh hai khóa sánh tử đảm nhận Các mục liệu lưu trữ dạng : Item, gồm mục đơn ; DoublyLinkedItem, gồm mục có tham chiếu đến mục khác ; AroundLinkedItem, gồm mục có tham chiếu đến mục khác Mã nguồn chương trình kèm theo đĩa CD Ứng dụng thư viện để giải đề án : Ở dây ta xem xét đề án thực thi ADT từ điển với bảng băm sử dụng phương pháp mắt xích tách biệt để đối phó với va chạm Đề án không sử dụng lớp java,util.HashTable cài sằn JAVA Đánh giá tiêu thức phần mềm xây dựng theo quy trình đánh giá phần mềm hướng đối tượng Các mục tiêu : a Sức mạnh : bẫy hầu hết lỗi, lường trước nhập liệu không theo chuẩn để đối phó phục hồi b Khả thích ứng : bổ sung, phát triển nâng cấp, đảm bảo tính khả chuyển cao tính động lớn c Khả dùng lại : đảm bảo khả dùng lại cho phần mềm khác Các nguyên tắc : a Khả trừu tượng : ADT tức kiểu liệu trừu tượng Một ADT định nội dung thực phép toán, khơng phải cách thực Tức diẽn tả dạng giao diện ADT thực hóa lớp JAVA b Khả gói riêng : gồm có việc che dấu vùng phương thức riêng giao diện hay lớp Khả cho phép tự việc thực thi chi tiết hệ thống c Tính mô-đun : Hệ thống phải đảm bảo việc chia thành gói riêng biệt, mang tính chun mơn hóa cao, đảm bảo tính sáng sủa, mạch lạc chương trình khả dùng lại mơđun §å án môn học Kỹ thuật lập trình Hớng đối tợng Trang X©y dùng th viƯn cho cÊu tróc tõ ®iĨn d÷ liƯu - Dictionary B NHỮNG VẤN ĐỀ CƠ BẢN CỦA CẤU TRÚC DICTIONARY I Những vấn đề chung ADT tõ ®iĨn Giao diện chung thư vin Dictionary : ADT từ điển hỗ trợ phơng pháp : size (): Trả lại số lợng môc D Input : None ; outpu t: integer; isEmpty(): Kiểm tra, trả lại giá trị rỗng Input : None ; Output : boolean; elements(): Trả lại phÇn tư lu D Input : None ; Output : Iterator of objects (elements) findElement(k) : NÕu D chøa mục khoá k, trả lại đối tợng mục nh thế, 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 phần tử với khoá 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 khoá k vào D input : object (key) and (element) ; output : None removeElement(k) : Gỡ b D mục khoá k, trả thành phần nó, 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 D tất mục khoá k, trả lặp tử thành phần nó, không trả lại phần tử đặc biệt NO_SUCH_KEY Input : đối tợng (key) ; output : lỈp tư (elements) Phân tích : Khi thao tác FindElement(k) RemovElement(k) không thành công (điều có nghĩa từ điển D tin víi tõ kho¸ Equal to k), ta sư dơng sù hoán đổi trả phần tử đặc biệt NO_SUCH_KEY Phần tử đợc biết đến nh lính canh Chúng ta sử dụng hoán đổi lựa chọn trở lại phần tử rỗng Nhng ngăn cản ta từ việc lu trữ D tin mà phần tử rỗng Một lựa chọn khác, tất nhiên, bỏ qua loại trừ số vấn đề yêu cầu khoá mà từ điển Điều ứng dụng thịch hợp trờng hợp loại trừ Tuy nhiên, bình thờng hỏi vấn đề từ điển Hơn bỏ qua thu thập lại việc loại trừ đặc trng chậm trễ kiểm tra lại lính canh; kể từ đó, sử dụng lính canh ngày linh hoạt ( và, trờng hợp này, nhiều khái niệm đặc trng hơn) Ghi nhớ rằng, nh xác định từ điển D chứa đựng tin với khoá ngang Trong trờng hợp này, thao tác find element(k) remove element(k) trả lại phần tử tuỳ ý mà khoá đợc kết nối equal to k Nếu chóng ta mong mn lu tr÷ tin l tõ điển mà tin Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary thân lại khoá nó, sau thêm l với phơng pháp gọi insertitem(e,l) Mỗi thao tác từ điển tiêu chuẩn đa yêu cầu có cấu phân chia trờng hợp có khoá cân Nếu từ điển đợc xếp thự tự có phơng pháp cân 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 mà hỗ trợ cho phép toán cân khoá Một thao tác đợc xét nh phạm vi mức kiểm tra cân đợc dùng thay cho mức kiểm tra cân TĐTT Khi từ điển ®ỵc thut minh, ta nèi chóng víi møc kiĨm tra cân thao tác điều dẫn đến kiêmt nghiệm có khoá cân định nghĩa đợc xác định khả thi Từ điển Package java.util a Kiểm nghiệm đẳng thức với java.util.Map Khác biệt giao diện java.util.Map đợc thấy cách thực phơng pháp cân ,đợc hỗ trợ bất ks đối tợng java ,dẫn đến định có hai khoá cân bằng.Theo cách ,nếu 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ỉ không thật hữu hiệu,tuy nhiên có điều kiện ngữ cảnh nơ khoá không đợc nhạn biết chúng cân bằng.Ví dụ : toán hình coi điểm cân bằngnếu chúng có toạ độ x ,trong với thuật toán khác coi chúng cân chúng chúng có toạ độ y(xem vấn đề thảo luận trong7.1.3.Để thay ta đồng ý víi c¸ch kiĨm tra ngang b»ng nh la thao tác để xác nhận mà chúng có hai khoá Các kiểm tra ngang dùng nh phơng pháp ngang lớp khoá ,nếu cách dùng thích hợp b Dùng nul làm thành phần cờ hiệu : Sự khác biệt thứ hai từ điển ADT java.util.Map sử dụng có vật thể đối tợng rỗng, nh yếu tố đặc biệt trả lai để biểu thị tính lí thuyết tin với khoá đợc cho trớc đó, nút rỗng nh phần tử tin mà khoá -phần tử lu trữ từ điển.Lu trữ đối tợng rỗng nh kiểu phần tử phát sinh.Ví dụ muốn lu trữ 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 đợc sử dụngcác đối tợng rỗng nh giá trị NO-SUCH-KEY,nhng không cho phép với phần tửlà đối tử đối tợng rỗng.Vì đối tợng rỗng mặt phần tử bình thờng ,mặt khác lại phần tử đặc biệt ,đối tợng NO-SUCHKEY từ điển ADT,lựa chọn đối tợng rỗng nh giá trị NO-SUCH-KEY chấp nhận mẫu so xánh thử nghiệm đơn giản ,nhng sảy bác bỏ,Một phần ,nếu rỗng phần tử thống cách chuyển tải đờng dẫn trả lại phần tử thống rỗng ,từ từ điển mộ vấn đề khía cạnh khác thấy khoá yêu cầu.Để chuẩn hoá lại bác bỏ java.util.map cung cấp cho ta phơng pháp Boolean cantainskey(k) ,trả lại giá trị true k tồn từ điển Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary Còn điểm khó nhận bíêt kết khóa gần nh khoá nhÊt, II Tập tin nhật ký: Ph©n tÝch cÊu trúc liệu Tập tin nhật kí : Trờng hợp xấu với thời gían chạy phơng pháp xảy rõ ràng mà ta truy nhập không thành công ,tiếp theo thứ tự n tin.Vì phơng pháp findElement chạy khoảng thời gian 0(n) Tong tự ,số lợng dòng thời gian cần thiết trờng hợp xấu để trình bày thao tác removeElement(k) D ,nh vấn đề hay thứ tự đẻ dich chuyển tin khoá cho theo đó,đầu tiên phải tìm cách dò theo thứ tự S Vì thời gian chạy việc trình bày removeElement(k) file log 0(n) Thao tác findAllElements removeAllElements 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 chúng 0(n).Có nghĩa ,chúng chạy khoảng thời gian cận hai tròng hợp tåi nhÊt vµ tèt nhÊt 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 truy nhập chậm di chuyển Vì ta dùng nơi mà ta không cần nhiều thao tác tìm kiếm Tất nhiên sở liệu lu trữ thực hệ điều hành có vị trí đặc biÖt nh thÕ III Bảng băm : Mảng Bucket Một mảng bucket cho bảng băm mảng A với kích cỡ N, mà A xem “ bucket” ( tức thùng chứa cặp khóa thành phần ) số nguyên N xác định dung lượng mảng Nếu khóa số nguyên phân phối phạm vi [0, N-1], mảng bucket tất cần thiết Một phần tử e với khóa k đơn giản chèn vào bucket A[k] Bất kì ô kết hợp với khóa mà không tồn từ điển giả thiết chứa đựng đối tượng NO_SUCH_KEY đặc biệt (Xem hình 8.3) 10 Bucket phần tử có khoá Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang 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 mảng bucket Tất nhiên, khóa khơng nhất., phần tử khác ánh xạ tới bucket giống A Trong trường hợp này, nói rằng, va chạm xảy Rõ ràng, bucket A lưu trữ phần tử đơn, ta kết hợp nhiều phần tử vào bucket đơn lẻ, vấn đề trường hợp va chạm.Thực ra, có nhiều cách đối phó với va chạm., mà mơ tả sau, trước hết chiến lược tốt ngăn ngừa chúng Hàm băm Phần thứ cấu trúc bảng băm hàm, h, gọi hàm băm, hàm ánh xạ khóa k từ điển tới số nguyên phạm vi [0 N-1], với N dung lượng mảng bucket cho bảng Theo quy ước Java, xem đánh giá hàm băm , h(k), thể bao gồm tác động – ánh xạ khóa k tới số nguyên, gọi mã băm, ánh xạ mã băm tới số nguyên nằm phạm vi mục mảng bucket, điều gọi ánh xạ nén Mã băm a Mã băm JAVA Lớp Object tổng quát định nghĩa Java trang bị phương thức mặc định hashCode() cho phép ánh xạ đối tượng tách biệt tới số nguyên, gọi ”biểu diễn“ ( representation) đối tượng Một cách cụ thể, phương thức hashCode() trả lại số nguyên 32 bit kiếu int Trừ trường hợp bị thiết kế lại, phương thức thừa kế đối tượng sử dụng chương trình Java Chúng ta nên cẩn thận sử dụng phiên Object mặc định hashCode(), mặc dù, điều diễn dịch số nguyên vị trí đối tượng nhớ ( nhiều trường hợp thực thi Java (implementation)) Kiểu mã băm làm việc cách hiệu với chuỗi kí tự, ví dụ đối tượng chuỗi khác nhớ thực nhau, trường hợp muốn chúng có mã băm giống Thực vậy, lớp Java String thiết kế lại phương thức hashCode() lớp Object để làm vài thứ phù hợp cho chuỗi kí tự Cũng vậy, ta có ý định sử dụng đối tượng khóa từ điển, nên thiết kế lại phương thức hashCode() cài sẵn cho đối tng ny, thay Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển liệu - Dictionary th ánh xạ mà ấn định cách rộng rãi số nguyên phù hợp cho loại đối tượng b Chuyển kiểu tới số nguyên Để bắt đầu, ta ý rằng, với kiểu liệu X mà biểu diễn cách sử dụng số bit mã băm nguyên ta, ta đơn giản chấp nhận biểu diễn nguyên bit mã băm cho X Do đó, với kiểu sở Java byte, short, int, char, ta đạt mã băm tốt đơn giản cách chuyển kiểu tới int Cũng vậy, cho biến x kiểu sở float, ta chuyển đổi x tới số nguyên cách sử dụng lời gọi tới phương thức Float.floatTointBits(x), sau sử dụng số nguyên mã băm x c Tính tổng thành phần Với kiếu sở, long double, mà biểu diễn bit gấp đơi mã băm, lược đồ khơng thể áp dụng Tuy nhiên, có khả mã băm, thực đựoc sử dụng nhiều thực thi Java (implementation), đơn giản chuyển biểu diễn integer (hay long) kiểu xuống kích cỡ nguyên mã băm Mã băm này, tất nhiên, bỏ qua nửa thông tin giá trị nguyên thuỷ, nhiều loại khoá từ điển khác bit này, chúng va chạm sử dụng mã băm đơn giản Một mã băm thay mà chọn tất bit nguyên thuỷ vào để xem xét, để tính tổng biểu diễn nguyên bit thứ tự cao với biểu diễn nguyên bit thứ tự thấp Ví dụ mã băm viết Java sau : static int hashCode(long i) { return (int)((i>>32) + (int) i); } Quả thực, cách tiếp cận tính tổng thành phần mở rộng tới đối tượng x mà biểu diễn nhị phân xem bộ-k (x0, x1, … , xk-1) gồm số nguyên, sau thiết k −1 lập mã băm cho x ∑t =0 xi Ví dụ, cho số dấu chấm động bất kì, ta tính tổng phần định trị phần mũ số nguyên dạng long, sau áp dụng mã băm cho số nguyêng dạng long kết d Mã băm đa thức Mã băm tổng, mô tả trên, lựa chọn toot cho chuỗi kí tự đối tượng đa chiều 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 Xây dựng th viện cho cấu trúc từ điển d÷ liƯu - Dictionary hình thức (x0, x1, ……, xk-1) mà thứ tự xi quan trọng Ví dụ, ta xem mã băm cho chuỗi kí tự s mà tlà tổng giá trị ASCII (hoặc Unicode) kí tự s Mã băm không may lại tạo nhiều va chạm khơng mong muốn cho nhóm thơng thường chuỗi đặc biệt, “temp01” “temp10” va chạm sử dụng hàm này, “stop”, “tops”, “pots”, “spot” Một mã băm tốt nên cách hay cách khác nên quan tâm tới vị trí x i Một mã băm thay thế, mà làm điều này, chọn số khác 0, a≠1, sử dụng giá trị sau mã băm : x0ak-1 + x1ak-2 + … + xk-2a + xk-1, mà, theo quy tắc Horner ( Xem tập C-3.9), viết sau : xk-1 + a( xk-2 + a( xk-3 + … + a( x2 + a( x1 + ax0 )) …)), mà, nói cách tốn học, đơn giản hóa đa thức theo a, lấy thành phần (x0, x1, ……, xk-1) đối tượng x hệ số Mã băm gọi mã băm đa thức e Mã băm dịch vòng Một biến thể mã băm đa thức thay phép nhân với a phép dịch vòng tổng cục theo số bit Một hàm vậy, áp dụng cho chuỗi kí tự Java có dạng sau : static int hashCode9String s) { int h=0; for (int i=0; i27); // 5-bit dịch vịng việc tính tổng h += (int) s.charAt(i); // thêm vào kí tự } return h; } 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, cho N số nguyên tố, hàm băm giúp ta trải rộng phân bổ mà băm Thực vậy, N số nguyên tố, có khả cao xảy mẫu phân bố khoá đợc lặp lại phân bố mà băm ; nguyên nhân va chạm Đồ án môn học Kỹ thuật lập trình Hớng đối tợng Trang Xây dựng th viện cho cấu trúc từ điển 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 tập khoá nguyên MAD Trong việc sử dụng phơng thức này, xác định hàm nén nh sau: H(k)=| a*k + b | mod N N số nguyên tố, a, b số nguyên không âm ngẫu nhiên đợc lựa chọn đồng với hàm nén, đợc xác định a mod N Hàm nén đợc chọn để khử mẫu lặp lại tập mà băm cho phép tạo lập đợc hàm băm tốt, tức là, chúng đảm bảo khoá giống va chạm lớn 1/N Việc đối phó tốt tơng tự nh đà có khoá phát triển A không thay đổi ngẫu nhiên Lc gii quyt va chm : a Mắt xích tách biệt : Một cách thức đơn giản có hiệu để đối phó với va chạm cho phép bucket A[i] lu trữ tham chiếu tới danh sách, vectơ, dÃy, Si, lu trữ tất mục mà hàm băm ta đà ánh xạ đến bucket A[i] DÃy Si đợc xem nh từ điển thu nhỏ, đợc thi hành việc sử dụng dÃy không thứ tự, phơng thức taap tin nhật ký (log file), nhng đợc hạn chế lu giữ mục (k,e) mà h(k)=i Cách giải va chạm gọi mắt xích tách biệt Giả thiết rằng, thực thi bucket không rỗng từ điển thu nhỏ nh tập tin nhật ký theo cách thức này, ta thi hành thao tác từ điể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 d·y víi bucket nµy } return B.findElement (k) + insertItem (k) if A [h(k)] trống then Tạo từ điển B khởi đầu rỗng 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) 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 liệu - Dictionary Một chiến lợc đơn giản giải va chạm phơng pháp đánh địa mở thăm dò tuyến tính Trong chiến lợc này, ta cố gắng chèn mục(k, e) vào bucket A[i] đà đợc chiếm giữ, mà i= h(k), ta thử vào vị trí 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 , ta tìm đợc bucket rỗng A mµ cã thĨ chÊp nhËn mơc míi Mét bucket đà đợc xác định, ta đơn giản chèn mục(k, e)vào Tất nhiên, việc sử dụng chiến lợc giải va chạm yêu cầu ta thay đổi cách thức thi hành thao tác findElement(k) Đặc biệt, để thi hành phép tìm kiếm nh vậy, ta phải kiểm tra bucket cách liên tục, A[h(k)] chúng ta, tìm thấy mục với khoá k, tìm thấy bucket rỗng( trờng hợp này, phép tìm kiếm không thành công) 10 21 26 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 va chạm sử dụng ánh xạ nén h(k)= k mod 11 Tuy nhiên, thao tác removeElement(k) phức tạp Quả thực, để thi hành đầy đủ phơng thức này, phải khôi phục nội dung mảng bucket để xem nh thể mục với khoá k, cha đợc chèn đợc vào bucket A[i] lần Mặc dù việc thi hành thao tác phục hồi chắn có khả năng, yêu cầu chuyển mục xuống bucket A[i], không chuyển mục khác nhóm (tức là, mục mà đà nằm vị trí chúng) Một cách điển hình để khắc phục khó khăn thay mục bị xoá với mục đặc biệt : "mục bị khử hoạt động" Đối tợng phải đợc đánh dấu theo vài cách mà ta phát chiếm giữ bucket định Với dấu đặc biệt này, có khả chiếm giữ bucket bảng băm, ta thay đổi thuật toán tìm kiếm cho removeElement(k) findElement(k), cho việc tìm kiếm khoá k nên bỏ qua mục bị khử hoạt động tiếp tục thăm dò tới đợc mục mong muốn tới đợc bucket rỗng, nhng thay thế, thuật toán insertItem(k, e) nên dừng mục bị khử hoạt động thay mục đợc chèn vào b Thăm dò bậc hai: Một chiến lợc đánh địa mở khác, gọi "thăm dò bậc hai" liien quan đến việc thử liên tục bucket A[(i+f(j)) mod N], víi j = 0, 1, 2, mà f(j) = j2, tìm thấy bucket rỗng Giống nh thăm dò tuyến tính, thăm dò bậc làm phức tạp thao tác xóa, nhng ngăn ngừa đợc kiểu mẫu kết nhóm xảy với thăm dò tuyến tính Tuy nhiên, tạo loại kết nhóm rieng, gọi "kết nhóm thứ cấp" mà tập ô mảng đà đầy tng" (bounces) quanh mảng mẫu cố định Nếu N không đợc lựa chọn nh số nguyên tố, thăm dò bậc hai chiến lợc tìm thây bucket rỗng A tồn Trên thực tế, N số nguyên tố, chiến lợc không tìm thấy khe rỗng, nh mảng bucket nửa đầ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 liệu - Dictionary c, Băm kép: Một chiến lợc đánh địa mở khác không gây kết nhóm nh kiểu tạo thăm dò bậc hai hay thăm dò tuyến tính, gọi băm kép Trong cách tiếp cận này, lựa chọn hàm băm thứ hai, h', h ánh xạ vài khoá k tới bucket A[i], với i= h(k), mà đà đợc chiếm giữ, 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ứ không cho phép đánh giá theo 0, lựa chọn chung h'(k)= q - (k mod q), cho vài số nguyên tố q N Ngoài ra, N phải số nguyên tố Hơn nữa, ta nên lựa chọn hàm băm thứ hai mà cố găng tối thiểu hoá việc kết nhóm cã thÓ Tham số tải băm lại : Trong tât 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 việc phân tích trung bình đề nghị ta nên trì < 0,5 cho phơng pháp đánh địa mở, nên trì < 0,9 cho phơng pháp mắt xích tách biệt.Thực vậy, nh ta tìm hiểu tập C-8.7 ; vài lợc đồ đánh địa mở bắt đầu tồi tệ 0,5 Mặc dù chi tiết việc phân tích trờng hợp trung bình vợt phạm vi sách này, sở xác suất trực giác Nếu hàm băm ta tốt, ta mong đợi giá trị hàm băm đợc phân bố đồng phạm vi[0, N-1] Do đó, ®Ĩ lu tr÷ n mơc tõ ®iĨn cđa ta, số khoá đợc dự trù nằm bucket sÏ lµ [n/N], mµ sÏ lµ 0(1) nÕu n 0(N) (tức n N) Với phơng pháp mắt xích tách biệt, đợc cho tiến đến 1, xác suất va chạm tiến tới 1, ddiieuf làm tăng chi phí thao tác ta, vậy, ta phải trở lại phơng pháp thời gian tuyến tính, phơng pháp dÃy sở bucket có va chạm Tất nhiên, trờng hợp xấu nhất, hàm băm tồi tệ ánh xạ mục tới bucket, mà kết thi hành thời gian tuyến tính cho tất thao tác từ điển, nhng điều không thờng xuyên xảy Với phơng pháp đánh địa mở, hớng khác, tham số tải lớn dần vợt 0,5 bắt đầu tiến gần đến 1, nhóm liệu mảng bucket củng bắt đầu tăng trởng Các nhóm khiến chiến lợc thăm dò bị tng lên vòng quanh mảng bucket lợng thời gian đáng kể trớc chúng hoàn thành Tại giới hạn này, tiến đến 1, tất từ điển thao tác có thời gian chạy dự trù tuyến tính, trờng hợp này, ta dự kiến gặp số tuyến tính bucket đà đợc chiếm giữ, trớc tìm thấy vài ô trống lại Nh vậy, việc giữ tham số tải dới ngỡng vấn đề sống cho lợc đồ đánh địa mở nh phơng pháp mắt xích tách biệt Nếu tham số tải mọt bảng băm vợt đáng kể so với ngỡng lý thuyết, 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) tất đối tợng đợc chèn vào bảng Quả thực, để bảng băm ta trở nên đầy, vài thực thi, bao gồm ví dụ Java đợc cho đoạn mà 8.1, đổ vỡ Khi băm lại để có bảng mới, điều kiện tất yếu cho kích cỡ bảng phải gấp đôi kích cỡ trớc Một Đồ á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 liệu - Dictionary đà định rõ mảng bucket này, phải xác định hàm băm kèm với (có khả tính toán tham số mới, chẳng hạn nh phơng pháp MAD) Với hàm băm này, chèn trỏ lại mục từ mảng cũ vào mảng sử dụng Quá trình gọi băm lại Ngay với việc băm lại định kỳ, bảng băm phơng tiện có hiệu việc thi hành từ điển không thứ tự Quả thực, luôn gấp đôi kích thớc bảng băm với thao tác băm lại, cóa thể hoàn tất dần lại phí tổn việc băm lại tất phần tử bảng dựa vào thời gian đợc sử dụng để chèn chúng vào vị trí Việc phân tích trình băm lại 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, lần băm lại rải phần tử khắp nơi mảng bucket Nh vậy, trở nên hữu hiệu cho từ điển không thứ tự, bảng băm lựa chọn tốt cho việc thi hành từ điển đà đợc thứ tự IV Bng tra cu Nu mt từ điển xếp có trật tự,ta lưu trữ thành phần dạng vecto S với khố theo thứ tự khơng giảm.Chúng ta rõ s vecto dãy số.Với việc xếp từ khoá véctơ S cho phép tìm kiếm nhanh so với S chưa xếp ví dụ danh sách liên kết.Ta quy định cho việc cài đặt véctơ có thứ tự từ điển d look-up table.Việc cài đặt hồn tồn trái ngược với c dặt log-file,trong sử dụng dãy số khơng xếp vào cài dặt từ điển Không gian yêu câu cho giải thuật O(n) ,cũng giống logfile ,giả sử ta thêm bớt mảng véctơ S để giữ cho tỷ lệ cân thành phần S.Không giống log-file ,việc thực cập nhật look-up table khoảng thời gian đáng kể.Trong trường hợp riêng , việc thực chèn thành phần (k,e) vào look-up table có chi phí thời gian O(n) trường hợp xáu nhất,khi mà ta cần dịch chuyển toàn thành phần tronh vecto với khoá lớn k để tạo nên thành phần (k,e).Tương tợ vậy, việc áp dụng phép toán removeElement(k) removeAllElement (k)s ẽ có chi phí O(n) trường hợp xấu nhất.Và việc cài đặt look-up table hiệu so với log-file trường hợp xấu việc cập nhật.Tuy nhiên ta có thẻ thực giải thuật findElement findAllElement nhanh so với look-up table Tìm kiếm nhị phân : Giải thuật trì hai tham số high low.Mọi thành phần dự tuyển có số thứ tự hàng low cao high.Ban đầu lơ=0 high=n1;Ta đặt key(k) biểu thị khoá hàng thứ i elem(i)là thành phần tương ứng nó.Ta 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 liệu - Dictionary mid=[(low + high)/2] Nếu k= key, ta tìm ,quá trình tìm kiếm kết thúc Nếu kkey ta thực lạiquá trình cũ cách gán high= mid1 Giải thuật Binary Search Đầu vào:Một vecto xếp với n thành phần khoá truy nhập với phương thức key(i) toàn thành phần truy nhập với phương thức elem(i); Đầu ra:Một thành phần S với khoá k số hàng nằm khoảng low and high thành phần tồn tại.hoặc trả 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 k

Ngày đăng: 23/06/2016, 16:03

Từ khóa liên quan

Mục lục

  • a. M¾t xÝch t¸ch biÖt :

Tài liệu cùng người dùng

Tài liệu liên quan