thuyết trình cây nhị phân

33
Priority Queue

Upload: sad-rain

Post on 23-Jan-2017

181 views

Category:

Environment


0 download

TRANSCRIPT

Page 1: Thuyết trình Cây  Nhị Phân

Priority Queue

Page 2: Thuyết trình Cây  Nhị Phân

Meaningful Transitions

Page 3: Thuyết trình Cây  Nhị Phân

Khái niệm Queue

Hàng đợi (Queue) là một cấu trúc dữ liệu dùng

để chứa các đối tượng làmviệc theo cơ chế FIFO (First In First Out) Việc thêm một đối tượng luôn diễn ra ở cuối

hàng đợi và một phần tử luôn được lấy ra từ đầu

hàng đợi.

Page 4: Thuyết trình Cây  Nhị Phân

`QueueVí dụ:

Hàng đợi (Queue) là một cấu trúc dữ liệu dùng

để chứa các đối tượng làmviệc theo cơ chế FIFO (First In First Out) Việc thêm một đối tượng luôn diễn ra ở cuối

hàng đợi và một phần tử luôn được lấy ra từ đầu

hàng đợi.

Page 5: Thuyết trình Cây  Nhị Phân

Thao tác trên QueueTrên Queue có các thao tác sau:

Thêm phần tử vào cuối Queue (Push)

Xóa phần tử đầu Queue (Pop)

Front

Rear

Page 6: Thuyết trình Cây  Nhị Phân

Thao tác trên Queue Thêm phần tử vào cuối Queue (Push)

Xóa phần tử đầu Queue (Pop)

Page 7: Thuyết trình Cây  Nhị Phân

Xây dựng Queue

Nếu xây dựng Queue bằng mảng thì sẽ nhận thấy rằng: - Khi xoá một phần tử front tăng lên 1, khi thêm một phần tử rear tăng lên 1,đến một lúc nào đó ta không thể thêm vào hàng được nữa (rear=maxlength-1) dù mảng còn nhiều chỗ trống (các vị trí trước front)

→Trường hợp này ta gọi là hàng bị tràn Để khắc phục điều này chúng ta có thể coi mảng đó như 1 mảng với các phân tử được xếp vòng tròn để việc push và pop dễ dàng hơn.

Queue Circular (Hàng đợi vòng)

Page 8: Thuyết trình Cây  Nhị Phân

Khái niệm Priority Queue Hàng đợi ưu tiên (Priority Queue) là một kiểu dữ liệu trừu tượng tập hợp đặc biệt, trong đó mỗi phần tử có một độ ưu tiên nào đó. Hàng đợi ưu tiên là cấu trúc dữ liệu tổng hợp của stack và queue. Hàng đợi ưu tiên không theo cơ chế FIFO. Độ ưu tiên của phần tử thường là một số, theo đó, phần tử có độ ưu tiên nhỏ nhất sẽ được ‘ưu tiên’ nhất. Ví dụ tại bệnh viện, các bệnh nhân xếp hàng để chờ phục vụ nhưng không phải người đến trước thì được phục vụ trước mà họ có độ ưu tiên theo tình trạng khẩn cấp của bệnh.

Page 9: Thuyết trình Cây  Nhị Phân

Priority Queue Mỗi nút gồm:

+Value (Giá trị)+ Priority (Độ ưu tiên)

Chẳng hạn:

Ta thấy rằng: nút có độ ưu tiên cao nhất sẽ được lấy ra trước trong queue

Page 10: Thuyết trình Cây  Nhị Phân

Cài đặt Priority Queue

Page 11: Thuyết trình Cây  Nhị Phân

Cài đặt Priority Queue

Page 12: Thuyết trình Cây  Nhị Phân

Cài đặt Priority Queue

Ta không thể cài đặt Priority Queue bằng bảng băm vì bảng băm không thuận lợi trong việc tìm kiếm phần tử nhỏ nhất

→ Nên cách cài đặt Priority Queue khá thuận lợi đó là cài đặt bằng cây có thứ tự từng phần (Tree Heap).

Page 13: Thuyết trình Cây  Nhị Phân

Cây cài đặt bằng mảngNút mẹ thứ i gồm:

Nút con bên trái: = 2*i + 1Nút con bên phải: = 2*i + 2

Nút mẹ cuối cùng trong cây: (n-1)/2 với n là số lượng phần tử Giả sử ta có nút thứ i trong mảng:

-> Nút mẹ của nút này là (i-1)/2 Các nút mẹ trong cây: từ i=0-> (n-1)/2

Page 14: Thuyết trình Cây  Nhị Phân

Cây cài đặt bằng mảngVí dụ về cây cài bằng mảng:

A[0]

A[9]

A[4]A[5]

A[2]

A[3]A[6]

A[8]A[7]

A[1]

A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

Page 15: Thuyết trình Cây  Nhị Phân

Tree Heap

Định nghĩa cây có thứ tự từng phần ( Tree heap)Cây có thứ tự từng phần là cây nhị phân mà giá trị tại mỗi nút mẹ có 1 quan hệ thứ tự nào đó với 2 nút con của nó.Có 2 loại cây heap thường dùng: Max-Heap , Min-Heap

Max-Heap: cây nhị phân mà giá trị tại mỗi nút mẹ đều lớn hơn hoặc bằng giá trị của hai con. Min-Heap: cây nhị phân mà giá trị tại mỗi nút mẹ đều nhỏ hơn hoặc bằng giá trị của hai con.

Page 16: Thuyết trình Cây  Nhị Phân

Tree Heap

3

9

8 9

9

610

1610

5

Min-Heap

Page 17: Thuyết trình Cây  Nhị Phân

Nhận xét

Trên cây có thứ tự từng phần, nút gốc là nút có giá trị nhỏ nhất

Từ nhận xét này, ta thấy có thể sử dụng cây có thứ tự từng phần để cài đặt hàng đợi ưu tiên

Trong đó mỗi phần tử được biểu diễn bởi một nút trên cây mà độ ưu tiên của phần tử là giá trị của nút

Page 18: Thuyết trình Cây  Nhị Phân

Các thao tác trên Tree Heap

Vì Tree Heap dùng để biểu diễn Priority Queue nên sẽ có các thao tác tương tự Queue:-Tìm phần tử lớn nhất/nhỏ nhất (Find Min/Max)- Xóa phần tử đầu tiên của cây (RemoveMiin)- Thêm phần tử vào cuối cây (Insert)

Page 19: Thuyết trình Cây  Nhị Phân

Find Min3

9

8 9

9

610

1610

5

Min-HeapDễ dàng nhận thấy rằng Nút gốc của cây chính là

Max/ Min

Page 20: Thuyết trình Cây  Nhị Phân

RemoveChiến lược: Xét cây Min-HeapLấy nút lá tại mức cao nhất và nằm bên phải nhất thay thế cho nút gốc.

  Như vậy cây vẫn "cân bằng" nhưng nó không còn đảm bảo tính thứ tự từng phần.

Để xây dựng lại cây từng phần ta thực hiện việc "đẩy nút này xuống dưới".

Tức là ta đổi chổ nó với nút con nhỏ nhất của nó, nếu nút con này có độ ưu tiên nhỏ hơn nó.

Đây là 1 quá trình đệ quy. Quá trình đó sẽ dừng khi đã nổi lên đến nút gốc hoặc cây thỏa mãn tính chất có thứ tự từng phần.

Page 21: Thuyết trình Cây  Nhị Phân

RemoveMinGiải thuật: Xét cây Min-Heap Bước 1: Ta thay thế nút gốc bằng nút lá cuối cùng

trong cây

Bước 2: Ta xét từ nút gốc:Nếu giá trị nút trái nhỏ hơn nút phải và nhỏ hơn

cả nút gốc thì ta đổi chỗ nút trái với nút gốc.Nếu giá trị nút phải nhỏ hơn nút trái và nhỏ hơn

cả nút gốc thì ta đổi chỗ nút phải với nút gốc.

Bước 3:Sau khi đẩy nút gốc xuống một con nào đó (trái hoặc phải) thì

phải tiếp tục xét con đó xem có phải đẩy xuống nữa hay không ?Quá trình đẩy xuống sẽ kết thúc khi đã đẩy đến nút là

hoặc cây thỏa mãn tính chất có thứ tự từng phần

Page 22: Thuyết trình Cây  Nhị Phân

RemoveMin3

5

9

8 9

9

6 10

1610

Min Heap

Demo

Page 23: Thuyết trình Cây  Nhị Phân

InsertChiến lược:Để thêm một phần tử vào cây ta bắt đầu bằng việc tạo một nút lá mới nằm ở mức cao nhất.

Nếu tất cả các lá ở mức cao nhất đều đang có mặt thì ta thêm nút mới vào bên trái nhất ở mức mới.

-> Khi này cây bị mất đi tính chất thứ tự toàn phần

Tiếp đó ta cho nút này "nổi dần lên" bằng cách đổi chổ nó với nút mẹ của nó nếu nút mẹ có độ ưu tiên nhỏ hơn.

Đây cũng là 1 quá trình đệ quy. Quá trình đó sẽ dừng khi đã nổi lên đến nút gốc hoặc cây thỏa mãn tính chất có thứ tự từng phần.

Page 24: Thuyết trình Cây  Nhị Phân

Insert

Thuật toán: Xét với Min-Heap Bước 1:

Ta thêm nút cần thêm vào cây ở mức cuối cùng của cây.

Bước 2:Ta so sánh nút này với nút mẹ của nó:

Nếu giá trị nút này nhỏ hơn nút mẹ thì đổi chỗ 2 nút.

Ngược lại thì kết thúc vì cây đã thỏa thứ tự toàn phần.

Bước 3:Nếu như đổi chỗ 2 nút ta phải xét tiếp nút mẹ vừa đổi.Xét lại Bước 2 với Nút mẹ vừa đổi chỗ.

Page 25: Thuyết trình Cây  Nhị Phân

Insert3

5

9

8 9

9

6 10

1610 4

Min Heap

Demo

Page 26: Thuyết trình Cây  Nhị Phân

Xây dựng Tree Heap

Để việc xây dựng được hiệu quả, ta phải cố gắng sao cho cây tương đối ‘cân bằng’. Mọi nút trung gian (trừ nút là cha của nút lá) đều có hai conĐối với các nút mẹ của nút là có thể chỉ có một con và trong trường hợp đó ta quy ước là con trái (không có con phải).

Page 27: Thuyết trình Cây  Nhị Phân

Xây dựng Tree HeapCó 2 cách xây dựng Tree Heap:

Rebuild (Xây dựng từ một cây khác không có thứ tự). Build (Xây dựng trực tiếp từ mảng giá trị cho trước) .

Page 28: Thuyết trình Cây  Nhị Phân

Xây dựng Tree Heap

Build: Đầu tiên: ta khởi tạo cây rỗngSau đó: Ta áp dụng thuật toán Insert để thêm từng nút vào

cây.ReBuild:

Ta phải xây dựng cây hiện tại sao cho cây đó có thứ tự toàn phần.

Ta cần phải xét từ nút mẹ thứ 0 => nút mẹ cuối cùng (n-1)/2.

Page 29: Thuyết trình Cây  Nhị Phân

Heap Sort Chiến lược: Dựa vào tính chất Tree Heap để sắp xếp lại mảng.

Nhận xét ta thấy rằng: + Nút gốc của min-Heap sẽ nhỏ nhất trong cây. + Nếu ta lấy nút gốc ra và đưa vào 1 mảng mới ta

sẽ được phần tử nhỏ nhấtVậy ta lại lấy phần tử nhỏ tiếp theo khi đã loại bỏ

phần tử nhỏ nhất khỏi cây đưa vào mảng mới ta sẽ được mảng đc sắp xếp tăng dần

Page 30: Thuyết trình Cây  Nhị Phân

Heap Sort

Thuật toán:

+Bước 1: Ta xây dựng Tree Heap từ mảng ban đầu.(Rebuild hoặc Build)+Bước 2: Ta lấy phần tử nút gốc ra khỏi cây (Phần tử a[0])

+Để lấy phần tử nút gốc ra khỏi cây ta chỉ cần đổi chỗ nút gốc vs nút là cuối cùng ( Đổi chỗ a[0] với a[n-1])+Bước 3:

Ta xây dựng lại cây với n-1 phần tử.Ta áp dụng thuật toán RemoveMin để cân bằng lại cây

Lặp lại bước 2 khi vẫn còn phần tử trong mảng.Sau khi kết thúc:Ta thấy rằng mảng sẽ được sắp xếp giảm dần.

Page 31: Thuyết trình Cây  Nhị Phân

Ứng dụng Priority Queue

Ứng dụng– Quản lý băng thông- Thuật toán Huffman- Thuật toán Dijkstra là một thuật toán giải quyết bài toán đường đi ngắn nhất dùng trong công nghệ Hệ thống định vị toàn cầu (GPS)- Dùng các bài toán có nhiều lựa chọn để xét độ ưu tiên để đạt hiểu quá tối ưu nhất.

Page 32: Thuyết trình Cây  Nhị Phân

Thank you!

Page 33: Thuyết trình Cây  Nhị Phân

Question & Answer