Cây sắp xếp và tìm kiếm

Một phần của tài liệu Một số vấn đề ứng dụng của lý thuyết đồ thị (Trang 48 - 54)

Chương 3: MỘT SỐ VẤN ĐỀ VỀ CÂY

3.2.5. Cây sắp xếp và tìm kiếm

Sắp xếp và tìm kiếm là một trong những vấn đề cơ bản trong kỹ thuật lập trình, cây nhị phân cũng có khá nhiều ứng dụng quan trọng trong vấn đề này. Có thể mô hình hóa việc sắp xếp và tìm kiếm bằng cây từ đó có thể đánh giá các kỹ thuật này từ góc độ về cây.

a) Sắp xếp chèn với tìm kiếm nhị phân

Ý tưởng được bắt đầu như sau, cho một danh sách chưa sắp xếp hãy tìm một phần tử x bất kỳ nào đó trong danh sách, rõ ràng để tìm thì lần lượt

a ?b

a ?c b ?c

b ?c a ?c

c<a<b c<b<a b<c<a

b<a<c

a<c<b a<b<c b<a a<b

c<a a<c c<b b<c

c<b b<c c<a a<c

42

phải xét từng phần tử cho tới khi nào bắt gặp phần tử cần tìm, nếu danh sách lớn thì thời gian tìm rất lâu. Bây giờ với một danh sách đã sắp xếp, chia đôi danh sách và lấy phần tử t ở vị trí chia đôi để so sánh. Nếu t = x thì dừng, nếu t < x vì danh sách đã sắp xếp nên x chỉ có thể nằm bên phải và giảm đi khá nhiều công việc tìm kiếm. Nếu x < t thì tương tự, chỉ việc tìm bên nửa trái,đối với việc tìm kiếm cho lần sau với các danh sách con nửa trái hoặc nửa phải thì thực hiện tương tự như vậy một cách đệ quy.

 Từ những ý tưởng thuật toán, xây dựng cây nhị phân tìm kiếm cho một danh sách như sau:

 Chọn một phần tử bất kỳ làm gốc

 Tất cả các phần tử có giá trị ≤ gốc thì thuộc cây con trái

 Tất cả các phần tử có giá trị > gốc thì thuộc cây con phải

 Đối với các cây con thì cũng có tính chất tương tự như vậy

Ví dụ cây nhị phân tìm kiếm cho danh sách 12, 10, 6, 11, 15, 13, 16, 19, 18 như hình 3.6.

Hình 3.6: Cây nhị phân tìm kiếm

 Sắp xếp chèn bằng việc tìm nhị phân vị trí đúng

Có thể tạm gọi là phương pháp sắp xếp chèn nhị phân.Ý tưởng: Cho trước một danh sách đã sắp xếp A, cần chèn một phần tử mới x vào Asao cho danh sách luôn được sắp xếp. Đầu tiên tìm vị trí đúng của x trong A sau đó chèn x vào đúng vị trí này trong A, khi đó có danh sách A = A {x} luôn được sắp xếp. Để tìm được vị trí đúng cần chèn của x trong A, sử dụng phương pháp tìm kiếm nhị phân, chèn theo cách này gọi là chèn nhị phân.

Ví dụ để sắp xếp B = x1, x2, x3…xn, thực hiện như sau:

12

15 18 10

6 11 13

16 19

43 A:=

For i:= 1 to n do Begin

Tìm vị trí đúng của xi trong A theo phương pháp tìm nhị phân

Chèn xi vào A đúng với vị trí vừa tìm được (A = A {xi}) End;

Kết quả A là danh sách sắp xếp của B.

b) Thuật toán sắp xếp hòa nhập

Giả sử có danh sách chưa được sắp 8, 2, 4, 6, 9, 7, 10, 1, 5, 3 có thể dùng cây nhị phân mô tả quá trình sắp xếp danh sách theo thứ tự tăng dần như sau:

Cây nhị phân với gốc được gán là chính danh sách đó. Các con của gốc được gán theo nguyên tắc: Con bên trái gán nửa danh sách đầu, con bên phải gán nửa danh sách còn lại (danh sách gán ở gốc cây con trái và cây con phải hoặc bằng nhau về số lượng hoặc chênh lệch nhau một phần tử).

Cứ tiếp tục cho tới khi cây nhị phân có mỗi lá được gán một phần tửtrong dãy. Đó là cây như hình 3.7.

Hình 3.7: Cây nhị phân đầy đủ

8, 2, 4, 6, 9, 7, 10, 1, 5, 3

