1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Cấu trúc đống và ứng dụng

30 429 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Cấu trúc đống và ứng dụng
Tác giả Nguyễn Thị Ngọc Anh
Trường học Thư Viện Điện Tử Trực Tuyến
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo cáo nghiên cứu khoa học
Định dạng
Số trang 30
Dung lượng 395,07 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cấu trúc đống và ứng dụng

Trang 1

Mục Lục

Phần 1:MỞ ĐẦU 3

I Lí do chọn đề tài 3

Phần 2:Nội Dung 3

Chương 1 : Cơ sở lý thuyết về cây nhị phân 3

I Định nghĩa và các ví dụ 3

1 Định nghĩa 4

2.Ví dụ 4

II Cây nhị phân 5

1 Định nghĩa và các tính chất 5

2 Biểu diễn cây nhị phân 5

Chương 2 Cấu trúc đống 8

I Định nghĩa 8

1.Định nghĩa 8

2 Heap có các tính chất sau : 9

3 Ví dụ : 9

4) Thuật giải 10

II Các phép toán của Heap. 10

1 Thêm một phần tử vào Heap 10

2 Xoá một phần tử nhỏ nhất khỏi Heap 12

Chương 3: Các ứng dụng của Đống 13

I Ứng dụng của Heap trong giải thuật Heap_sort. 13

1.Giải thuật 13

II.Ứng dụng đống tổ chức hàng đợi có ưu tiên 19

1.Ứng dụng của đống trong giải thuật Hufman 19

2.Ứng dụng của đống trong giải thuật xây dựng cây bao trùm nhỏ nhất của đồ thị liên

Trang 2

Chương 4: Mô phỏng và cài đặt cấu trúc đống và ứng dụng 26

I.Mô phỏng thuật toán. 26

1.Khái niệm chung về mô phỏng thuật toán 26

2.Mục đích của mô phỏng thuật toán 26

3.Cấu trúc tổng quan của mô phỏng thuật toán: 27

4 Quy trình thiết kế nhiệm vụ của mô phỏng thuật toán 27

Trang 3

Phần 1:MỞ ĐẦU

I Lí do chọn đề tài

Hiện nay, công nghệ thông tin với tốc độ phát triển rất nhanh Các nhà khoa học

khẳng định rằng chưa có một ngành khoa học - công nghệ nào lại có nhiều ứng dụng

như công nghệ thông tin Việc ứng dụng công nghệ thông tin vào trong giáo dục đã

trở thành mối ưu tiên hàng đầu của nhiều quốc gia trong đó có Việt Nam

Trong quá trình học các giải thuật nói chung và môn cấu trúc dữ liệu nói riêng,

chúng ta rút ra một nhận định chung là: nhiều giải thuật phức tạp trừu tượng, khó hiểu,

khó hình dung vấn đề Do đó chúng ta luôn mong muốn trong quá trình học giải thuật

nên có những mô phỏng trực quan để chúng ta có thể tiếp thu giải thuật một cách dễ

dàng hơn Tuy nhiên, việc học tốt giải thuật có rất nhiều thận lợi dó là giúp cho quá

trình tư duy giải thật tốt hơn, phát hiện vấn đề nhanh hơn, đặc biệt giúp cho việc học

các môn học khác có tính logic cao được thuận lợi hơn Nhưng để học tốt giải thuật thì

không dễ dàng với nhiều người Vậy để giúp người học tiếp thu một cách dễ dàng các

giải thuật thì phải xây dựng các phần mền mô phỏng thuật toán

Cấu trúc đống có rất nhiều ứng vào các giải thuật nhưgiả thuật sắp xếp đống,

vào hàng đợi ưu tiên Nghiên cứu cấu trúc đống để hiểu thêm về nó phục vụ trong việc

giải quyết các bài toán

Phần 2:Nội Dung

Chương 1 : Cơ sở lý thuyết về cây nhị phân

I Định nghĩa và các ví dụ

Trang 4

1 Định nghĩa

Cây là một cấu trúc phi tuyến tính Một cây (tree) là một tập hữu hạn các nút

trong đó có một nút đặc biệt gọi là nút gốc (root), giữa các nút có một mối quan

hệ phân cấp gọi là quan hệ “cha - con”

Có thể định nghĩa cây một cách đệ quy như sau:

2 Nếu T1, T2, , Tn là các cây, với n1, n2, nk lần lượt là các gốc, n là một nút

và n có quan hệ cha - con với n1, n2, nk thì lúc đó một cây mới T sẽ được tạo

