cấu trúc dữ liệu và giải thuật lý thuyết neu

259 251 0
cấu trúc dữ liệu và giải thuật lý thuyết neu

Đ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

Bộ mơn: Cấu trúc liệu giải thuật Ch¬ng cấu trúc liệu kiểu Đồ thị ( Graph ) Trong chơng nghiên cứu loại cấu trúc phi tuyến Cây trờng hợp đặc biệt loại cấu trúc liệu tổng quát ,đó đồ thị( Graph) Trong chơng này, nghiên cứu hai loại đồ thị đồ thị có hớng đồ thị vô hớng 6.1 Đồ thị có hớng 254 6.1.1 Khái niệm §å thÞ cã híng ( Directed graph ) gåm mét tập hợp hữu hạn phần tử gọi nút hay đỉnh, với tập hợp hữu hạn cạnh có hớng nối cặp đỉnh với Chẳng hạn cho đồ thị sau đây: 255 Đồ thị gồm nút đợc đánh số 1,2,3,4,5 cạnh nối nút từ ®Õn 2, ®Õn 4, ®Õn 5, ®Õn 4, ®Õn chÝnh nã,4 ®Õn 2, vµ đến Cây coi trờng hợp đặc biệt đồ thị có h256 ớng đợc đặc trng tính chất nút, nút gốc,không có cạnh hớng đến nó, tất nút lại đạt đến từ nút gốc đờng Nghĩa ,chỉ theo dãy cạnh liên tiếp Đồ thị có nút "gần giống nh nút gốc" ( Không có cạnh hớng đến nó) nút 1, nhng có nhiều đờng khác tõ nót ®Õn nót VÝ dơ: 1 3 1 3 257 1 2 3 Sau ví dụ khác đồ thị: Trong trờng hợp ta có đờng nh sau:  1  1  258 Đồ thị có nhiều ứng dụng thực tiễn Đồ thị có hớng đợc dùng để thiết kế,phân tích sơ đồ mạng điện, biểu diễn đờng găng trình tự thực hạng mục công trình xây dựng Ví dụ : Đồ thị có hớng biểu diễn trình lập kế hoạch sản xuất doanh nghiệp 259 3.1 3.2 3.3 Đặ t mục tiêu kếhoạch Nghiên cứu thịtr ờng Đ ánh giá tiềmnăng danh nghiệp 3.1 Lao đ ộng 3.2 Khả tài 3.3 Năng lực sản xuất Xâ y dựng chỉtiêu kếhoạch Thực kếhoạch Trong sơ đồ hình chữ nhật biểu diễn công đoạn qui trình lập kế hoạch ,bắt đầu từ công đoạn tiền kế hoạch nghiên cứu thị trờng đến công đoạn 260 cuối thực kế hoạch 6.1.2 Phơng pháp cài đặt đồ thị có hớng Một phơng pháp thông dụng để cài đặt đồ thị sử dụng ma trận kề ( Adjacency matrix) Để xây dựng ma trận kề ,trớc hết đánh số nút đồ thị có hớng 1,2,2 n Ma trận kề ma trận Adj bậc n x n thành phần hàng i, cột j có giá trị có cạnh từ i đến j ,và có giá trị o khác 261 Ví dụ : Cho đồ thị có hớng sau đây: B A E C D Ta cã ma trËn kÒ : 262 Adj = 1 0 0 0 0 0 Để xác định giá trị A,B,C nút sử dụng thªm mét ma trËn Data chØ gåm mét cét chøa giá trị , liệu nút thứ i đợc lu trữ Data[i] Nh có hai mảng : 263 - Địa rải khoá đa vào trùng vơí địa rải khoá cũ ( ta tạm gọi khóa diện) khoá thuộc danh sách với khoá diện Phép tìm kiếm danh sách tơng ứng đợc thực Nếu danh sách có khoá khoá đa vào: phép tìm kiếm đợc thoả Nếu phải chọn nút trống miền V làm nút chứa khoá bổ sung nút vaò danh sách xét: việc lu trữ khoá xong Địa rải khoá đa vào không trùng với địa rải khoá diện Nh khoá diện phanà tử danh sách móc nối ứng với điạ rải khác Ta phải tìm chỗ trống khác để chuyển sang lấy lại chỗ cho khoá Công việc rõ ràng đơn giản Ta phải chép nội dung cđa c¸c trêng ë nót cò sang nót míi mà phải sửa mối nối nút nút trớc trỏ tới nút cũ thành mối nối trỏ tới nút chuyển Dĩ nhiên phải tìm đợc nút trỏ tới nũt cũ Để tìm ngợc vòng Còn nối thẳng phải tính lại địa rải khoá diện theo lần qua nút danh sách mà tìm đến nút cần thiết Hình vẽ dới ( Hình ) minh ho¹ kü thuËt mãc nèi trong, øng víi d·y kho¸ 221, 634, 512, 326, 495, 108, 069 nhng thứ tự đa vào thay đổi chút nh sau: 498 221 643 512 326 069 495 108 đây, giả sử tìm chỗ trống miền V ta lần ngợc từ dới lên Nhng khó khăn xuất việc chuyển khoá cũ để lấy chỗ cho khoá cần đợc xem xét để khắc phục, nhng ta không tiếp tục sâu thêm 499 V0 V1 V2 V3 V4 V5 V6 V7 512 512 221 221 643 643 326 a -Khi khoá đầu đợc đa b - Khi thêm khoá 326 vào 512 221 069 643 326 c - Khi thêm khoá 069 500 512 Chun 069 lªn 221 069 643 326 d - Khi thêm khoá 495 512 069 108 221 495 643 326 e - Khi thêm khoá 108 Hình 8.2 8.4.4 Phân tích dánh giá phơng pháp [2,8 ] Trở lại ví dụ minh hoạ phơng pháp thử tuyến tính nêu 10.7.3 a) ta thấy: để thực lu trữ nh tìm kiếm khoá dãy 10.7 ta phải tiến hành tổng cộng 12 phép thử Có trờng hợp đa khoá vào, chẳng hạn khoá 495 ta phải thực tới phép thử liên tiếp xảy đụng độ Có vấn đề đặt ra: khoá đợc đa vào ( để lu trữ tìm kiếm) số phép thử phải thực có nhiều không? (vì ảnh hởng tới thời gian thực phơng pháp) Nó phụ thuộc vào điều kiện gì? Thực điều ta mong muốn là: tính trung bình , số phép thử 501 phải nhỏ Lập luận xác suất sau xác nhận thật nhỏ Ta xét vào phơng pháp thử ngẫu nhiên Ta giả thiết khoá xuất đồng khả hàm rải H(k) phân bố chúng (ngẫu nhiên) bảng rải Nếu thêm khoá vào bảng có kích thớc m chứa sẵn k đối tợng xác suất tìm thấy vị trí trống lần Đó xác suất p1: cần phép thử ( phép so sánh) Xác suất để cần phÐp thư thø hai sÏ b»ng x¸c st cđa mét đụng lần thứ nhân với xác suất gặp vị trí trống lần tiếp theo, nghĩa P2 = t¬ng tù ta sÏ cã p3 = P(i)= VËy kỳ vọng số phép thử cần thiết đa thêm vào khoá thứ k +1 Ek+1 = .+ (k+1) = Vì số phép thử cần thiết đa khoá vào lữu trữ đồng với số phép thử cần thiết tìm kiếm nó, nên kết đợc dùng để tính số trung bình E phép thử cần thiết để truy nhập vào khoá ngẫu nhiên bảng rải 502 Vẫn ký hiệu m kích thớc bảng n số khoá có bảng Ta sÏ cã E= = (Hm+1 – Hm-n+1) Hm = + hàm điều hoà Hm tính xấp xØ: Hm  ln (m) +  víi  lµ h»ng sè Euler ( = 0,577216) NÕu ta thay = , ta đợc E= = Nh coi nh xấp xỉ (thơng số vị trí bị chiếm giữ vị trí vốn có) đợc gọi hệ số tải ( load factor) Nh kỳ vọng số ghép thử phụ thuộc vào hệ số tải Bảng liệt kê sau cho thấy giá trị E tơng ứng với giá trị cđa  (b¶ng A) E  0.10 1.05 0.25 1.15 0.50 1.39 0.75 1.39 0.90 2.56 0.95 3.15 0.99 4.66 Bảng A Ta thấy bảng đầy tới 90%, tính trung bình cần 2.56 phép thử để đa 503 khoá vào lu trữ vị trí trống tìm đợc khoá cho Sự phân tích tơng tự cho biết kết sau ( bảng B) phép thủ tuyến tính: 0.10 0.25 0.50 0.75 0.90 0.95 E 1.06 1.17 1.50 2.50 5.50 10.50 Bảng B E= Còn phơng pháp móc nối thì: E có giá trị bảng C E = 1+  0.10 0.25 0.50 0.75 0.90 0.95 E 1.05 1.12 1.25 1.37 1.45 1.47 B¶ng C Các kết chứng tỏ tìm kiếm phơng pháp biến đổi khoá tốt Điều khiến ta yên tâm sử dụng phơng pháp 504 8.5 Phơng pháp tìm kiếm sở Dùng bảng băm ( Hash tables) Trong giải thuật xét việc định vị phần tử đợc xác định sỏ dãy so sánh.Trong trờng hợp ,phần tử cần tìm đợc so sánh nhiều lần với phần tử vị trí khác cấu trúc liệu tốc độ thực giải thuật chậm Một cấu trúc liệu giúp cho việc tìm kiếm nhanh ,đó bảng băm(Hash Tables) Trong cấu trúc vị trí phần tử đợc xác định trực tiếp hàm dãy so sánh Thời gian cần thiết để định vị mục bảng băm trờng hợp tốt nhÊt lµ O(1) nghÜa lµ nã lµ mét h»ng sè không phụ thuộc vào số lợng phần tử đợc lu trữ Nội dung phơng pháp nh sau: Bằng qui tắc biến đổi từ giá trị khoá ta tính địa tơng đối Địa dùng để lu trữ ghi tơng ứng đồng thời để tìm kiếm ghi Có nghĩa thiết lập ánh xạ tập giá trị khoá tìm kiếm lên tập địa tơng đối Để minh hoạ ta xét ví dụ sau Giả sử ta cần lu trữ 25 số nguyên đoạn 999 bảng băm Có thể cài đặt bảng băm mảng Table số nguyên đợc đánh số đoạn 999 phần tử mảng đợc khởi động giá trị đó, 505 chẳng hạn Khi ta dùng số nguyên I tập hợp làm số nghĩa ta lu trữ I Table[i] ta định vị số nguyên Number cho trớc cách kiểm tra Table[Number] = Number hay không.Hàm H định nghĩa H(i) = I xác định vị trí phần tử I bảng băm đợc gọi hàm băm ( Hash Function) ( Có thể dùng hàm H(i) = I mod 25 ví dụ đây, trờng hợp mảng Table đợc đánh số đoạn 24) Dới xét ứng dụng bảng băm Ta xét toán kiểm tra tính hợp lệ định danh ngời dùng mật mạng máy tính.Các số liệu đợc lu trữ bảng băm Các định danh ngời dùng đợc mã hoá nh số nguyên cách cộng mã số ASCII ký tự tạo nên chúng Chơng trình nh sau [1]: Program ValidateUser2 ; Const StringLength = ; TableSize = 13; MaxIndex =12; Type String = Packed array[ StringLength] Of char; UserRecord = Record Id, Password : String; End; ElementType = UserRecord; UserNode = Record; 506 Data : ElementType; Next : Chain; end; IndexRange =0 MaxIndex; HashTable = Array[ IndexRange]Of chain; Var UsersFile : text; UserRec : UserRecord; UserTable : HashTable; Found, Done : boolean; Loc : IndexRange; LocPtr : Chain; Procedure Initialize ( Var Table : HashTable ); (* Khởi động bảng băm : đặt tất phần tử Nil*) Var I : IndexRange; Begin (* Initialize * ) For I : = to MaxIndex Table[i] : = nil ; End(* Initialize* ); Function Hash ( Str : String; StrLength, TableSize : integer ): IndexRange; (* Hàm băm -xâu ký tự Str đợc mã hoá nh số nguyên cách cộng c¸c m· ASCII cđa c¸c ký tù cđa nã*) Var 507 Sum :integer; I : StringLength; Begin (* Hash*) Sum : = 0; For I : =1 to StrLength Sum : = Sum + ord ( Str[i] ); Hash : = Sum mod TableSize ; End ( *Hash* ); Procedure Search ( Table : HashTable; Item : ElementType; Var Loc : IndexRange; AR Found : boolean; Var LocPtr : Chain ); (* Thủ tục tìm ghi ngời dùng Bảng băm*) Begin (* Search* ) Loc : = Hash( Item.Id, StringLength , TableSize ); LocPtr : = Table[Loc]; Found : = false; While Not Found And ( LocPtr < > NIL ) If LocPtr ^ Data.Id = Item.Id then Found : = true Else LocPtr : = LocPtr ^ Next; End (* Search * ); Procedure Insert ( Var Table : HashTable; Item : ElementType ); (* Thđ tơc chÌn b¶n ghi cđa ngêi dùng vào bảng băm*) 508 Var Loc : IndexRange; LocPtr : Chain; Found : boolean; Begin (* Insert* ) Search ( Table, Item , Loc , Found, LocPtr ); If Found then writeln Else Begin new ( LocPtr ); LocPtr ^.Data : = Item; LocPtr ^ Next : = Table[Loc]; Table[Loc] : = LocPtr ; End (* ELSE* ); End (* Insert* ); Procedure ReadString ( Var TextFile : text; Var Str : String; MaxString : integer); (* Thđ tơc đọc ký tự vào biến Str từ TextFile *) Var I : integer; Begin (* ReadString* ) For I : = to MaxString If Not eoln ( TextFile ) then read ( TextFile, Str[i] ) Else Str [I]: = ‘ ‘; readln ( TextFile ) ; 509 End (* ReadString* ); Procedure Login ( Var UserRec : UserRecord; StringLength : integer; Var Done : boolean); (* Thñ tục đọc định danh ngời dùng mật khÈu*) Const QuitSignal = ‘ Quit ‘; Begin (* Login* ) write ( Định danh ngời dùng); ReadString ( input, UserRec.Id, StringLength ); If UserRec.Id = QuitSignal Then Done : = true Else Begin Done : = false; write (‘ MËt*khÈu’); ReadString ( input, UserRec Password, StringLength) ; End (* Else * ); End ( *Login* ); Begin (* Ch¬ng tr×nh chÝnh*) assign ( UserFile, ‘UsersFiler ‘); reset ( UsersFile ); Initialize ( UserTable ); While Not eof ( UsersFile ) Begin ReadString ( UsersFile, UserRec.Id, StringLength ); 510 ReadString ( UsersFile, UserRec Password, StringLength ); Insert ( UserTable, UserRec); End (* While* ); Login ( UserRec, Loc, StringLength, Done); While Not Done Begin Search ( UserTable, UserRec, Found, LocPtr ); If Found then If LocPtr ^ Data.Password = UserRec Password then writeln (‘ Ngêi dïng h¬pl lƯ’) Else writeln ( Mật*khẩu không hợp lệ) Else writeln (Định danh không hợp lệ) writeln; Login ( UserRec, StringLength, Done); End (* While* ); End Trên xem xét số giải thuật tìm kiếm xếp theo khoá Đây vấn đề thờng gặp việc giải toán thực tiễn, lĩnh vực kinh tế.Vì lĩnh vực kinh tế thờng phải xử khối lợng thông tin lớn, việc xếp tìm kiếm có vai trò to lớn giúp cho việc giải toán cách hiệu 511 _ C©u hỏi ôn tập chơng - Trình bày khái niệm tìm kiếm theo khoá ? - Cho dãy số sau : 22 34 11 56 67 90 13 92 94 18 Minh hoạ bớc tìm kiếm phần tử 67 sử dụng phơng pháp : a - Tìm kiếm b - Tìm kiếm nhị phân c - Tìm kiếm theo khoá - Trình bày phơng pháp chia để xác định địa hàm rải - Trình bày phơng pháp nhân để xác định địa hàm rải - Trình bày phơng pháp phân đoạn để xác định địa hàm rải - Trình bày nội dụng phơng pháp địa mở để khắc phục đụng độ ? Cho ví dụ minh hoạ ? - Trình bày nội dụng phơng pháp móc nối dây chuyền ? Cho ví dụ minh hoạ ? - Phân tích đánh giá phơng pháp tìm kiếm ? 512 ... ArrayOfPointer; of 6.1.3 Các giải thuật xử lý danh sách kề Để xây dựng danh sách kề cho đồ thị có hớng phải thực giải thuật xử lý danh sách kề Giải thuật thiết lập danh sách kề 269 Gải thuật thiết lập danh... liệu nút vào trờng liệu V[i]^.Data nút đầu - Với nút kề với nút i ( Có hớng từ i ra) thực bớc sau đây: a Đọc số nút b Chèn số vào danh sách liên kết nút kề đợc V[i]^.Next 270 cách dùng giải thuật. .. kề với V thực bớc sau đây: if ( W cha đợc thăm) then a Thăm W b Thêm W vào hàng đợi Giải thuật quét đồ thị có hớng Giải thuật sau thực việc quét đồ thị có hớng ,thăm mõi nút lần dựa sở tìm kiếm

Ngày đăng: 30/05/2018, 22:04

Từ khóa liên quan

Mục lục

  • Giải thuật tìm theo chiều sâu

    • Dùng ma trận kề

    • Dùng danh sách kề

    • Dùng danh sách các cạnh

    • Sắp sếp - SORTING

      • Số hiệu hoá đơn

      • Procedure Comparison - Counting;

      • Phân tích phương pháp đếm

        • Giải thuật như sau :

        • Procedure Straight - Selection - Sort

        • Phân tích phương pháp chọn trực tiếp

          • Ví dụ

          • Phân tích phương pháp Bubblesort và Shakersort

          • Procedure Shell _ Sort

          • Procedure Partition ;

          • Procedure Quick Sort ;

          • Procedure Merge _ Sort ;

          • Phân tích giải thuật tìm kiếm tuần tự [8]

            • X = 73 < K6

            • Giá trị khoá Địa chỉ

            • Giá trị khóa Địa chỉ

              • 8.4.3 các phương pháp Khắc phục đụng độ

                • Hình 8.2

                • Câu hỏi ôn tập chương 8

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

  • Đang cập nhật ...

Tài liệu liên quan