đ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 1DANH SÁCH THÀNH VIÊN
Trang 2MỤ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 3LỜ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 4CHƯƠ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 5có 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 8Tấ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 9III 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 10CHƯƠ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 11Ngượ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 12else 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 14Sau đâ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 162 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 19Write(‘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: