1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận Cấu trúc dữ liệu và giải thuật Đề tài:

30 3,4K 8

Đ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

Định dạng
Số trang 30
Dung lượng 131,92 KB

Nội dung

điều đó cũng được thể hiện trong các bài toán tin học như tìm xem trong dãy số đã cho có số nào bằng một giá trị X cho trước hay không...?. Tìm kiếm trên danh sách lại chia thành 2 loại

Trang 1

DANH SÁCH THÀNH VIÊN

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU 3

CHƯƠNG I: GIỚI THIỆU VÀ PHÁT BIỂU ĐỀ TÀI 4

I Phát biểu đề tài 4

II Phạm vi, đối tượng nghiên cứu 4

III Mục đích của bài luận 9

CHƯƠNG II: NỘI DUNG ĐỀ TÀI 10

I Tìm kiếm tuần tự 10

1 Ý tưởng giải thuật 10

2 Giải thuật 10

3 Phân tích và đánh giá độ phức tạp của giải thuật 12

4 Ví dụ minh họa 14

II Tìm kiếm nhị phân 15

1 Ý tưởng giải thuật 15

2 Giải thuật 16

3 Độ phức tạp của giải thuật 20

4 Ví dụ minh họa 20

III Tìm kiếm trên cây nhị phân tìm kiếm 21

1 Khái niệm cây nhị phân tìm kiếm 21

2 Ý tưởng giải thuật 22

3 Giải thuật 22

4 Phân tích và đánh giá độ phức tạp 24

5 Ví dụ minh họa 25

CHƯƠNG III: ĐÁNH GIÁ KẾT QUẢ NGHIÊN CỨU VÀ KẾT LUẬN 28

I Đánh giá kết quả nghiên cứu 28

II Kết luận 29

TÀI LIỆU THAM KHẢO 30

Trang 3

LỜI NÓI ĐẦU

Ngày nay, khi ngành công nghệ thông tin ngày càng phát triển, khoa học máy tínhkhông ngừng vươn tới những tìm tòi mới mẻ hơn Mọi người chủ yếu làm việc dựa trênmáy móc và thiết bị điện tử thì các phần mềm ứng dụng lại càng trở nên quan trọng vàhữu ích hơn bao giờ hết Tất cả thông tin muốn biết, muốn tìm hiểu, bạn đều có thể tìmđược trên Internet thông qua các công cụ tìm kiếm Các công cụ tìm kiếm đó được xâydựng từ các phần mềm tìm kiếm khác nhau Và những chương trình tìm kiếm chúng tôi

đề cập đến trong tiểu luận này gồm:

 Tìm kiếm tuần tự

 Tìm kiếm nhị phân

 Tìm kiếm trên cây nhị phân tìm kiếm

Trang 4

CHƯƠNG I: GIỚI THIỆU VÀ PHÁT BIỂU ĐỀ TÀI

I Phát biểu đề tài

Trong cuộc sống hàng ngày của chúng ta, việc tìm kiếm là không thể thiếu chẳng hạnnhư việc tìm một cuốn sách trên giá sách, một mặt hàng để mua, một người bạn trênfacebook, điều đó cũng được thể hiện trong các bài toán tin học như tìm xem trong dãy

số đã cho có số nào bằng một giá trị X cho trước hay không ?

Bài toán tìm kiếm có thể phát biểu như sau: Cho một bảng gồm n bản ghi R1, R2,

R3, , Rn Mỗi bản ghi Ri (1 ≤ i ≤ n) có một khóa Ki tương ứng Hãy tìm bản ghi có giá trịkhóa tương ứng bằng X cho trước?

X được gọi là khóa tìm kiếm hay đối trị tìm kiếm Quá trình tìm kiếm sẽ kết thúc khixảy ra một trong hai trường hợp sau:

- Trường hợp 1: Tìm được bản ghi có giá trị khóa tương ứng bằng X, khi đó ta nói

phép tìm kiếm được thỏa (tìm thấy).

- Trương hợp 2: Không tìm được bản ghi nào có giá trị khóa tương ứng bằng X cả,

khi đó ta nói phép tìm kiếm không thỏa (không tìm thấy) Khi phép tìm kiếm không thỏa

thường xuất hiện yêu cầu bổ sung thêm bản ghi mới có khóa bằng X vào, giải thuật thể

hiện yêu cầu này được gọi là “Tìm kiếm có bổ sung”.

Ở đây, ta xét các phương pháp tìm kiếm phổ biến thực hiện tìm kiếm trên dữ liệu