lập, với n là gốc của nó n được gọi là cha của n1, n2, nk ; ngược lại n1, n2,

nk được gọi là con của n Các cây T1, T2, ., Tn được gọi là các cây con

(substrees) của n

Ta quy ước : Một cây không có nút nào được gọi là cây rỗng (null tree)

Có nhiều đối tượng có cấu trúc cây

2.Ví dụ

a) Mục lục của một cuốn sách, hoặc một chương trong sách, có cấu trúc cây

b) Biểu thhức số học x + y * (z – t) + u/v, ta có thể biểu diến dưới dạng cây như

hình 1

Trang 5

Hình 1

II Cây nhị phân

1 Định nghĩa và các tính chất

Cây nhị phân là một dạng quan trọng của cấu trúc cây Cây nhị phân có các đặc

điểm là: Mọi nút trên cây chỉ có tối đa là 2 con Đối với cây con của một nút

người ta cũng phân biệt cây con trái (left subtree) và cây con phải (right subtree)

Như vậy cây nhị phân là cây có thứ tự

Ví dụ : Cây ở hình 1 là cây nhị phân với toán tử ứng với gốc, toán hạng 1 ứng

với cây con trái, toán hạng 2 ứng với cây con phải Các cây nhị phân sau đây là

khác nhau, nhưng nếu coi là cây không có thứ tự thì chúng chỉ là 1

2 Biểu diễn cây nhị phân

a) Lưu trữ kế tiếp

Nếu có một cây nhị phân đầy đủ, ta có thể dễ dàng đánh số cho các nút trên cây

đó theo thứ tự lần lượt từ mức 1 trở lên, hết mức này đến mức khác và từ trái

sang phải đối với các nút ở mỗi mức

Ví dụ : Với hình cây f) có thể đánh số như sau :

Trang 6

Hình 2

Ta thấy ngay một quy luật đệ quy trái như sau :

Con của các nút thứ i là các nút thứ 2i và 2i + 1 hoặc

Cha của nút thứ j là j/2

Nếu như vậy thì ta có thể lưu trữ cây nhị phân đầy đủ bằng một vectơ V, theo

nguyên tắc: nút thứ i của cây được lưu trữ ở V[i] Đó chính là cách lưu trữ kế tiếp

đối với cây nhị phân Với cách lưu trữ này nếu biết được địa chỉ nút cha sẽ tính

được địa chỉ nút con và ngược lại

Như vậy với cây đầy đủ nêu trên thì hình ảnh lưu trữ sẽ như sau :

Tất nhiên với cây nhị phân hoàn chỉnh, mà các nút ở mức cuối đều đạt về phía

trái (để việc đánh số các nút này được liên tục ) thì cách lưu trữ này vẫn thích

hợp Còn với cây nhị phân dạng khác thì cách lưu trữ này có thể gây lãng phí do

có nhiều phần tử nhớ bị bỏ trống(ứng với cây con rỗng) Chẳng hạn đối với cây

lệch trái thì phải lưu trữ bằng một véc tơ

Trang 7

Ngoài ra nếu cây luôn biến động nghĩa là có phép bổ sung, loại bỏ các nút

thường xuyên tác động, thì cách lưu trữ này tất không tránh được các nhược

điểm như đã nêu trên

Cách lưu trữ móc nối sau đây vừa khắc phục được nhược điểm này, vừa phản

ánh được dạng tự nhiên của cây

b) Lưu trữ móc nối

Trong cách lưu trữ này, mỗi nút ứng với một phần tử nhớ có quy cách như sau :

Trong đó :

Ví dụ : Cây nhị phân

Hình 3

Trang 8

Cây nhị phân trong hình 3 có dạng lưu trữ móc nối như hình sau :

Hình 4

Để có thể truy nhập vào các nút trên cây cần có một con trỏ T, trỏ tới nút gốc của

cây đó

Người ta quy ước : Nếu cây nhị phân rỗng thì T = Null

Với cách biểu diễn này từ nút cha có thể truy nhập trực tiếp vào nút con, nhưng

ngược lại thì không làm được

Chương 2 Cấu trúc đống

I Định nghĩa

1.Định nghĩa

Đống (Heap) là một cây nhị phân gắn nhãn với các nhãn là các giá trị thuộc tập

hợp được sắp thứ tự tuyến tính, sao cho những điều kiện sau đây được thực hiện:

1.Tất cả các mức của cây đều đầy, trừ mức thấp nhất có thể thiếu một số đỉnh