8, 2, 4, 6, 9

7, 10, 1, 5, 3

8, 2, 4 6, 9 7, 10, 1 5, 3

8, 2 4 6 9

8 2

7, 10 1

7 10

5 3

44

Đây là cây nhị phân đầy đủ chưa phải cây sắp xếp của dãy đã cho ở trên.

Hình 3.8: Cây sắp xếp hòa nhập

Để có cây nhị phân sắp xếp của một dãy, trước hết cây được xây dựng tương tự như vậy, mỗi lá tương ứng với mỗi phần tử của dãy. Bước đầu tiên, hai phần tử được hòa nhập vào một danh sách theo thứ tự tăng dần, danh sách tương ứng này như một nút cha, hai phần tử được hòa nhập là nút con. Sau đó tiếp tục hòa nhập các cặp nút tương tự như vậy cho tới toàn bộ danh sách được sắp xếp lại theo thứ tự tăng dần và cây biểu diễn cho dãy là cây nhị phân cân đối được mô tả như hình 3.8.

Các bước thuật toán trên được mô tả trên là đã vận dụng thuật toán hòa nhập hai danh sách đã được sắp xếp thành một danh sách mới được sắp xếp, thuật toán này theo nguyên tắc sau:

 So sánh phần tử bé nhất trong danh sách thứ nhất với phần tử bé nhất trong danh sách thứ hai.

 Quá trình trên được lặp lại cho hai danh sách nhận được ở bước trên.

 Sau một số bước sẽ gặp hai trường hợp sau:

8 2 7 10

2, 8 4 6 9 7, 10 1 5 3

2, 4, 8 6, 9 1,7, 10 3, 5

2, 4, 6, 8,9 1, 3,5, 7, 10

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

45

 Cả hai danh sách trở thành rỗng. Trong trường hợp này, các phần tử có mặt trong danh sách hòa nhập chính là danh sách cần xác định.

 Một danh sách trở thành rỗng, còn danh sách kia khác rỗng. Trong trường hợp này đưa các phần tử còn lại (trong danh sách khác rỗng) nối vào cuối của danh sách hòa nhập.

Độ phức tạp của thuật toán trên là O(nlogn) trong đó n là số phần tử hòa nhập.

c) Thuật toán sắp xếp nhanh

Sắp xếp một danh sách có nhiều thuật toán, mỗi thuật toán đều có những ưu nhược điểm. Trong các thuật toán sắp xếp thì thuật toán sắp xếp nhanh tỏ ra có nhiều ưu điểm được sử dụng phổ biến và rất hiệu quả. Nguyên tắc của thuật toán này có tính đệ quy có thể sử dụng cây nhị phân để mô tả thuật toán này. Thuật toán có thể được mô tả tóm tắt như sau:

Ví dụ để sắp xếp danh sách a1, a2,…, an thuật toán bắt đầu bằng việc lấy ngẫu nhiên một phần tử làm chốt nhưng thường thì phần tử đầu tiên được chọn làm chốt. Như danh sách trên, chọn a1 làm chốt khi đó danh sách được phân đoạn thành hai danh sách con, một danh sách con gồm các phần tử nhỏ hơn a1 cũng theo thứ tự xuất hiện. Sau khi đã có hai danh sách con thì a1 được đặt vào sau cùng của danh sách con gồm các phần tử nhỏ hơn a1, như vậy sau a1 là danh sách con gồm các phần tử lớn hơn a1. Thủ tục này được lặp lại một cách đệ quy cho mỗi danh sách con cho tới khi nào mỗi danh sách con chỉ chứa một phần tử theo thứ tự xuất hiện của nó. Với kết quả này được một danh sách đã được sắp xếp.

Ví dụ cho danh sách: 3, 5, 7, 8, 1, 9, 2, 6. Dùng cây nhị phân biểu diễn thuật toán sắp xếp nhanh để sắp xếp danh sách này như hình 3.9.

46

Hình 3.9: Cây sắp xếp nhanh

Danh sách lúc chưa sắp xếp là gốc, danh sách được sắp xếp là danh sách mà mỗi phần tử của nó là lá của cây.

3, 5, 7, 8, 1, 9, 2, 4, 6

1, 2, 3

5, 7, 8, 9, 4, 6

1 2, 3 4, 5 7, 8, 9, 6

2 3 4 5

a

6, 7 8, 9

8 9

6 7

47

Một phần của tài liệu Một số vấn đề ứng dụng của lý thuyết đồ thị (Trang 48 - 54)

Tải bản đầy đủ (PDF)

(61 trang)