được lưu trữ ở bộ nhớ trong mà ta gọi là tìm kiếm trong Không giảm tính tổng quát, trong

các giải thuật ta chỉ xét việc tìm kiếm các khóa đại diện cho các bản ghi tương ứng

II Phạm vi, đối tượng nghiên cứu

Trước hết, chúng ta cần hiểu “giải thuật tìm kiếm” là gì? Trong ngành khoa học máytính, một giải thuật tìm kiếm là một thuật toán lấy đầu vào là một bài toán và trả về kếtquả là một lời giải cho bài toán đó, thường là sau khi cân nhắc giữa một loạt các lời giải

có thể Hầu hết các thuật toán được nghiên cứu bởi các nhà khoa học máy tính để giảiquyết các bài toán đều là các thuật toán tìm kiếm Có 3 loại tìm kiếm là: tìm kiếm không

Trang 5

có thông tin, tìm kiếm có thông tin và tìm kiếm đối kháng Trong đây, ta chỉ đề cập đếntìm kiếm không có thông tin Tìm kiếm không có thông tin bao gồm : tìm kiếm trên danhsách và tìm kiếm trên cây Tìm kiếm trên danh sách lại chia thành 2 loại : Tìm kiếm tuyếntính (hay còn gọi là tìm kiếm tuần tự), tìm kiếm nhị phân, tìm kiếm nội suy, bảng bămnhưng chúng ta chỉ xét tìm kiếm tuần tự và tìm kiếm nhị phân.

a) Tìm kiếm tuần tự: Tìm kiếm tuần tự (tiếng Anh Sequential search) hay tìm kiếm

tuyến tính (tiếng Anh linear search) là một phương pháp tìm kiếm một phần tử cho trướctrong một danh sách bằng cách duyệt lần lượt từng phần tử của danh sách đó cho đến lúctìm thấy giá trị mong muốn hay đã duyệt qua toàn bộ danh sách Nó có thời gian chạy khálớn: O(n), trong đó n là số phần tử trong danh sách, nhưng có thể sử dụng thẳng cho mộtdanh sách bất kỳ mà không cần tiền xử lý

b) Tìm kiếm nhị phân

Thuật toán tìm kiếm nhị phân dùng để tìm kiếm phần tử trong một danh sách đã đượcsắp xếp, ví dụ như trong một danh bạ điện thoại sắp xếp theo tên, có thể tìm kiếm số điệnthoại của một người theo tên người đó

Thuật toán tìm kiếm nhị phân chạy nhanh hơn tìm kiếm tuần tự nhưng cũng có một sốnhược điểm Tìm kiếm nhị phân có thể chậm hơn bảng băm Nếu nội dung danh sách bịthay đổi thì danh sách phải được sắp xếp lại trước khi sử dụng tìm kiếm nhị phân Thaotác này thường tốn nhiều thời gian

Thời gian thực thi: Sau mỗi phép so sánh, số lượng phần tử trong danh sách cần xétgiảm đi một nửa Thuật toán kết thúc khi số lượng phần tử còn không quá 1 Vì vậy thờigian thực thi của thuật toán là O(log2n)

c) Tìm kiếm trên cây trên cây nhị phân tìm kiếm

 Cây: Trong khoa học máy tính, cây là một cấu trúc dữ liệu được sử dụng rộng rãigồm một tập hợp các nút (tiếng Anh: node) được liên kết với nhau theo quan hệ cha - con.Cây trong cấu trúc dữ liệu đầu tiên là mô phỏng (hay nói cách khác là sự sao chép) củacây (có gốc) trong lý thuyết đồ thị Hầu như mọi khái niệm trong cây của lý thuyết đồ thị

Trang 6

đều được thể hiện trong cấu trúc dữ liệu Tuy nhiên cây trong cấu trúc dữ liệu đã tìm đượcứng dụng phong phú và hiệu quả trong nhiều giải thuật Khi phân tích các giải thuật trêncấu trúc dữ liệu cây, người ta vẫn thường vẽ ra các cây tương ứng trong lý thuyết đồ thị.

 Các nút:

o Nút gốc : Trong mỗi cây có một nút đặc biệt được gọi là nút gốc (hay nói đơn giản

là gốc) Nút gốc là nút duy nhất không có nút cha Nút gốc là nơi khởi đầu của nhiều giảithuật trên cây Tất cả các nút khác được nối về nút gốc bằng một đường đi qua các cạnhhay các liên kết

o Nút lá : Các nút không có nút con được gọi là nút lá (lá)