2.Ở mức thấp nhất, tất cả các lá đều xuất hiện liên tiếp từ bên trái

3 Giá trị ở mỗi đỉnh không lớn hơn giá trị của các đỉnh con của nó

Trang 9

Với điều kiện này thì không đảm bảo Heap là một cây nhị phân tìm kiếm

2 Heap có các tính chất sau :

Tính chất 1 : Nếu ap , a2 , , aq là một Heap thì khi cắt bỏ một số phần tử ở hai

đầu của Heap, dãy con còn lại vẫn là một Heap

Tính chất 2 : Mọi dãy ap , a2 , , aq, dãy con aj, aj+1,…, ar tạo thành một Heap

với j=(q div 2 +1)

3 Ví dụ :

Đống được lưu trong máy bởi một mảng a[1 n], với gốc ở phần tử thứ nhất, con

bên trái của đỉnh a[i] là a[2*i] con bên phải là a[2*i+1] (với 2*i<=n và

2*i+1<=n)

Khi đó nếu như a[i] <= a[2*i] và a[2*i+1] với mọi i = 1 int(n/2) thì trong đống

a[1] (tương ứng là gốc của cây) là phần tử nhỏ nhất

Đây là Heap (Hình 5)

Trang 10

4) Thuật giải

1.Xem mảng ban đầu là một cây nhị phân Mỗi nút trên cây lưu trữ một phần tử

mảng, trong đó a[1] là nút gốc và mỗi nút không là nút lá a[i] có con trái là a[2*i]

và con phải là a[2*i+1] Với cách tổ chức này thì cây nhị phân thu được sẽ có các

nút trong là các nút a[1]…, a[n DIV 2] Tất cả các nút trong đều có hai con,

ngoại trừ nút a[n DIV 2] có thể chỉ có một con trái (trong trường hợp n là một số

chẵn)

2.Sắp xếp dãy ban đầu thành Heap căn cứ vào giá trị khoá của các nút

3.Hoán đổi a[1] cho phần tử cuối cùng

4.Sắp lại cây sau khi đã bỏ đi phần tử cuối cùng để nó trở thành một heap mới

Lặp lại quá trình (3) và (4) cho tới khi cây chỉ còn một nút ta sẽ được mảng sắp

theo thứ tự giảm

II Các phép toán của Heap

1 Thêm một phần tử vào Heap

Để xen một phần tử mới vào Heap, đầu tiên ta thêm một lá mới liền kề với các lá

ở mức thấp nhất, nếu mức thấp nhất chưa đầy; còn nếu mức thấp nhất đầy, thì ta

thêm vào một lá ở mức mới sao cho các điều kiện 1 và 2 của Heap được bảo

tồn.Trong hình 6a dưới sau khi thêm nút lá có giá trị 3 vào mức cuối cùng thì cây

không còn là Heap Nếu sau khi thêm vào lá mới cây không còn là heap, thì ta

theo đường từ lá mới tới gốc cây Nếu một đỉnh có giá trị nhỏ hơn đỉnh cha của

nó, thì ta trao đổi đỉnh đó với cha của nó Sau quá trình biến đổi đó thì ta có một

Heap hình 6c

Trang 11

Hình 6a

Hình 6b

Trang 12

Hình 6c

2 Xoá một phần tử nhỏ nhất khỏi Heap

Sét một Min Heap thì hiển nhiên gốc của cây sẽ có giá trị nhỏ nhất Tuy nhiên

nếu loại bỏ gốc thì cây không còn là cây nữa Do đó ta tiến hành như sau: đặt vào

gốc phần tử của hàng ưu tiên chứa trong lá ngoài cùng bên phải ở mức thấp nhất,

sau đó loại bỏ lá này ra khỏi cây Hình 6a minh hoạ cây nhận được từ cây trong

hình 6 sau phép biến đổi.Tới đây cây không còn là heap vì điều kiện 3 của định

nghĩa Heap bị vi phạm ở gốc cây Bây giờ ta đi từ gốc xuống Giả sử tại một

bước nào đó ta đang ở đỉnh a và hai đỉnh con của nó tại b và c Để xác định, ta

giả sử rằng giá trị ưu tiên của ít nhất hơn giá trị ưu tiên của đỉnh c pri(b) <=

pri(c) Khi đó ta sẽ trao đổi đỉnh a với đỉnh b và đi xuống đỉnh b Quá trình đi sẽ

