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

Post on 23-Jan-2017

184 Views

Category:

Environment

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Priority Queue

Meaningful Transitions

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.

`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.

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

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)

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)

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.

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

Cài đặt Priority Queue

Cài đặt Priority Queue

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).

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

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]

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.

Tree Heap

3

9

8 9

9

610

1610

5

Min-Heap

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

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)

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

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.

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

RemoveMin3

5

9

8 9

9

6 10

1610

Min Heap

Demo

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.

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ỗ.

Insert3

5

9

8 9

9

6 10

1610 4

Min Heap

Demo

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).

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) .

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.

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

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.

Ứ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.

Thank you!

Question & Answer

top related