o Các nút trong : nút trong của một cây là nút trên cây có ít nhất một con, nghĩa là cácnút không phải là lá Các khái niệm về mức của mỗi nút, chiều cao của cây được địnhnghĩa giống như cây trong lý thuyết đồ thị

 Cây con: Một cây con là một bộ phận của cấu trúc dữ liệu cây mà tự nó cũng làmột cây Một nút bất kỳ trong cây T, cùng với các nút dưới nó tạo thành một cây con củaT

 Cây trong lý thuyết đồ thị: Trong lý thuyết đồ thị, một cây là một đồ thị liên thông

và không có chu trình Cây như vậy còn được gọi là cây tự do

 Cây sắp thứ tự: Có hai dạng cấu trúc cơ sở của cây là cây không thứ tự và cây cóthứ tự Một cây không thứ tự là cây có cấu trúc cây, trong đó giữa các con của một nút,không có thứ tự nào Một cây, trong đó các con của một nút tuân theo một thứ tự xác địnhđược gọi là cây có thứ tự Cây tìm kiếm nhị phân là một cây sắp thứ tự điển hình

 Cây tổng quát và cây nhị phân: Các cây trong đó mỗi nút có thể có nhiều hơn haicon được gọi là cây tổng quát, các cây trong đó mỗi nút có không quá hai con được gọi làcây nhị phân

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

Trang 7

• Cây tìm kiếm ứng với n khóa k1,k2, kn là cây nhị phân mà mỗi nút đều được gánmột khóa sao cho với mỗi mỗi nút k:

o Mọi khóa trên cây con trái đều nhỏ hơn khóa trên nút k

o Mọi khóa trên cây con phải đều lớn hơn khóa trên nút k

• Cây tìm kiếm nhị phân là một cấu trúc dữ liệu cơ bản được sử dụng để xây dựngcác cấu trúc dữ liệu trừu tượng hơn như các tập hợp, đa tập hợp, các dãy kết hợp

 Duyệt cây nhị phân:

Khi xét một cây nhị phân, mỗi đỉnh cùng với các đỉnh đứng sau nó là gốc của một câycon Ta xét một đỉnh A là đỉnh trong của cây nhị phân Theo thứ tự người ta xem xét thứ

tự thăm đỉnh A so với việc thăm hai con của nó là thăm A trước rồi 2 con sau, thăm A xengiữa việc thăm hai con, thăm A sau khi thăm hai con:

A, con trái, con phải

Con trái, A, con phải

Con trái, con phải, A

Trang 8

Tất nhiên nút không có con nào thì việc thăm con không diễn ra Còn nếu con L hoặccon R của A lại là gốc của một cây con, thì việc thăm thay bằng việc duyệt cây con gốctại đó.

Từ đó có các phương pháp duyệt tiền thứ tự, trung thứ tự, hậu thứ tự đối với cây nhịphân có gốc tại đỉnh A như sau:

- Duyệt tiền thứ tự cây con gốc A

Nếu Cây là rỗng: Return

Thăm A

Duyệt tiền thứ tự cây con gốc L

Duyệt tiền thứ tự cây con gốc R

- Duyệt trung thứ tự cây con gốc A

Nếu Cây là rỗng: Return

Thăm A

Duyệt trung thứ tự cây con gốc L

Thăm A

Duyệt trung thứ tự cây con gốc R

- Duyệt hậu thứ tự cây con gốc A

Nếu cây là rỗng: Return

Duyệt hậu thứ tự cây con gốc L

Duyệt hậu thứ tự cây con gốc R

Thăm A

Trang 9

III Mục đích của bài luận

 Xác định ý tưởng ban đầu của giải thuật

 Viết giải thuật

 Nêu lên độ phức tạp của giải thuật

 Nêu ví dụ minh họa

Trang 10

CHƯƠNG II: NỘI DUNG ĐỀ TÀI

I Tìm ki m tu n t ếm tuần tự ần tự ự

1 Ý tưởng giải thuật

Trong Khoa học máy tính tìm kiếm tuần tự (tiếng Anh Sequential search) hay tìmkiếm tuyến tính (tiếng Anh linear search) là một phương pháp tìm kiếm một phần tử chotrước trong một danh sách bằng cách duyệt lần lượt từng phần tử của danh sách đó chođến lúc tìm thấy giá trị mong muốn hay đã duyệt qua toàn bộ danh sách

Ý tưởng thuật toán:

Xét dãy số cần tìm có n phần tử: k1, k2, k3, , kn Giá trị cần tìm là X

- Bắt đầu từ khoá đầu tiên, lần lượt so sánh khoá X với khoá tương ứng trong dãy

