1. Trang chủ
  2. » Thể loại khác

Tài liệu môn học - Application of Algo. chapter07

61 117 0

Đ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

Tài liệu môn học - Application of Algo. chapter07 tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn v...

Cấu trúc liệu nâng cao Ứng dụng Khoa Công Nghệ Thông Tin, Trường Đại Học Thủy Lợi Ngày tháng năm 2017 / 61 Nội dung Hàng đợi ưu tiên Tập rời rạc Ứng dụng Thuật toán Dijkstra Thuật toán Kruskal Thuật toán Prim / 61 Hàng đợi ưu tiên Cấu trúc liệu lưu trữ tập phần tử mà phần tử liên kết với khóa thao tác sau: Chèn phần tử Trả phần tử với khóa nhỏ Trả phần tử với khóa nhỏ loại bỏ phần tử khỏi hàng đợi Giảm khóa phần tử Ứng dụng Thuật tốn Dijkstra để tìm đường ngắn đồ thị Thuật tốn Prim để tìm bao trùm nhỏ đồ thị Sắp xếp đống / 61 Đống nhị phân Cây nhị phân hồn thiện Tất cấp độ, trừ phần tử cuối cùng, điền đầy đủ Nếu cấp độ cuối không điền đầy đủ, nút cấp độ điền từ trái qua phải Thuộc tính đống Khóa nút nhỏ khóa nút Phần tử nhỏ gốc Đống (Heap) với n phần tử có chiều cao logn / 61 Đống nhị phân - Cài đặt Sử dụng mảng x[1 n] parent(x[i]) = x[(i)/2] leftChild(x[i]) = x[2i] rightChild(x[i]) = x[2i + 1] Chèn, Giảm-Khóa, Lấy-ra-phần-tử-nhỏ-nhất: O(logn) Tìm-phần-tử-nhỏ-nhất: O(1) / 61 Đống nhị phân - Cài đặt Algorithm 1: Heapify(x[1 n], k) t ← x[k]; while k < n c ← × k; if c < n ∧ x[c + 1] < x[c] then c ← c + 1; if c < n ∧ t > x[c] then x[k] ← x[c]; else BREAK; k ← c; x[k] ← t; / 61 Đống nhị phân - Cài đặt Algorithm 2: BuildMinHeap(x[1 n]) k ← n/2; while k > Heapify(x[1 n], k); k ← k − 1; / 61 Đống nhị phân - Cài đặt Algorithm 3: ExtractMin(x[1 n]) if n=0 then return NULL; r ← x[1]; x[1] ← x[n]; n ← n − 1; Heapify(x[1 n], 1); return r ; / 61 Đống nhị phân - Cài đặt Algorithm 4: DecreaseKey(x[1 n], k) t ← x[k]; while k > p ← k/2; if t < x[p] then x[k] ← x[p]; else BREAK; k ← p; x[k] ← t; / 61 Đống nhị phân - Cài đặt package week12 ; import java util *; public class MinHeap < AnyType extends Comparable < AnyType > > { private int sz ; private AnyType [] arr ; // elements are indexed from , , ( not private HashMap < AnyType , Integer > mapIndex ; // map an element to its public MinHeap () { sz = 0; arr = ( AnyType []) new Comparable [10]; mapIndex = new HashMap < AnyType , Integer >(); } public MinHeap ( AnyType [] L ) { sz = L length ; arr = ( AnyType []) new Comparable [ L length + 1]; System arraycopy (L , , arr , , L length ); for ( int i = 1; i rank(y ) then p(y ) ← x; else p(x) ← y ; if rank(x) = rank(y ) then rank(y ) ← rank(y ) + 1; 53 / 61 Tập rời rạc - Cài đặt package week12 ; import java util HashMap ; import java util Iterator ; import java util List ; class IElement { int rank ; T parent ; IElement ( T parent , int rank ) { this parent = parent ; this rank = rank ; } } public class DisjointSet { private HashMap map = new HashMap < >(); public void makeSet ( T e ) { map put (e , new IElement ( e , 0)); } } 54 / 61 Tập rời rạc - Cài đặt public T find ( T e ) { IElement ie = map get ( e ); if ( ie == null ) return null ; if ( e != ie parent ) ie parent = find ( ie parent ); return ie parent ; } public void union ( T x , T y ) { if ( x == y ) return ; T X = find ( x ); T Y = find ( y ); if ( X == null || Y == null || X == Y ) return ; IElement iX = map get ( X ); IElement iY = map get ( Y ); if ( iX rank > iY rank ) iY parent = x ; else { iX parent = y ; if ( iX rank == iY rank ) iY rank ++; } } 9 } 55 / 61 Thuật toán Dijkstra - Cài đặt package week13 ; import import import import import java io File ; java io PrintWriter ; java util HashMap ; java util HashSet ; java util Scanner ; import week12 MinHeap ; import week12 Node ; public class Dijkstra { private HashSet < Node > V ; private HashMap < Node , HashSet < Arc > > A ; } 56 / 61 Thuật toán Dijkstra - Cài đặt public void findPath ( Node s , Node t ){ MinHeap < Node > H = new MinHeap < Node >(); s key = 0; for ( Arc a : A get ( s )){ Node v = a v ; v key = a w ; H insert ( v ); } HashSet < Node > fixed = new HashSet < Node >(); fixed add ( s ); while ( true ){ Node u = H deleteMin (); fixed add ( u ); if ( u == t ) break ; for ( Arc a : A get ( u )){ if (! fixed contains ( a v ) && a v key > u key + a w ){ a v key = u key + a w ; if (! H contains ( a v )) H insert ( a v ); else H decreaseKey ( a v ); } } } System out println ( " Shortest distance = " + t key ); } 9 } 57 / 61 Thuật toán Kruskal - Cài đặt package week13 ; import import import import import java io File ; java util ArrayList ; java util HashMap ; java util Scanner ; java util HashSet ; import week12 DisjointSet ; import week12 MinHeap ; import week12 Node ; public class Kruskal { HashSet < Node > V ; Edge [] E ; } 58 / 61 Thuật toán Kruskal - Cài đặt public void findMST (){ MinHeap H = new MinHeap (); H sort ( E ); DisjointSet < Node > DS = new DisjointSet < Node >(); for ( Node v : V ) DS makeSet ( v ); int W = 0; HashSet < Edge > T = new HashSet < Edge >(); for ( int i = 0; i < E length ; i ++){ if ( DS find ( E [ i ] u ) == DS find ( E [ i ] v )) continue ; T add ( E [ i ]); W += E [ i ] w ; DS union ( E [ i ] u , E [ i ] v ); if ( T size () == V size () - 1) break ; } System out println ( " W = " + W ); } } 59 / 61 Thuật toán Prim - Cài đặt package week13 ; import import import import import java io File ; java io PrintWriter ; java util HashMap ; java util HashSet ; java util Scanner ; import week12 MinHeap ; import week12 Node ; public class Prim { private HashSet < Node > V ; private HashMap < Node , HashSet < Arc > > A ; } 60 / 61 9 Thuật toán Prim - Cài đặt public void findMST ( Node s , Node t ){ MinHeap < Node > H = new MinHeap < Node >(); s key = 0; for ( Arc a : A get ( s )){ Node v = a v ; v key = a w ; H insert ( v ); } HashSet < Node > fixed = new HashSet < Node >(); fixed add ( s ); int W = 0; while ( true ){ Node u = H deleteMin (); W += u key ; fixed add ( u ); if ( u == t ) break ; for ( Arc a : A get ( u )){ if (! fixed contains ( a v ) && a v key > a w ){ a v key = a w ; if (! H contains ( a v )) H insert ( a v ); else H decreaseKey ( a v ); } } } } 61 / 61 ... nhị phân - Cài đặt Sử dụng mảng x[1 n] parent(x[i]) = x[(i)/2] leftChild(x[i]) = x[2i] rightChild(x[i]) = x[2i + 1] Chèn, Giảm-Khóa, Lấy-ra-phần-tử-nhỏ-nhất: O(logn) Tìm-phần-tử-nhỏ-nhất: O(1)... buildHeap (); for ( int i = sz ; i > 0; i - -) { swap (i ,1); sz - -; heapify (1); } for ( int k = 0; k < arr length - 1; k ++) L [ k ] = arr [ arr length - - k ]; } public boolean contains ( AnyType... Fibonacci - Cài đặt thao tác ExtractMin: Củng cố - bước 28 / 61 Đống Fibonacci - Cài đặt thao tác ExtractMin: Củng cố - bước 29 / 61 Đống Fibonacci - Cài đặt thao tác ExtractMin: Củng cố - bước

Ngày đăng: 21/12/2017, 11:07

Xem thêm:

TỪ KHÓA LIÊN QUAN

Mục lục

    Hàng i u tiên

TÀI LIỆU CÙNG NGƯỜI DÙNG

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

TÀI LIỆU LIÊN QUAN