Và đối với bộ môn tin họccũng vậy, trong công tác Bồi dưỡng học sinh giỏi tin học, các đề thi thường xuấthiện các bài toán có độ phức tạp lớn, các bài toán liên quan đến xử lí các tìnhhu
Trang 1MỤC LỤC
I MỞ ĐẦU 1
1.1 LÍ DO CHỌN ĐỀ TÀI 1
1.2 Mục đích nghiên cứu 1
1.3 Đối tượng nghiên cứu 2
1.4 Phương pháp nghiên cứu 2
II NỘI DUNG 3
2.1 CƠ SỞ LÍ LUẬN 3
2.2 THỰC TRẠNG VẤN ĐỀ TRƯỚC KHI ÁP DỤNG SKKN 4
2.3 CÁC THUẬT TOÁN TÌM KIẾM NỘI 5
2.3.1 Tìm kiếm tuần tự 5
2.3.2 Tìm kiếm nhị phân 7
2.4 TÌM KIẾM THEO CHIỀU SÂU 10
2.4.1 Ý tưởng 10
2.4.2 Thủ tục đệ quy THAMDFS 10
2.5 TÌM KIẾM THEO CHIỀU RỘNG 12
2.5.1 Ý tưởng: 12
2.5.2 Giải thuật 13
2.6 HIỆU QUẢ CỦA SKKN ĐỐI VỚI HOẠT ĐỘNG GIÁO DỤC 17
III.KẾT LUẬN VÀ KIẾN NGHỊ 19
3.1 KẾT LUẬN 19
3.2 KIẾN NGHỊ 19
Trang 2Ở khối 11 THPT, môn tin học với tư tưởng là sử dụng ngôn ngữ Pascal để rènluyện kỹ năng lập trình cho học sinh, nhưng để thực hiện được việc hình thành vàrèn luyện kỹ năng học lập trình cho học sinh thì còn gặp rất nhiều khó khăn vì yêucầu học sinh phải có kiến thức liên môn của môn Toán và tiếng Anh và thuật toánhay là cấu trúc dữ liệu và giải thuật
Hiện nay năm 2017 tức là đã 12 năm đưa môn tin học vào dạy ở THPT nhưngthực trạng việc dạy học lập trình ở các trường phổ thông còn tồn tại nhiều phươngpháp khác nhau, hình thức truyền dạy không đồng bộ nên kết quả thu được trongđào tạo chưa cao Mặt khác do thiếu tài liệu hướng dẫn dạy học lập trình mang tính
hệ thống, thống nhất nên trong khi dạy và học lập trình thì giáo viên và học sinhđang phải chịu những khó khăn, hạn chế nhất định nào đó
Bản thân một giáo viên sư phạm ngành tin học tôi luôn trăn trở muốn khắcphục những khó khăn trong việc dạy học, hình thành những kỹ năng lập trình chohọc sinh Hơn thế nữa trong suốt thời gian dạy học tại trường THPT Quảng Xương
3 tôi nhận thấy việc tiếp nhận từng đơn vị kiến thức về lập trình của học sinh lớp 11thực sự gặp khó khăn do đó đã nhen nhóm trong tôi ý tưởng có một đề tài nghiêncứu để khắc phục các vấn đề trên Chính vì những lẽ đó mà xin chon đề tài:
“Phương pháp ứng dụng thuật toán tìm kiếm vào dạy lập trình tin học trong công tác bồi dưỡng học sinh giỏi” làm đề tài viết sáng kiến kinh nghiệm Đây là
một vấn đề nhỏ trong vô số vấn đề có thể xây dựng để khai thác làm tăng hiệu quảcho quá trình dạy bồi dưỡng học sinh giỏi môn tin học lớp 11
1.2 MỤC ĐÍCH NGHIÊN CỨU
nâng cao chất lượng tiếp thu và lĩnh hội kiến thức về tư duy thuật toán, lậptrình các giải thuật tìm kiếm giúp học sinh hiểu bài toán và phương pháp giải quyếtvấn đề một cách nhanh nhất
bản thân tôi và các đồng nghiệp khác trong tổ bộ môn tin học luôn luôn traođổi phương pháp làm sao để dạy cho học sinh có kiến thức tốt về môn lập trình, họctốt tư duy thuật toán và cũng để các em tư duy tốt khi học các môn học khác
với đề tài này tôi không có tham muốn gì hơn ngoài mục đích: đổi mới nộidung, phương pháp, hình thức tổ chức giáo dục nhằm tìm ra biện pháp nâng cao
Trang 3chất lượng, hiệu quả giảng dạy và giáo dục học sinh, bồi dưỡng đội ngũ học sinh cóhọc tháo gỡ những khó khăn vướng mắc trên, đồng thời cũng đóng góp phần nhỏtrong việc cải cách, nâng cao chất lượng giáo dục nói chung và dạy học bộ môn tinhọc nói riêng.
1.3 đối tượng nghiên cứu
qua quá trình dạy học môn tin học ở thpt và cụ thể là dạy học sinh rèn luyệnvới kiến thức lập trình ở lớp 11, đồng thời nhận trách nhiệm bồi dưỡng học sinhgiỏi tỉnh với thực trạng chất lượng tiếp thu bài của học sinh mà tôi người thầy giáogiảng dạy bộ môn tin, tôi quyết định chọn đề tài nhằm đưa ra phương án cho họcsinh học tốt hơn vào các năm học tới và giải quyết 2 vấn đề sau:
- nghiên cứu bài 4: bài toán và thuật toán - sgk tin học 10 sau đó làm sáng tỏđược bản chất của vấn đề nghiên cứu
- nghiên cứu kiến thức sách giáo khoa tin học 11 (kiến thức liên quan đến việcthi cử học sinh giỏi tỉnh và các cuộc thi khác như: tin học trẻ…)
- nghiên cứu học sinh khối 11 trường thpt quảng xương 3 làm sao gây hứngthú cho học sinh khi học dạng toán lập trình có giải thuật tìm kiếm như thế này
1.4 phương pháp nghiên cứu
mọi vấn đề, mọi đề tài nghiên cứu thì khâu chuẩn bị và xác định mục đíchnghiên cứu bao giờ cũng đóng một vai trò hết sức quan trọng ở trong đề tài nàyđiều quan trọng của khâu chuẩn bị là việc chọn phương pháp để kết quả của đề tài
đi đến đích thì cần phải xác định được một phương pháp hiệu quả không lãng phíthời gian cũng như công sức như kinh nghiệm cho thấy đề tài có thành công haykhông còn phụ thuộc vào phương pháp tiến hành vì lẽ trên trong đề tài nghiên cứunày tôi đã sử dụng một số phương pháp sau:
phương pháp nghiên cứu lí thuyết: tài liệu về lí luận dạy học, những vấn đềchung về đổi mới phương pháp giáo dục trung học phổ thông, chương trìnhsách giáo khoa 11, một số tài liệu chuyên tin học…
phương pháp nghiên cứu thực tiễn: thực tiễn dạy tin học từ năm 2006 đếnnay, thực tiễn về công tác bồi dưỡng học sinh giỏi
phương pháp điều tra sư phạm: trao đổi với các thầy cô, đồng nghiệp và họcsinh ở trường, nhất là giáo viên bộ môn tin học, sau đó xử lí thông tin và rút
ra kết luận khoa học
phương pháp kiểm tra đánh giá học sinh thực nghiệm sư phạm: soạn giảngthành chương trình bài giảng, bộ đề kiểm tra, dạy thể nghiệm và rút kết luậnkhoa học, mang tính phổ biến
phương pháp tổng hợp và đánh giá kết quả: tổng hợp cụ thể, chi tiết, kiểmchứng rút ra biện pháp đúng, loại trừ biện pháp không hợp lí
trên đây là một số phương pháp cơ bản mà tôi đã vận dụng trong nghiên cứu vàhoàn thiện đề tài
Trang 4II NỘI DUNG
2.1 CƠ SỞ LÍ LUẬN
Hàng năm Sở giáo dục và đào tạo tỉnh Thanh Hóa luôn tổ chức kỳ thi chọn họcsinh giỏi tỉnh môn Tin học Kết quả học sinh giỏi cũng là một tiêu chi thi đua đánhgiá chất lượng trường học, đánh giá năng lực sư phạm của giáo viên Như vậy tanhận thấy việc bội dưỡng học sinh giỏi là nhiệm vụ quan trọng trong công tácchuyên môn của mỗi bộ môn, giáo viên luôn cố gắng để truyền tải kiến thức để họcsinh được bồi dưỡng có kết quả cao trong các kỳ thi Và đối với bộ môn tin họccũng vậy, trong công tác Bồi dưỡng học sinh giỏi tin học, các đề thi thường xuấthiện các bài toán có độ phức tạp lớn, các bài toán liên quan đến xử lí các tìnhhuống thực tế… trong đó thường có các bài toán trong đề thi có tình huống như:Bài toán tìm kiếm và sắp xếp dữ liệu trong một hệ thống thông tin, xử lí các vấn đề
về bộ số, mảng, xâu
Ta cũng thấy rằng: Bài toán tìm kiếm cũng thông dụng như bài toán sắp xếp Bàitoán tìm kiếm thường là “bạn” đồng hành với bài toán sắp xếp Sắp xếp để tìmkiếm thuận lợi và ngược lại tìm kiếm tạo điều kiện cho sắp xếp Vậy nội dung bàitoán tìm kiếm là gì?
- Trong hầu hết các hệ lưu trữ, quản lý dữ liệu, thao tác tìm kiếm thường đượcthực hiện nhất để khai thác thông tin:
Ví du: Tra cứu từ điển, tìm sách trong thư viện
Do các hệ thống thông tin thường phải lưu trữ một khối lượng dữ liệu đáng kể,nên việc xây dựng các giải thuật cho phép tìm kiếm nhanh sẽ có ý nghĩa rất lớn.Nếu dữ liệu trong hệ thống đã được tổ chức theo một trật tự nào đó, thì việc tìmkiếm sẽ tiến hành nhanh chóng và hiệu quả hơn:
Ví dụ: các từ trong từ điển được sắp xếp theo từng vần, trong mỗi vần lại đượcsắp xếp theo trình tự alphabet; sách trong thư viện được xếp theo chủ đề
Ví dụ: Tìm số lớn nhất trong một tập các số nguyên, tìm số hoàn hảo,…
Vì thế, khi xây dựng một hệ quản lý thông tin trên máy tính, bên cạnh các thuậttoán tìm kiếm, các thuật toán sắp xếp dữ liệu cũng là một trong những chủ đề đượcquan tâm hàng đầu
- Có thể phân chia nội dung tìm kiếm theo các loại sau:
+ Tìm một phần tử trong một tập các đối tượng
Ví dụ 1: Tìm giá trị lớn nhất của một dãy số nguyên (VD-trang 33-sgk tin 10)
Ví dụ 2: Tìm các số nguyên tố trong các số nguyên không vượt quá số nguyên
dương N cho trước
Ví dụ 3: Tìm những học sinh có học lực Khá trong lớp học 12A1.
Tuy nhiên bài toán tìm kiếm một phần tử trong một tập các đối tượng vẫn là bàitoán cơ bản nhất Ngoài ra bài toán tìm kiếm cũng thường gắn liền với bài toánđếm và liệt kê ví dụ: đếm số lượng các phần tử thõa mãn một điều kiện chotrước hoặc có bao nhiêu số nguyên tố không vượt quá 100?
Trang 5Ví dụ 4: Cho dãy N số nguyên và số nguyên x Cho biết chỉ số những phần tử có
giá trị bằng x Có bao nhiêu phần tử như vậy?
INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu là số lượng các phần tử của dãy bằng x;
Nếu dòng đầu là dương thì dòng tiếp theo ghi chỉ số của những phần tử bằng x
…Và nhiều bài toán, dạng toán tìm kiếm khác nữa…
Và ta cũng biết, hiện nay đã có nhiều giải thuật tìm kiếm và sắp xếp được xâydựng, mức độ hiệu quả của từng giải thuật còn phụ thuộc vào tính chất của cấu trúc
dữ liệu cụ thể mà nó tác động đến Dữ liệu được lưu trữ chủ yếu trong bộ nhớ chính
và trên bộ nhớ phụ, do đặc điểm khác nhau của thiết bị lưu trữ, các thuật toán tìmkiếm và sắp xếp được xây dựng cho các cấu trúc lưu trữ trên bộ nhớ chính hoặcphụ cũng có những đặc thù khác nhau Tôi thấy đây là một vấn đề mới để giúp họcsinh nắm phương pháp giải các bài toán phức tạp Vì vậy tôi chọn các thuật toánđặc trưng là thuật toán tìm kiếm nội, thuật toán tìm kiếm chiều rộng, thuật toán tìmkiếm chiều sâu để trình bày nội dung sau đây để dạy cho học sinh khi học lập trìnhtin học
2.2 THỰC TRẠNG VẤN ĐỀ TRƯỚC KHI ÁP DỤNG SKKN
Trong quá trình ôn luyện đội tuyển học sinh giỏi, nhiều giáo viên đặc biệt lànhững giáo viên trẻ, non kinh nghiệm gặp những bài toán tìm kiếm còn lúng túng,chưa tìm ra phương pháp để truyền đạt những ý tưởng để giải bài toán Bên cạnh đónhững học sinh lần đầu gặp những bải toán tìm kiếm cũng khá bỡ ngỡ, không biết
áp dụng thuật toán nào để làm, từ đó làm theo kiểu mày mò, thử nghiệm dẫn đếntốn rất nhiều thời gian mà đôi khi không mang lại kết quả như mong đợi
Trong mỗi đề thi bao giờ cũng có yêu cầu về thời gian xử lý dữ liệu Vì vậyviệc áp dụng những thuật toán vừa mang lại kết quả chính xác, lại vừa có thời gian
xử lý nhanh thì đó là thuật toán tối ưu Để có được các thuật toán như vậy đòi hỏingười giáo viên phải có lượng kiến thức tốt, kết hợp với khả năng sư phạm thì sẽtruyền đạt lại cho học sinh hiểu và vận dụng vào các bài tập cụ thể
Thuận lợi:
Nhà trường có hệ thống cơ sở vật chất khá đầy đủ cho việc dạy tin học, được
sự quan tâm giúp đỡ của đồng nghiệp, học sinh nhiệt tình và ham học hỏi
Việc tiếp cận tài liệu cho nghiên cứu cũng tương đối thuận lợi Bản thân cũng
đã nhiều năm ôn luyện đội tuyển nên cũng có đôi chút kinh nghiệm
Khó khăn:
Việc chọn học sinh cho đội tuyển Tin học gặp nhiều khó khăn vì những họcsinh khá, giỏi thì các môn Toán, Lý, Hóa chọn trước Bên cạnh đó phụ huynh học
Trang 6sinh cũng không muốn con mình vào đội tuyển Tin học, để dành thời gian cho việchọc các môn phục vụ thi đại học.
2.3 CÁC THUẬT TOÁN TÌM KIẾM NỘI
Ðể đơn giản trong việc trình bày giải thuật, bài toán được đặc tả như sau:
Bài toán tổng quát: Cần tìm kiếm một phần tử trong tập N đối tượng cho trước,
chúng ta lưu dữ liệu phản ánh các đối tượng này vào mảng một chiều A[1 N], mỗiphần tử của mảng là một bản ghi gồm các trường lưu giá trị các đặc tính của mộtđối tượng Trong các trường này giả sử chọn trường k làm khóa so sánh giữa cácphần tử Bài toán đặt ra là tìm một phần tử có giá trị khóa k0 trong tập N đối tượng
này Có 2 giải thuật thường được áp dụng để tìm kiếm dữ liệu là tìm tuần tự và tìm nhị phân
2.3.1 Tìm kiếm tuần tự
Bắt đầu từ bản ghi đầu tiên chuyển dần về phía cuối mảng, lần lượt so sánh giátrị khóa của bản ghi này với k0 , nếu giá trị của bản ghi nào bằng k0 thì hiện bản ghi
đó ( hoặc lưu trữ lại chỉ số của bản ghi đó; đồng thời tăng biến đếm số lượng phần
tử có giá trị bằng khóa k0) Nếu duyệt hết mọi bản ghi mà biến đếm có giá trị bằng
0 thì kết luận trong tập đối tượng đã cho không có phần tử nào có giá trị bằng khóa
k0
Cài đặt Giải thuật
Tìm tuần tự là một kỹ thuật tìm kiếm rất đơn giản và cổ điển
Các bước tiến hành như sau :
* Trong chương trình con trên, biến soluong và luu[1 N] là biến toàn cục, phục
vụ đưa ra kết luận sau khi tìm kiếm
Ví dụ
Cho dãy số a: 12 2 8 5 1 6 4 15
Nếu giá trị cần tìm là 8, giải thuật được tiến hành như sau :
Hình 2.2
Trang 7i = 1
Hình 2.3
i = 2
i = 3 -> Dừng
Ðánh giá giải thuật
Có thể ước lượng độ phức tạp của giải thuật tìm kiếm qua số lượng các phép sosánh được tiến hành để tìm ra ko Trường hợp giải thuật tìm tuần tự, có:
Trường hợp Số lần so sánh Giải thích
Trung bình (n+1)/2 mảng nhận giá trị Giả sử xác suất các phần tử trong
k0 là như nhau.Vậy giải thuật tìm tuần tự có độ phức tạp tính toán cấp n: T(n) = O(n)
Trang 82.3.2 Tìm kiếm nhị phân
Phép tìm kiếm nhị phân chỉ được sử dụng sau khi mảng các bản ghi đã được sắpxếp (tăng hoặc giảm) theo khóa k Giả sử giá trị khóa của bản ghi ở đầu mảng (đãsắp xếp) là k1 và giá trị khóa của bản ghi ở cuối mảng (đã sx) là k2 Phần tử cần tìmkiếm có giá trị khóa là k0
Ta phân tích cách tìm kiếm nhị phân diễn ra như sau:
- Chọn ra một bản ghi ở vị trí trung gian là vị trí vtgiua = (vtdau+vtcuoi) div 2, giả
sử giá trị khóa của bản ghi ở vị trí trung gian này là kgiua;
- Nếu k0<kgiua thì phần tử cần tìm chỉ có thể trong đoạn từ vtdau đến vtgiua-1 Vìvậy chỉ cần tìm kiếm tiếp trong đoạn [vtdau vtgiua-1] bằng đệ quy
- Nếu k0>kgiua thì phần tử cần tìm chỉ có thể trong đoạn từ vtgiua+1 đến vtcuoi Vìvậy chỉ cần tìm kiếm tiếp trong đoạn [vtgiua+1 vtcuoi] bằng đệ quy
- Nếu k0=kgiua thì ghi nhận chỉ số bản ghi hoặc hiện ngay bản ghi này là phần
tử cần tìm
Cài đặt Giải thuật
Procedure TIMKIEM2 (vtdau,vtcuoi:integer);
Nếu giá trị cần tìm là 8, giải thuật được tiến hành như sau:
left = 1, right = 8, midle = 4
Trang 9left = 5, right = 8, midle = 6
Dừng
Ðánh giá giải thuật
Trường hợp giải thuật tìm nhị phân, có bảng phân tích sau :
Trường
hợp
Số lần so
Tốt nhất 1 Phần tử giữa của mảng có giá trị x
Xấu nhất log 2 n Không có x trong mảng
- Giải thuật tìm nhị phân dựa vào quan hệ giá trị của các phần tử mảng để định
hướng trong quá trình tìm kiếm, do vậy chỉ áp dụng được cho những dãy đã có thứ tự
- Giải thuật tìm nhị phân tiết kiệm thời gian hơn rất nhiều so với giải thuật tìm
tuần tự do Tnhị phân (n) = O(log 2 n) < Ttuần tự (n) = O(n).Tuy nhiên khi muốn áp dụnggiải thuật tìm nhị phân cần phải xét đến thời gian sắp xếp dãy số để thỏa điều kiệndãy số có thứ tự Thời gian này không nhỏ, và khi dãy số biến động cần phải tiếnhành sắp xếp lại Tất cả các nhu cầu đó tạo ra khuyết điểm chính cho giải thuật tìmnhị phân Ta cần cân nhắc nhu cầu thực tế để chọn một trong hai giải thuật tìm kiếmtrên sao cho có lợi nhất
Ví dụ khi dạy bài 4 – Bài toán thuật toán (tin học 10) ta có thể đưa ra một
số bài tập như sau:
Bài 1: viết thuật toán bằng đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn nhất
trong 2 số nguyên a, b nhập từ bàn phím sau đó viết chương trình hoàn thiện?
Bài 2: viết thuật toán bằng liệt kê từng bước hoặc bằng đồ khối tìm giá trị lớn nhất
trong 3 số nguyên a, b, c nhập từ bàn phím sau đó viết chương trình hoàn thiện?
Bài 3: viết thuật toán bằng đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn nhất
trong 4 số nguyên a, b, c, d nhập từ bàn phím sau đó viết chương trình hoàn thiện?
Bài 4 : viết thuật toán bằng sơ đồ khối hoặc bằng liệt kê từng bước tìm giá trị lớn
nhất của một dãy số nguyên nhập từ bàn phím sau đó viết chương trình hoànthiện?
Trang 10Ví dụ khi dạy bài 11 – Kiểu mảng (tin học 11) giáo viên có thể đưa ra các bài tập sau:
1 Xét mảng các số nguyên có nội dung như sau :
b Trong trường hợp tìm nhị phân, phần tử nào sẽ được tìm thấy (thứ 1 hay 2)
2 Xây dựng thuật toán tìm phần tử nhỏ nhất (lớn nhất) trong một mảng các số
nguyên
3 Hãy viết hàm tìm tất cả các số nguyên tố nằm trong mảng một chiều a có n
phần tử
4 Hãy viết hàm tìm dãy con tăng dài nhất của mảng một chiều a có n phần tử
(dãy con là một dãy liên tiếp các phần của a)
Ví dụ khi dạy bài 16 – lớp 11: Kiểu dữ liệu tệp giáo viên có thể ra các bài tập sau:
Bài 1: Cho dãy N số nguyên và số nguyên x Bằng phương pháp tìm kiếm tuần tự
cho biết chỉ số những phần tử có giá trị bằng x Có bao nhiêu phần tử như vậy?INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu là số lượng các phần tử của dãy bằng x;
Nếu dòng đầu là dương thì dòng tiếp theo ghi chỉ số của những phần tử bằng x
Bài 2: Cho dãy N số nguyên và số nguyên x Sắp xếp dãy tăng, bằng phương pháp
tìm kiếm nhị phân cho biết chỉ số một phần tử có giá trị bằng x
INPUT: file văn bản DAYSO.INP
- dòng đầu là N và x
- N dòng sau, lần lượt ghi các số nguyên thuộc dãy từ vị trí 1 đến vị trí N,mỗi số trên một dòng
OUTPUT: File DAYSO.OUT
- Dòng đầu ghi 1 hoặc 0 tương ứng với trường hợp tìm được hoặc khôngtìm được
- Nếu dòng đầu là 1 thì dòng thứ hai ghi chỉ số một phần tử bằng x
Bài 3: Cho file văn bản XAU.INP gồm một số dòng, mỗi dòng ghi một xâu kí tự
Hãy ghi vào file văn bản XAU.OUT một số dòng, mỗi dòng ghi số 1 hoặc số 0 tùytheo xâu ở dòng tương ứng của file XAU.INP là xâu đối gương hay không?
Trang 11Trước hết Đỉnh s được đến từ đỉnh s, tiếp theo, với mọi cung (s,x) của đồ thị thì
x cũng sẽ đến được từ s Với mỗi đỉnh x đó thì tất nhiên những đỉnh y nối từ x cũngđến được từ s…
Điều đó gợi cho ta viết một thủ tục đệ quy THAMDFS(u) mô tả việt duyệt từđỉnh u bằng cách thăm đỉnh u và tiếp tục quá trình duyệt THAMDFS(v) với v làmột đỉnh chưa thăm nối từ u Ta phải sử dụng kỹ thuật đánh dấu để tránh việc liệt
kê các cặp đỉnh: khởi tạo Avail[v]:=true, ∀ v ∈V, mỗi lần thăm một đỉnh ta đánhdấu đỉnh đó lại, avail[v]:=false, để các bước duyệt đệ quy kế tiếp không duyệt lạiđỉnh đó nữa Để lưu lại đường đi từ đỉnh xuất phát s, trong thủ tục THAMDFS(u),trước khi gọi đệ quy THAMDFS(v) với v là một đỉnh chưa thăm nối từ u, ta lưu lạivết đường đi từ u tới v bằng cách đặt trace[v]:=u, tức là trace[v] lưu lại đỉnh liềntrước v trong đường đi từ s tới v Khi thuật toán DFS kết thúc đường đi từ s tới t sẽlà: (p1= t ← p2=trace[p1] ←p3= trace[p2] ←…s)
Trang 12if avail[t] then
truy theo vết từ t để tìm đường đi từ s tới t
End
Kết quả của thuật toán tìm kiếm theo chiều sâu
Một cách tự nhiên, kết quả của giải thuật tìm kiếm theo chiều sâu là một cây phủqua tất cả các đỉnh được duyệt của đồ thị
Duyệt các đỉnh
Có thể dùng giải thuật này để tạo một danh sách tuần tự các đỉnh của một đồthị (hoặc cây) Có ba cách hiện thực phương pháp này:
• Duyệt tiền thứ tự (preordering): tạo ra một danh sách mà trong đó các
đỉnh xuất hiện theo đúng trật tự nó được thăm đến khi chạy thuật toán Đây
chính là biểu diễn tự nhiên của quá trình thực hiện giải thuật tìm kiếm theochiều sâu Một biểu thức ở dạng tiền thứ tự được gọi là kí pháp tiền tố
• Duyệt hậu thứ tự (postordering): tạo ra một danh sách mà trong đó các
đỉnh xuất hiện theo thứ tự của lần duyệt đến sau cùngkhi thực hiện giải thuật.
Một lần duyệt hậu thứ tự một cây biểu thức sẽ cho ra một kí pháp hậu tố
• Duyệt đảo hậu thứ tự (reverse postordering): kết quả của cách duyệt
này là sự đảo ngược lại thứ tự trong kết quả duyệt hậu thứ tự Thông thường,khi duyệt cây, cách này cho ra cùng kết quả với duyệt tiền thứ tự, nhưng xéttổng quát, khi duyệt một đồ thị, tiền thứ tự và đảo hậu thứ tự cho ra kết quảkhác nhau Với các đồ thị có hướng và không có vòng, cách duyệt đảo hậu thứ
tự cho ra một trật tự tô-pô của đồ thị đó
Độ phức tạp của thuật toán
1 DFS được gọi đúng 1 lần ứng với mỗi đỉnh.
2 Mỗi cạnh được xem xét đúng 2 lần, mỗi lần từ một đỉnh kề với nó.
3 Với ns đỉnh và ms cạnh thuộc thành phần liên thông chứa s, một phép DFS bắt đầu tại s sẽ chạy với thời gian O(ns + ms)nếu:
• Đồ thị được biểu diễn bằng cấu trúc dữ liệu dạng danh sách kề
• Đặt nhãn cho một đỉnh là "đã thăm" và kiểm tra xem một đỉnh "đã thăm chưa tốn chi phí O(degree).
• Bằng cách đặt nhãn cho các đỉnh là "đã thăm", ta có thể xem xét một cách
hệ thống các cạnh kề với đỉnh hiện hành nên ta sẽ không xem xét một cạnh quá 1lần
Ứng dụng giải thuật tìm kiếm theo chiều sâu
• Xác định các thành phần liên thông của đồ thị
• Sắp xếp tô-pô cho đồ thị
• Xác định các thành phần liên thông mạnh của đồ thị có hướng
Trang 132.5 TÌM KIẾM THEO CHIỀU RỘNG
Trong lý thuyết đồ thị, tìm kiếm theo chiều rộng (BFS) là một thuật toán tìm
kiếm trong đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) thăm một đỉnhcủa đồ thị; (b) thêm các đỉnh kề với đỉnh vừa thăm vào danh sách có thể thăm trongtương lai Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích:tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường
đi từ đỉnh gốc tới tất cả các đỉnh khác Trong đồ thị không có trọng số, thuật toántìm kiếm theo chiều rộng luôn tìm ra đường đi ngắn nhất có thể Thuật toán BFSbắt đầu từ đỉnh gốc và lần lượt thăm các đỉnh kề với đỉnh gốc Sau đó, với mỗi đỉnhtrong số đó, thuật toán lại lần lượt thăm các đỉnh kề với nó mà chưa được thămtrước đó và lặp lại Xem thêm thuật toán tìm kiếm theo chiều sâu, trong đó cũng sửdụng 2 thao tác trên nhưng có trình tự thăm các đỉnh khác với thuật toán tìm kiếmtheo chiều rộng
u1 sẽ lại phát sinh yêu cầu thăm các đỉnh v1,v2,…nối từ u1 Nhưng rõ ràng các đỉnh vnày xa s hơn những đỉnh u nên chúng chỉ được thăm khi tất cả những đỉnh u đãthăm Tức thứ tự duyệt sẽ là: s, u1, u2, ,v1, v2,
Thuật toán tìm kiếm theo chiều rộng chỉ sử dụng một danh sách để chứa nhữngđỉnh đang chờ thăm Tại mỗi bước, ta thăm một đỉnh đầu danh sách, loại nó ra khỏidanh sách và cho những đỉnh chưa xếp hàng kế với nó xếp hàng thêm vào cuốidanh sách Thuật toán sẽ kết thúc khi danh sách rỗng
Vì nguyên tắc vào trước ra trước, danh sách chứa những đỉnh đang chờ thămđược tổ chức dưới dạng hàng đợi (Queue): Nếu ta có Queue là một hàng đợi vớithủ tục PUSH(v) để đẩy một đỉnh v vào hàng đợi và hàm POP trả về một đỉnh lấy
ra từ hàng đợi thì mô hình của giải thuật BFS ta có thể viết
s
U
2
… U
Trang 14Truy theo vết từ t để tìm đường đi từ s tới t;
Trong quá trình lập trình ta thướng gặp các dạng toán tìm kiếm có thể ứng dụng
thuật toán trên, Ví dụ: Bài toán : HẸN GẶP MẶT
Hòa và Thân là bạn thân của nhau, hai người xa nhau đã lâu, nay mới liên lạcđược với nhau qua Internet và họ hẹn gặp nhau tại thành phố Hồ Chí Minh Họquyết định đến gặp nhau bằng cách đi máy bay để tiết kiệm thời gian Hoà và Thânsinh sống và làm việc tại hai thành phố khác nhau
Hãy tìm cách giúp Hòa và Thân đến được thành phố Hồ Chí Minh bằng cácchuyến bay có thể có nhưng để tiết kiệm chi phí, tại mỗi sân bay mỗi người chỉđược ghé lại 1 lần và mỗi người phải qua ít thành phố nhất
Các thành phố xem như là các đỉnh của một đồ thị vô hướng gồm N đỉnhđược mã số từ 1 đến N (1 ≤ i ≤ 100) Chỉ một số cặp thành phố mới có đường baycòn lại thì không Giả sử đỉnh xuất phát không trùng đỉnh đích
Dữ liệu vào: được cho trong tệp GAPNHAU.INP gồm có các dòng:
- Dòng đầu tiên, được gọi là dòng 0, chứa 4 số tự nhiên N, H, T, D(1≤H,T,D≤N),trong đó N là số thành phố có sân bay, H là nơi Hoà đang sinh sống và công tác còn
T là thành phố mà Thân sống và làm việc, D là mã số của thành phố Hồ Chí Minhnơi mà Hoà và Thân hẹn gặp (các số cách nhau ít nhất 1 khoảng cách)
- Dòng thứ i (1 ≤ i ≤ N - 1), trong N-1 dòng tiếp theo cho biết có hay không đườngbay nối thành phố i với thành phố j (j=N-j+1) bằng các số 0, 1 (số 0 nghĩa là không
có đường bay giữa hai đỉnh i , j; số 1 nghĩa là tồn tại đường bay giữa hai đỉnh i , j)các số cách nhau ít nhất 1 khoảng cách
Trang 15Dữ liệu ra: được ghi trong tệp văn bản GAPNHAU.OUT:
- Dòng đầu tiên ghi số tự nhiên k, l là số đỉnh trên đường đi từ H đến D và số đỉnhtrên đường từ T tới D (nếu không có đường đi thì ghi số 0)
- Dòng thứ 2 ghi lần lượt các đỉnh có trên đường đi từ H đến D (Nếu không cóthì ghi 0)
- Dòng thứ 3 ghi lần lượt các đỉnh có trên đường đi từ T đến D (Nếu không có thìghi 0)
* Cài đặt thuật toán:
Xuất phát từ đỉnh v[1] = s, mỗi bước lặp i ta thực hiện các kiểm tra sau Gọi
k là số đỉnh đã đi qua và được tích luỹ trong mảng giải trình đường đi v, cụ thể làxuất phát từ đỉnh v[1] = s, sau một số lần duyệt ta quyết định chọn đường đi quacác đỉnh v[1], v[2], v[3],…, v[k] Có thể gặp các tình huống sau:
a) (Đến đích?) nếu v[k] = t tức là đã đến được đỉnh t: thông báo kết quả,dừng thuật toán, ngược lại thực hiện b
b) (Thất bại?) k = 0: nếu đã quay trở lại vị trí xuất phát v[i] = s mà từ đókhông còn đường đi nào khác thì phải lùi một bước nữa, do đó k = 0 Trường hợp
8 3
7