- Quá trình tìm kiếm kết thúc khi tìm được khoá thoả mãn hoặc đi đến hết dãy hoặcgặp điều kiện dừng vòng lặp

2 Giải thuật

Thuật toán tiến hành so sánh x lần lượt với phần tử thứ nhất, thứ hai, của mảng Acho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy X

Các bước thực hiện giải thuật

Bước 1: i = 1;// Bắt đầu phần tử đầu tiên của dãy

Bước 2: So sánh k[i] với X, có 2 khả năng:

+ k[i] = X: Tìm thấy Dừng

+ k[i] ≠ X: Sang bước 3

Bước 3: i = i+1; //xét phần tử kế tiếp trong mảng

Nếu i > N: Hết mảng, không tìm thấy Dừng

Trang 11

Ngược lại: Lặp lại Bước 2.

Cài đặt giải thuật

① {nhập dãy khóa k là mảng A với số phần tử n}

Procedure NhapDayKhoa(Var A: Array[1 100] of Integer; var n: Integer);

(2) {Thực hiện tìm kiếm trong dãy khóa}

While ((i <= n) and (k[i] <> 1)) do i:= i+1;

(3) {Trả ra chỉ số i nếu tìm thấy, nếu không tìm thấy thì chỉ ra giá trị 0 Kết thúc}

If i > n then return(0)

Trang 12

else return(i);

Nhận xét:

Trong cài đặt trên đây, nhận thấy mỗi lần lặp của vòng lặp while phải tiến hành kiểm tra 2 điều kiện (i < n) - điều kiện biên của mảng - và (k[i] <> X) - điều kiện kiểm tra chính Nhưng thật sự chỉ cần kiểm tra điều kiện chính (k[i] <> X) Để cải tiến cài đặt có thể dùng phương pháp "lính canh" - đặt thêm 1 phần tử có giá trị X vào cuối mảng, như vậy bảo đảm luôn tìm thấy X trong mảng, sau đó dưạ vào vị trí tìm thấy để kết luận

Ta có thể tiến hành cải tiến cài đặt bằng phương pháp “lính canh” như sau:

(2) {Thực hiện tìm kiếm trong dãy khóa}

While k[i] <> X do i:=i+1;

(3) {Trả ra chỉ số i nếu tìm thấy, nếu không tìm thấy thì trả ra giá trị 0 Kết thúc}

If i < n+1 then return(i);

Else return(0);

3 Phân tích và đánh giá độ phức tạp của giải thuật

Sau đây ta sẽ phân tích độ phức tạp của hai thuật toán đã nêu ở trên và đánh giá độ phức tạp bằng cách đếm số phép so sánh

Thuật toán ban đầu

- Trường hợp tốt nhất khi phần tử đầu tiên của mảng có giá trị bằng X:

Số phép gán: Gmin = 1

Trang 13

Thuật toán cải tiến

- Trường hợp tốt nhất khi phần tử đầu tiên của mảng có giá trị bằng X:

Trang 14

Sau đây, ta sẽ minh họa giải thuật tìm kiếm tuần tự qua ví dụ sau:

Cho dãy khóa:

Tìm X = 2 và X = 10?

- Với X = 2, ta thực hiện các bước tìm kiếm như sau:

+ So sánh X với 12: X ≠ 12 => Chuyển sang khóa tiếp theo i = 2

+ So sánh X với 8: X ≠ 8 => Chuyển sang khóa tiếp theo i = 3

+ So sánh X với 2: X = 2 => Tìm kiếm được thỏa, trả về kết quả chỉ số i = 3

=> Khóa có giá trị bằng X nằm ở vị trí thứ 3 trong dãy khóa

- Với X = 10, ta thực hiện các bước tìm kiếm như sau:

+ So sánh X với 12: X ≠ 12 => Chuyển sang khóa tiếp theo i = 2

+ So sánh X với 8: X ≠ 8 => Chuyển sang khóa tiếp theo i = 3

+ So sánh X với 2: X ≠ 2 => Chuyển sang khóa tiếp theo i = 4

+ So sánh X với 14: X ≠ 14 => Chuyển sang khóa tiếp theo i = 5

+ So sánh X với 3: X ≠ 3 => Chuyển sang khóa tiếp theo i = 6

+ So sánh X với 5: X ≠ 5 => Chuyển sang khóa tiếp theo i = 7

+ So sánh X với 20: X ≠ 20 => Chuyển sang khóa tiếp theo i = 8

Trang 15

+ So sánh X với 11: X ≠ 11 => Chuyển sang khóa tiếp theo i = 9.