dừng lại cùng lắm là khi ta đạt tới một lá của cây Có thê thấy quá trình diễn ra ở

hình 7b và 7c

(a)

Trang 13

HeapSort là một giải thuật dựa vào cấu trúc đống và để sắp xếp theo thứ tự giảm

dần của các giá trị khoá là số

Giải thuật Heapsort trải qua 2 giai đoạn :

Trang 14

Giai đoạn 1 :Hiệu chỉnh dãy số ban đầu thành heap;

Giai đoạn 2: Sắp xếp dãy số dựa trên heap:

Bước 1: Ðưa phần tử nhỏ nhất về vị trí đúng ở cuối dãy:

r = n; Hoán vị (a1 , ar );

Bước 2 Loại bỏ phần tử nhỏ nhất ra khỏi heap: r = r-1;

Hiệu chỉnh phần còn lại của dãy từ a1 , a2 ar thành một heap

Bước 3: Nếu r>1 (heap còn phần tử ): Lặp lại Bước 2

Giai đoạn 1: hiệu chỉnh dãy ban đầu thành heap

Việc sắp xếp cây này thành một heap sẽ bắt đầu từ việc đẩy xuống nút a[5] (vì 5=

10 div 2)

Trang 15

Xét nút 5 ta thấy a[5] chỉ có một con trái và giá trị khoá tương ứng của nó lớn

hơn con trái của nó nên ta đổi chỗ hai nút này cho nhau và do con trái của a[5] là

a[10] là một nút lá nên việc đẩy xuống của a[5] là kết thúc

Hình 9

Tiếp theo xét nút a[4] và a[3] đã đúng vị trí nên không phải thực hiện sự hoán đổi

nữa Xét nút a[2], so sánh thấy giá trị a[2] = 6 > a[4] = 2 và a[4] < a[5] = 3 (a[4],

a[5] là con trái và con phải của nút a[2] )nên ta hoán đổi nút a[2] cho nút con trái

của nó là a[4], sau hoán đổi xét thấy nút a[4] vẫn đúng vị trí nên việc đẩy a[2] là

kết thúc

Hình 10

Cuối cùng ta xét nút a[1], ta thấy giá trị khoá của nút a[1] = 5 lớn hơn khoá của

con trái ( a[2] = 2) và giá trị khoá của con trái bằng giá trị khoá của con phải (

a[2] = 2, a[3] = 2) nên hoán đổi a[1] cho nút con trái của nó là nút a[2] Sau khi

Trang 16

thực hiện phép hoán đổi thấy nút a[2] có giá trị khoá lớn hơn giá trị khoá của nút

con con phải cua nó là a[5] và con phải của nó có giá trị nhỏ hơn khoá của con

trái nên phải thực hiên phép hoán đổi nút a[2] cho nút a[5] Xét lại thấy nút a[5]

thì nó vẫn đúng vị trí Tương tự xét tiếp các nút còn lại thấy đã dúng vị trí nên

cuối cùng được cây đã là một heap

Cây đã là một heap (Hình 11)

Giai đoạn 2: Sắp xếp dãy số dựa trên heap :

Trong giai đoạn thứ hai, chúng ta thấy rằng gốc của cây (cũng là phần tử đầu tiên

của mảng hay cũng là đỉnh heap) là phần tử có khoá nhỏ nhất Vị trí đứng cuối

cùng của phần tử này là ở cuối mảng Như vậy chúng ta sẽ di chuyển phần tử này

về cuối mảng, sau khi thực hiện phép biến đổi này thì một khoá trong mảng đã

vào đúng vị trí của nó trong sắp xếp Nếu không kể khoá nhỏ nhất này thì phần

còn lại của mảng ứng với cây nhị phân hoàn chỉnh sẽ không còn là đống nữa, ta

lại phải thực hiện lại phép vun đống cho cây và lại thực hiện tiếp việc đổi chỗ

cho khoá ở đỉnh đống với khoá ở đáy đống Cho đến khi cây chỉ còn một nút

thì các khoá đã được sắp xếp vào đúng vị trí của nó

Cụ thể với Heap ở trên

Trang 17

Từ heap ở trên, hoán đổi giá trị của a[1] =2 với a[10] = 12 ta đã có a[10] = 2 là

giá trị nhỏ nhất vào đúng vị trí Cắt bỏ nút a[10] ra khỏi cây, như vậy phần cuối

cùng của mản chỉ gồm một phần tử a[10] đã được sắp

Hình 12

Sau khi thực hiện hoán đổi cây không còn là heap thực hiện việc vun đống đổi

vị trí của a[1] về đúng vị trí ta có đống mới

Hình 13

Tiếp tục hoán đổi giá trị a[1] với a[9] ta đã sắp được a[9] = 2 vào đúng vị trí

trong mảng Cắt bỏ nút a[9] ra khỏi cây, như vậy phần cuối cùng của mảng gồm

hai phần tử a[9], a[10] đã được sắp

Trang 19

Hình 16

II.Ứng dụng đống tổ chức hàng đợi có ưu tiên

1.Ứng dụng của đống trong giải thuật Hufman

a) Giới thiệu về thuật toán Huffman:

-Trong khoa học máy tính và lý thuyết thông tin, mã Hufffman là một thuật toán

mã hoá dùng để nén dữ liệu Nó dựa trên bảng tần suất xuất hieenk các kí tự cần

mã hoá để xây dựng bộ một bộ ã nhị phân cho các kí tự đó sao cho dung lượng

(số bít) sau khi mã hoá là nhỏ nhất

- Thuật toán được đề xuất bởi Đavi A.Huffman khi ông còn là sinh viên Ph.D.tại

MIT, và công b ố năm 1952 trong bài báo “ A Methord for the Construction of

Minimum- Redundancy Codes” Sau này Huffman đã trở thành một giảng viên ở

MIT và sau đó ở khoa Khoa học máy tính của Đại học California, Santa Cruz,

Trường Ký nghệ Baskin

- Mã Huffman là một mã tiền tố Sau đây là khái niệm về mã tiền tố:

b) Mã tiền tố (prefix-free binary code)

- Khi mã hoá một tài liệu có thể không sử dụng đến tát cả 256 kí hiệu Hơn nữa

trong tài liệu chữ cái “a” chỉ có thể xuất hiện 1000000 lần còn chữ cái “A” có thể

chỉ xuất hiện 2, 3 lần Như vậy ta có thể không cần dùng đủ 8 bít để mã hoá ký

hiệu, hơn nữa độ dài (số bít) dành cho mỗi kí hiệu có thể khác nhau, kí hiệu nào

Trang 20

xuất hiện nhiều lần thì nên dùng số bit ít, ký hiệu nào xuất hiện ít thì có thể mã

hía bằng từ mã dài hơn Như vậy ta có việc mã hoá với độ dài thay đổi Tuy

nhiên, nếu mã hóa với độ dài thay đổi, khi giải mã ta làm thế nào phân biệt được

xâu bít nào là mã hoá của kí hiệu nào Một trong các giải pháp là dùng các dấu

phẩy (“,”) hoặc một kí hiệu quy ước nào đó để tách từ mã của các ký tự đứng

cạnh nhau Nhưng như thế số các dấu phẩy sẽ chiếm một khoảng đáng kể trong

bản mã Một cách giải quyết khác dẫn đến khái niệm mã tiền tố

- Mã tiền tố là bộ các từ mã của một tập hợp các kí hiệu sao cho từ mã của mỗi

ký hiệu không là tiền tố ( phần đầu) của từ mã một ký hiệu khác trong bộ mã ấy

- Đương nhiên mã hoá với độ dài không đổi là mã tiền tố

- Ví dụ : Giả sử mã hoá từ “HONGHAI”, tập các ký hiệu cần mã hoá gồm 6 chữ

cái “H”,”O”,”N”,”G”,”A”,”I”

-Nếu mã hoá cho một chữ cái chẳng hạn “H”=00, “O”= 01, “N” =

100,”G”=101,”A”=110,”I”=111 Khi đó mã hoá của cả từ là

000110010100110111 Để giải mã ta đọc bit và đối chiếu với bảng mã

-Nếu mã hoá “H”=0, “O”=01, “N” = 100,”G”=101,”A”=110,”I”=111 thì bộ từ

mã này không là mã tiền tố vì từ mã của “H” là tiền tố của từ mã của “O” Để mã

hoá cả từ HONGHAI phải đặt dấu ngăn cách vào giữa các từ mã

0,01,100,101,110,111

Nếu mã hoá “H”=00, “O”= 01, “N” = 100,”G”=101,”A”=110,”I”=111 thì bộ mã

này là tiền tố Với bộ mã tiền tố này khi mã hoá xâu “HONGHAI” ta có

000110010100110111

Biểu diễn mã tiền tố trên cây nhị phân:

Ngày đăng: 27/04/2013, 21:02

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w