+ So sánh X với 30: X ≠ 30 => Chuyển sang khóa tiếp theo i = 10

+ So sánh X với 28: X ≠ 28 => Chuyển sang khóa tiếp theo i = 11, nhưng n = 10

< 11 => Tìm kiếm không được thỏa

=> Không tìm thấy khóa có giá trị bằng X

II Tìm kiếm nhị phân

1 Ý tưởng giải thuật

Thuật toán tìm kiếm tuần tự tỏ ra đơn giản và thuận tiện trong trường hợp số phần tửcủa dãy không lớn lắm Tuy nhiên, khi số phần tử của dãy khá lớn, chẳng hạn chúng tacần tìm một từ nào đó trong từ điển hay tìm kiếm tên một khách hàng nào đó trong danh

bạ điện thoại của một thành phố lớn thì thực hiện thuật toán tìm kiếm tuần tự quả thựcmất rất nhiều thời gian Trong thực tế, thông thường các phần tử của dãy đã có một thứ tự,

do vậy thuật toán tìm nhị phân sau đây sẽ rút ngắn đáng kể thời gian tìm kiếm trên dãy đã

có thứ tự Ta vẫn quy ước dãy khóa đã được sắp xếp theo chiều tăng dần đối với giá trị số

và thứ tự từ điển với các giá trị ký tự Khóa được lấy ra để so sánh với khóa tìm kiếm luônluôn chọn khóa “ở giữa” dãy khóa đang xét Giả sử dãy khóa đang xét là kl, kl+1, ,kr thìkhóa “ở giữa” dãy sẽ là km với m =⌊eq¿(l+ r , 2) ⌋(nghĩa là phép toán (l+r) div 2)

Đầu tiên, ta xét dãy khóa ban đầu kl, kl+1, , kr

So sánh giá trị X với giá trị phần tử giữa của dãy là km, xảy ra 3 trường hợp sau:

 Nếu X = km thì phép tìm kiếm được thỏa, khi đó đưa ra chỉ số m tương ứng

 Nếu X < km, phép tìm kiếm sẽ được thực hiện tiếp với dãy ở trước khóa km là kl,

Trang 16

2 Giải thuật

Với ý tưởng của giải thuật như trên, sau đây ta đi cài đặt giải thuật dưới hai dạng:dạng đệ quy và dạng không đệ quy (dạng lặp)

a Giải thuật ở dạng đệ quy

Các bước thực hiện giải thuật:

B1: Nhập vào một dãy khóa đã được sắp xếp

B2: If (l > r)

B2.1: Không tìm thấy

B2.2: Thực hiện bước kế tiếp

B3: Tính chỉ số giữa m theo công thức: m = ⌊eq¿(l+ r , 2) ⌋

Cài đặt giải thuật:

① {nhập dãy khóa k là mảng A với số phần tử n}

Procedure NhapDayKhoa(Var A: Array[1 100] of Integer; var n: Integer);

Trang 17

{Dãy khóa k gồm n khóa đã được sắp xếp theo chiều tăng dần, trong giải thuật sửdụng các biến l, r, m – tương ứng là chỉ số dưới, chỉ số trên và chỉ số giữa của dãy khóa

đang xét (ban đầu l = 1, r = n); trong giải thuật sử dụng thêm một biến vitri để đưa ra chỉ

số của khóa tương ứng nếu tìm thấy, nếu không tìm thấy thì vitri có giá trị 0}

Phân tích thuật toán đệ quy:

- Trường hợp tốt nhất khi phần tử ở giữa của mảng có giá trị bằng X:

Trang 18

Các bước thực hiện giải thuật

Cài đặt giải thuật

{nhập dãy khóa k là mảng A với số phần tử n}

Trang 19

Write(‘Nhap phan tu thu ‘,i); readln(A[i]);

End;

End;

② Function TKNF_LAP(k,n,X);

{Cho dãy khóa k gồm n khóa đã được sắp xếp theo chiều tăng dần, trong giải thuật

sử dụng các biến l, r, m – tương ứng là chỉ số dưới, chỉ số trên và chỉ số giữa của dãykhóa đang xét (ban đầu l = 1, r = n); trong giải thuật sử dụng thêm một biến vitri để đưa rachỉ số của khóa tương ứng nếu tìm thấy, nếu không tìm thấy thì vitri có giá trị 0}

Phân tích thuật toán lặp

- Trường hợp tốt nhất khi phần tử ở giữa của mảng có giá trị bằng X:

Ngày đăng: 05/05/2016, 10:12

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w