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

Một số phương pháp chứng minh tính đúng của thuật toán và ứng dụng

67 1,4K 1

Đ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 67
Dung lượng 528 KB

Nội dung

Trong đó, phương pháp quy nạp chứng minh cho các thuật toán đệ quy,phương pháp bất biến vòng lặp chứng minh cho các thuật toán không đệ quy.Đối với mỗi phương pháp trình bày về đặc điểm,

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-Bế Thị Hương

MỘT SỐ PHƯƠNG PHÁP CHỨNG MINH TÍNH ĐÚNG CỦA THUẬT TOÁN VÀ ỨNG DỤNG

LUẬN VĂN THẠC SĨ KHOA HỌC

Hà Nội – Năm 2015

Trang 2

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-Bế Thị Hương

MỘT SỐ PHƯƠNG PHÁP CHỨNG MINH TÍNH ĐÚNG CỦA THUẬT TOÁN VÀ ỨNG DỤNG

Chuyên ngành: Cơ sở Toán học cho Tin học

Mã số: 60460110

LUẬN VĂN THẠC SĨ KHOA HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC: TS NGUYỄN THỊ HỒNG MINH

Hà Nội – Năm 2015

Trang 3

LỜI CẢM ƠN

Lời đầu tiên em xin chân thành cảm ơn các thầy giáo, cô giáo giảng dạylớp cao học Cơ sở Toán học cho Tin học, Khoa Toán – Cơ – Tin học, TrườngĐại học Khoa học Tự nhiên – ĐHQGHN khóa 2012 – 2014 Các thầy cô đã rấtnhiệt tình, tâm huyết trong giảng dạy cho em học tập, nghiên cứu bổ sung đượcthêm nhiều kiến thức mới quan trọng, hữu ích trong nghiên cứu và trong côngtác giảng dạy ở trường THPT chuyên Đồng thời kịp nhận ra và sửa đổi, bổ sungnhững kiến thức mình còn hiểu chưa thật chính xác giúp tăng cường năng lực vàphát triển tư duy trong nghiên cứu khoa học

Đặc biệt, em gửi lời cảm ơn chân thành và sâu sắc tới cô giáo TS.NguyễnThị Hồng Minh (Khoa Sau Đại học – ĐHQGHN) Cô đã giảng dạy cùng vớihướng dẫn luận văn cho em một cách rất khoa học, tận tâm, chu đáo và chi tiết

để em có thể hoàn thành luận văn một cách tốt nhất

Cảm ơn gia đình đã cho em một chỗ dựa vững chắc để hoàn thành khóahọc cũng như hoàn thành luận văn này

Mặc dù đã có rất nhiều cố gắng trong việc nghiên cứu khoa học để hoànthành luận văn tuy nhiên do hạn chế cá nhân về mặt thời gian nên em khó có thểtránh được những thiếu sót Kính mong thầy cô và các bạn đóng góp ý kiến quýbáu để hoàn chỉnh luận văn này hơn nữa

Trang 4

MỤC LỤC

MỞ ĐẦU 1

CHƯƠNG 1 TỔNG QUAN VỀ PHÂN TÍCH THUẬT TOÁN 4

1.1 Một số khái niệm cơ bản 4

1.1.1 Bài toán 4

1.1.2 Thuật toán (Algorithm) 5

1.1.3 Cấu trúc dữ liệu (Data Structure) 10

1.1.4 Chương trình (Program) 10

1.2 Một số phương pháp thiết kế thuật toán 11

1.2.1 Kỹ thuật đệ quy 11

1.2.2 Phương pháp chia để trị (Divide and Conquer) 14

1.2.3 Phương pháp quay lui (Backtracking) 15

1.2.4 Phương pháp nhánh cận 17

1.2.5 Phương pháp quy hoạch động (Dynamic Programming ) 19

1.2.6 Phương pháp tham lam (Greedy Method) 21

1.3 Phân tích thuật toán 22

1.3.1 Tính đúng đắn của thuật toán 22

1.3.2 Độ phức tạp thuật toán 23

a) Độ phức tạp về mặt thời gian 23

b) Độ phức tạp về mặt không gian 23

CHƯƠNG 2 MỘT SỐ PHƯƠNG PHÁP CHỨNG MINH TÍNH ĐÚNG CỦA THUẬT TOÁN 25

2.1 Các chiến lược chứng minh tính đúng thuật toán 25

2.2 Các phương pháp chứng minh tính đúng (Correctness proofs) 26

2.2.1 Phương pháp quy nạp (induction) 26

a) Phương pháp quy nạp toán học 26

b) Chứng minh tính đúng của thuật toán bằng phương pháp quy nạp 27

c) Một số ví dụ 27

Trang 5

2.2.2 Phương pháp bất biến vòng lặp (loop invariant) 33

a) Chứng minh tính đúng của thuật toán bằng phương pháp bất biến vòng lặp 33

b) Các đặc trưng của bất biến vòng lặp 35

c) Một số ví dụ 35

CHƯƠNG 3 ỨNG DỤNG CHỨNG MINH TÍNH ĐÚNG CỦA MỘT SỐ THUẬT TOÁN 44

3.1 Bài toán: Dãy con đơn điệu tăng dài nhất 44

3.2 Bài toán: Chia kẹo 53

3.3 Bài toán Cây bao trùm nhỏ nhất (Minimum spanning tree) 54

KẾT LUẬN 61

Trang 6

MỞ ĐẦU

Thế kỷ XXI là thế kỷ của tri thức hiện đại, một nền tri thức không thểkhông kể đến công cụ hỗ trợ đắc lực của máy tính điện tử trong mọi lĩnh vựccuộc sống Mặc dù công nghệ chế tạo ngày càng phát triển và phát triển với tốc

độ nhanh nhưng để sử dụng máy tính điện tử một cách hiệu quả cao thì thuậttoán (Algorithm) là thành phần luôn luôn quan trọng và không thể thiếu được kể

từ khi máy tính điện tử ra đời

Theo lịch sử toán học nguồn gốc của từ thuật toán “Algorithm” là bắtnguồn từ “Algorism” tên của một nhà bác học nổi tiếng người Arập là Abu JafarMohammed ibn Musâ al Khowârizmi (Phiên âm của từ al Khowârizmi chính làAlgorism) Ông là người đã viết hai quyển sách nổi tiếng là “Sơ lược về cácphép tính” và “Về hệ đếm ấn độ” vào khoảng năm 850 Đây là những quyểnsách giáo khoa nổi tiếng về toán học

Lịch sử đã ghi nhận người được coi là nhà lập trình đầu tiên trên thế giới

là nữ bá tước Ada Lovelace (10/12/1815 - 27/11/1852), tên khai sinh là AugustaAda Byron Các nhà khoa học về sau cho rằng thuật toán (viết năm 1842) củaAda Lovelace là những thuật toán máy tính đầu tiên do con người lập ra, vì nólần đầu tiên thể hiện rõ từng bước phát triển logic, đặc trưng hoạt động xác địnhdành riêng cho máy tính

Với lịch sử lâu đời của thuật toán đã được nghiên cứu và phát triển cho tớitận ngày nay và sẽ vẫn còn tiếp tục được nghiên cứu và phát triển hơn nữa Khilập trình câu hỏi luôn luôn được đặt ra là thuật toán được thiết kế hoặc thuật toánđược sử dụng có đúng hay không? Điều này đảm bảo cho một chương trình máytính thực hiện có cho kết quả đúng hay không? (Chưa kể đến các kỹ năng củangười lập trình) Vì vậy việc xây dựng một thuật toán tốt để giải bài toán đã cho

Trang 7

là bước quan trọng có thể nói là quan trọng nhất trong việc giải một bài toán trênmáy tính điện tử

Để đánh giá một thuật toán là tốt có rất nhiều tiêu chí trong đó không thể

bỏ qua tính đúng của thuật toán Và đây cũng là nội dung chính của luận văn nàytheo đề tài nghiên cứu: “Một số phương pháp chứng minh tính đúng của thuậttoán và ứng dụng” Luận văn nhằm tìm hiểu, nghiên cứu, tổng hợp phương phápchứng minh tính đúng của thuật toán Cấu trúc luận văn gồm 3 chương, nội dungchính như sau:

Chương 1 Tổng quan về phân tích thuật toán.

Chương này nhằm tổng hợp lại một số kiến thức chung về bài toán, thuậttoán, cấu trúc dữ liệu, chương trình và kiến thức về phân tích thuật toán Gồmcác định nghĩa, khái niệm và các ví dụ để minh họa

Trong chương này còn tổng hợp lại một số phương pháp thiết kế thuậttoán thường sử dụng trong thực tế Như kỹ thuật đệ quy, phương pháp chia đểtrị, phương pháp quay lui, phương pháp nhánh cận, phương pháp quy hoạchđộng và phương pháp tham lam

Chương 2 Một số phương pháp chứng minh tính đúng của thuật toán.

Nội dung chương này gồm các chiến lược chứng minh tính đúng của thuậttoán; các phương pháp cụ thể để chứng minh tính đúng của thuật toán nhưphương pháp quy nạp và phương pháp bất biến vòng lặp Đây cũng chính làđiểm mới của luận văn

Trong đó, phương pháp quy nạp chứng minh cho các thuật toán đệ quy,phương pháp bất biến vòng lặp chứng minh cho các thuật toán không đệ quy.Đối với mỗi phương pháp trình bày về đặc điểm, phương pháp chung đồng thờinêu một số ví dụ về thuật toán và chứng minh tính đúng của các thuật toán đó.Đối với những thuật toán phức tạp có chứa cả đệ quy và lặp thì cần kết hợp khéo

Trang 8

léo cả hai phương pháp chứng minh tính đúng của thuật toán là quy nạp và bấtbiến vòng lặp.

Chương 3 Ứng dụng chứng minh tính đúng của một số thuật toán.

Nghiên cứu một số bài toán có sử dụng các thuật toán kinh điển, thường

sử dụng và vận dụng lý thuyết của chương 2 để chứng minh tính đúng của cácthuật toán đó Như bài toán dãy con đơn điệu tăng dài nhất; Chia kẹo; Cây baotrùm nhỏ nhất

Trang 9

CHƯƠNG 1 TỔNG QUAN VỀ PHÂN TÍCH THUẬT TOÁN

Để khẳng định được một thuật toán là tốt là một điều không dễ dàng gì.Thật vậy, để đánh giá một thuật toán tốt ta cần rất nhiều kỹ thuật từ thiết kế,phân tích đến đánh giá một thuật toán Ở chương này đề cập tổng quát đến cácvấn đề trong phân tích thuật toán và một số thuật toán cơ bản thường dùng trongkhoa học tính toán hiện đại

1.1 Một số khái niệm cơ bản

1.1.1 Bài toán

Khoa học máy tính ngày nay giải quyết rất nhiều vấn đề trong thực tếtrong nhiều lĩnh vự khác nhau, những vấn đề đó ta thường gọi là bài toán Tuynhiên bài toán ở đây không phải là một trường hợp cụ thể mà là bài toán mangtính tổng quát bao gồm hầu như tất cả các khả năng có thể của thế giới thựctrong vấn đề cần giải quyết Như vậy, nói một cách dễ hiểu thì bài toán là việcnào đó ta muốn máy tính thực hiện Có thể là một yêu cầu đơn giản như in ramột dòng chữ trên màn hình, giải phương trình bậc hai, giải hệ phương trình bậcnhất hai ẩn hoặc kiểm tra một số là chẵn hay lẻ, Nhưng cũng có thể là giảiquyết những vấn đề rất phức tạp như tìm đường đi trong mê cung, tìm đường đingắn nhất, tìm cây bao trùm,

Điểm quan trọng đầu tiên khi giải một bài toán trên máy tính đó là cần xácđịnh rõ những gì đã biết input (dữ liệu vào) và kết quả cần thu được output (dữliệu ra) và phân tích mối quan hệ giữa hai yếu tố đó Sau đây là một số ví dụ vềbài toán:

 Bài toán 1.1: Kiểm tra tính nguyên tố của một số nguyên dương cho trước

 Input: Số nguyên dương N

 Output: Xác định N là số nguyên tố hoặc N không là số nguyên tố

 Bài toán 1.2: Giải phương trình bậc hai ax2+bx+c=0 (a≠0)

Trang 10

 Input: Các số thực a, b, c (a≠0).

 Output: Các nghiệm x thỏa mãn phương trình đã cho hoặc thông báokhông có nghiệm

 Bài toán 1.3: Tìm ước số chung lớn nhất của hai số nguyên dương a, b

 Input: Hai số nguyên dương a, b

 Output: Ước số chung lớn nhất của a và b

 Bài toán 1.4: Xác định vị trí của phần tử có giá trị bằng số nguyên x trongmột dãy số nguyên a1, a2, , an

 Input: Số n; dãy số nguyên a1, a2, , an và số nguyên x

 Output: Chỉ số i nếu x=ai và là 0 nếu x không có mặt trong dãy

 Bài toán 1.5 Cho đồ thị vô hướng G=(V, E) Tìm đường đi ngắn nhất từ đỉnh

u tới đỉnh v của đồ thị G

 Input: Đồ thị vô hướng G=(V, E) và hai đỉnh u,v

 Output: Xác định đường đi có độ dài ngắn nhất d=(u=v1,v2, ,vn=v)(với đỉnh vi thuộc V, cung (vi, vi+1) thuộc E)

 Bài toán 1.6 Sắp xếp một dãy các số cho trước thành dãy không giảm

 Input: Số n và dãy gồm n số < a1, a2, …, an>

 Output: Một hoán vị < a'1, a'2, …, a'n > của chuỗi đầu vào thỏa mãn:a'1  a'2  … a'n

1.1.2 Thuật toán (Algorithm)

Để giải một bài toán trên máy tính sau khi đã xác định rõ ràng về bài toánviệc quan trọng nhất là phải đưa ra một thuật toán tốt, thuật toán này có thể làmột thiết kế mới hoặc lựa chọn một thuật toán đã có Thuật toán là để biểu diễn

về cách giải một bài toán trên máy tính

Trang 11

Một bài toán có thể có nhiều cách giải nhưng một thuật toán chỉ giải mộtbài toán mà thôi Đến hiện nay thì đã có nhiều định nghĩa về thuật toán và sauđây là một lựa chọn định nghĩa thuật toán:

Định nghĩa: Thuật toán (Algorithm) để giải một bài toán là một dãy hữu

hạn các thao tác được sắp xếp theo một trình tự xác định, sao cho sau khi thựchiện dãy thao tác ấy, từ dữ liệu vào có thể là một giá trị hoặc một tập giá trị(input) của bài toán ta nhận được một giá trị hoặc một tập giá trị còn gọi là dữliệu ra (output) của bài toán đó

Để thuật toán được rõ ràng, chính xác, dễ hiểu, dễ đọc hơn người ta đưa racác phương pháp biểu diễn thuật toán Gồm có ba phương pháp biểu diễn thuậttoán như sau:

 Ngôn ngữ tự nhiên (Natural languages): Dùng ngôn ngữ tự nhiên để liệt kêtừng bước của thuật toán Phương pháp này không có các quy tắc chung do

đó người viết và người đọc dễ dàng thực hiện được mà không cần phải nắmđược những quy tắc Nhưng viết thuật toán theo cách này thường dài dòng,không thể hiện được rõ cấu trúc thuật toán và đôi lúc có thể gây khó hiểuhoặc hiểu nhầm đối với người đọc

 Sơ đồ khối (Flowcharts): là công cụ trực quan để thể hiện thuật toán Sơ đồkhối biểu diễn được sự phân cấp của thuật toán cũng như trình tự thực hiệnthuật toán Đặc biệt phù hợp với những thuật toán phức tạp, khó theo dõi quátrình xử lý Tuy nhiên, phương pháp biểu diễn này có nhược điểm là cồngkềnh, cần không gian biểu diễn lớn hơn các phương pháp khác Trong sơ đồkhối thường sử dụng một số khối và cung để biểu diễn thuật toán như sau:

 Hình oval: Thể hiện thao tác nhập, xuất dữ liệu;

 Hình thoi: Thể hiện thao tác so sánh, chỉ có hai nhánh logic là đúng hoặcsai;

 Hình chữ nhật: Thể hiện các phép gán, các thao tác tính toán;

Trang 12

 Cung có hướng: Thể hiện trình tự thực hiện các thao tác, thao tác này nốitiếp thao tác kia theo hướng mũi tên.

 Nút nối: Để nối các phần khác nhau của sơ đồ khối lại với nhau Thườngbiểu diễn bằng hình tròn, bên trong có kí hiệu để biết là nút nối nào

 Nút nối trang: Với các sơ đồ khối lớn cần biểu diễn trên nhiều trang thìbiểu diễn thêm bằng nút nối trang

 Giả mã (Pseudocode): Sử dụng cú pháp của một ngôn ngữ lập trình nào đókết hợp với ngôn ngữ tự nhiên để thể hiện thuật toán Với giả mã người lậptrình tận dụng được các định nghĩa và cấu trúc của ngôn ngữ lập trình Đâycũng là phương pháp chính được chọn lựa để biểu diễn các thuật toán trongluận văn này

Sau đây là ví dụ về thuật toán và ba cách để biểu diễn thuật toán tươngứng của bài toán 1 đã nêu ở mục 1.1.1

Phân tích bài toán: Theo định nghĩa số nguyên tố thì số nguyên dương N

là số nguyên tố nếu N chỉ có đúng 2 ước số là 1 và chính nó Nên ta có với

Do đó ta có thuật toán như sau:

 Thuật toán biểu diễn bằng ngôn ngữ tự nhiên:

Bước 1 Nhập số nguyên dương N;

Bước 2 Nếu N=1 thì thông báo N không nguyên tố rồi kết thúc;

Bước 3 Nếu N<4 thì thông báo N là số nguyên tố rồi kết thúc;

Bước 4 i = 2;

Trang 13

Bước 5 Nếu i > [ N] thì thông báo N là nguyên tố rồi kết thúc;

Bước 6 Nếu N chia hết cho i thì thông báo N không nguyên tố rồi kếtthúc;

Bước 7 i = i+1 rồi quay lại bước 5

 Thuật toán biểu diễn bằng sơ đồ khối:

Đúng

Nhập N nguyên dương

Sai

Đúng

Sai

ĐúngSai

Trang 14

 Thuật toán biểu diễn bằng giả mã:

Các tính chất của thuật toán: Khi viết thuật toán cần chú ý đến những

tính chất quan trọng sau đây:

Tính tổng quát (Generality): Thuật toán áp dụng cho mọi trường hợp của bài

toán (nhiều bộ dữ liệu vào) chứ không phải chỉ cho một trường hợp riêng lẻ(một bộ dữ liệu vào) nói một cách khác là áp dụng cho một lớp các bài toáncùng loại;

 Tính dừng (Stationarity): Thuật toán phải kết thúc sau một số hữu hạn lầnthực hiện các thao tác, mặc dù đối với các bài toán phức tạp số lần này có thể

là rất lớn;

 Tính xác định (Definiteness): Sau khi thực hiện một thao tác thì hoặc là thuậttoán kết thúc hoặc là có đúng một thao tác xác định để được thực hiện tiếptheo (do đó luôn thực hiện được)

Trang 15

 Tính hiệu quả (Effectiveness): Được đánh giá dựa trên một số tiêu chuẩn như

là sử dụng không gian bộ nhớ và thời gian thực hiện thuật toán Đây cũngchính là tính chất quan trọng để đánh giá và lựa chọn thuật toán để giải quyếtmột bài toán trong thực tế

 Tính đúng đắn (Generalliness): Sau khi thuật toán kết thúc ta phải nhận đượcoutput cần tìm Tính đúng là tính chất hiển nhiên khi giải một bài toán muốnđạt được nhất nhưng cũng là tính chất khó đạt tới nhất Vì không phải lúc nàocũng tìm được lời giải đúng cho bài toán đã đặt ra

1.1.3 Cấu trúc dữ liệu (Data Structure)

Cấu trúc dữ liệu là một cách lưu trữ dữ liệu trong máy tính sao cho việckhai thác chúng được hiệu quả hơn Trong thiết kế chương trình việc lựa chọncấu trúc dữ liệu rất quan trọng Vì mỗi loại cấu trúc dữ liệu phù hợp với một sốloại ứng dụng khác nhau Một cấu trúc dữ liệu được thiết kế cho phép thực hiệnnhiều phép toán, tiết kiệm tài nguyên, ít thời gian xử lý và sử dụng không gian

bộ nhớ càng ít thì càng tốt Các cấu trúc dữ liệu được triển khai bằng cách sửdụng các kiểu dữ liệu, các tham chiếu và các phép toán trên cấu trúc dữ liệu đóđược cung cấp bởi một ngôn ngữ lập trình cụ thể Sự liên hệ giữa cấu trúc dữliệu và thuật toán rất chặt chẽ, thuật toán cần được thao tác trên các cấu trúc dữliệu nào đó và các cấu trúc dữ liệu sẽ được xử lý bởi thuật toán nào đó Và vìkhông có một cấu trúc duy nhất nào có thể tốt cho mọi mục đích hay phù hợpvới mọi thuật toán do đó điều quan trọng khi nghiên cứu cấu trúc dữ liệu là cầnphải biết sức mạnh cũng như giới hạn của cấu trúc dữ liệu đó để sử dụng cho phùhợp, hiệu quả

1.1.4 Chương trình (Program)

Chương trình = Thuật toán + Cấu trúc dữ liệu Chương trình là sự thể hiệnbằng một ngôn ngữ lập trình cụ thể một thuật toán đã cho được thể hiện trên mộtcấu trúc dữ liệu xác định Việc lựa chọn cấu trúc dữ liệu phù hợp với thuật toán

Trang 16

hoặc ngược lại lựa chọn thuật toán phù hợp với cấu trúc dữ liệu cụ thể còn phụthuộc vào mục đích của chương trình, kỹ năng người lập trình và khả năng củangôn ngữ lập trình cụ thể.

1.2 Một số phương pháp thiết kế thuật toán

Ngày nay có nhiều phương pháp thiết kế thuật toán đã được nghiên cứu và

sử dụng trong công nghệ phần mềm Có những bài toán có thể giải được bằngthuật toán nhưng cũng những bài toán chưa có thuật toán hoặc chỉ có thuật toáncho lời giải tương đối chấp nhận được Trong luận văn này nghiên cứu về cácphương pháp thiết kế thuật toán và ứng dụng cho các bài toán có thuật toán đểgiải

1.2.1 Kỹ thuật đệ quy

Đệ quy là một khái niệm cơ bản trong toán học và tin học Ta nói một đốitượng là đệ quy nếu nó được định nghĩa qua chính nó hoặc một đối tượng cùngdạng với chính nó bằng quy nạp Ý tưởng của kỹ thuật đệ quy đó là chia bài toáncần giải quyết thành nhiều bài toán nhỏ hơn, việc chia này thực hiện cho đến khibài toán con có lời giải và lời giải này thường là tường minh và tương đối đơngiản

Ví dụ: Kí hiệu |S| là số các phần tử của tập hữu hạn S

Nếu S= thì |S|=0

Ngược lại S≠ thì tất có một phần tử xS khi đó |S|=|S\{x}|+1

Khái niệm giải thuật đệ quy: Một bài toán T được thực hiện bằng giải

thuật của một bài toán T’ có dạng giống như T thì giải thuật đó gọi là giải thuật

đệ quy

Bài toán T’ tuy có dạng giống bài toán T nhưng T’ theo một nghĩa nào đóphải là bài toán nhỏ hơn T Bài toán T’ phải dễ giải hơn bài toán T và việc giảibài toán T’ không cần dùng đến T

Trang 17

Do đó phương pháp chung sử dụng kỹ thuật đệ quy để giải một bài toán là

ta chia bài toán đó thành các bài toán con đơn giản hơn cùng loại Phương phápnày còn được gọi là kỹ thuật lập trìnhchia để trị Chính nó là chìa khóa để thiết

kế nhiều giải thuật quan trọng, là cơ sở của phương pháp quy hoạch động Sauđây là một số ví dụ về bài toán mang bản chất đệ quy:

Ví dụ 1: Bài toán tính n giai thừa.

Cho n là một số tự nhiên (n0) Hãy tính giai thừa của n Biết rằng 0!=1

Trang 18

Cứ như vậy cho đến khi n=1 và n=2

Đặc trưng của các bài toán có thể giải bằng đệ quy:

 Các bài toán phụ thuộc tham số;

 Ứng với các giá trị đặc biệt nào đó của tham số thì bài toán có lời giải (trườnghợp suy biến) Phần này quan trọng vì nó quyết định tính dừng của thuậttoán;

 Trong trường hợp tổng quát bài toán có thể quy về dạng tương tự với một bộgiá trị mới của tham số và sau hữu hạn lần sẽ dẫn tới trường hợp suy biến.Phối hợp lời giải của các bài toán con để có được lời giải cho bài toán banđầu cần giải quyết

Lược đồ giải thuật đệ quy:

Ví dụ: Sau đây là thuật toán Tính n! (n0)

S(n): int ; //Hàm đệ quy tính giá trị n giai thừa

if (n=0) then S=1

Trang 19

1.2.2 Phương pháp chia để trị (Divide and Conquer)

Trong thực tế có nhiều thuật toán hữu ích được sử dụng có bản chất đệquy, tức là trong thuật toán có lời gọi đến chính nó một hoặc nhiều lần để giảibài toán tương tự nhưng với kích thước dữ liệu vào nhỏ hơn

Phương pháp chia để trị có tư tưởng là chia bài toán ban đầu thành các bàitoán con tương tự Các bài toán con tiếp tục được chia nhỏ hơn, cứ chia liên tiếpnhư vậy cho tới khi gặp bài toán con đã có lời giải hoặc có thể dễ dàng đưa ra lờigiải Sau đó lần lượt giải các bài toán con này và kết hợp các kết quả lại với nhau

ta thu được kết quả cần tìm của bài toán ban đầu

Lược đồ tổng quát thuật toán chia để trị với mô hình đệ quy như sau: Chia_tri(A, x) ; //Tìm nghiệm x của bài toán A

if (A đủ nhỏ) then Giai(A) //Giải bài toán con đủ nhỏ

else

<Chia A thành các bài toán con A1, A2, , An>;

for i=1 to n do Chia_tri(Ai, xi);

<Kết hợp các nghiệm xi để được x>;

endelse;

Trang 20

1.2.3 Phương pháp quay lui (Backtracking)

Tư tưởng của thuật toán quay lui đó là tìm nghiệm của bài toán bằng cáchxem xét tất cả các phương án có thể Ta có thể thử duyệt các phương án cho đếnkhi tìm thấy phương án đúng còn gọi là phương pháp thử sai Với tốc độ xử línhanh của máy vi tính thì phương pháp này có thể giải quyết được nhiều bài toántuy nhiên nếu kích thước bài toán quá lớn thì nó trở nên không phù hợp Bởi vìnếu kích thước bài toán lớn thì kéo theo thời gian duyệt các phương án và độphức tạp về mặt không gian cũng lớn và có thể lớn đến mức nào đó không thểchấp nhận được Do đó phương pháp này thường chỉ hữu dụng với các bài toán

có kích thước nhỏ

Không mất tổng quát, việc tìm nghiệm của nhiều bài toán có thể quy vềviệc tìm véc tơ hữu hạn X=x , x , , x , 1 2 n  độ dài véc tơ có thể xác định trướchoặc không tùy thuộc vào điều kiện của bài toán Trong đó các thành phần xi

thuộc một tập hữu hạn nào đó sao cho véc tơ X thỏa mãn một số điều kiện theo

Trang 21

yêu cầu đề bài Tùy từng bài toán cụ thể mà ta có thể quy về tìm một véc tơ hoặctìm tất cả các véc tơ hoặc đếm các véc tơ thỏa mãn yêu cầu bài toán đặt ra.

Lược đồ tổng quát thuật toán quay lui với mô hình đệ quy như sau:

Một số lưu ý khi giải bài toán bằng thuật toán quay lui:

 Phải biểu diễn được nghiệm của bài toán dưới dạng một dãy các đối tượngnhư véc tơ X mà các thành phần được chọn dần từng bước từ x1, x2, , xi, cho đến hết các thành phần của véc tơ X

 Xác định được tập hữu hạn Si chứa các phương án có thể của xi

 Tìm các điều kiện để một véc tơ X được chọn là nghiệm của bài toán

Ví dụ Bài toán tổ hợp:

Hãy xác định tất cả các tổ hợp chập k của n phần tử Để đơn giản ta chỉ xétbài toán tìm các tổ hợp của tập các số nguyên đầu tiên từ 1 đến n

Phân tích bài toán:

 Input: k, n nguyên dương

 Output: Tất cả các tổ hợp chập k của n

Theo toán học ta đã biết số tổ hợp k của n được tính theo công thức sau:

k n

n!

C k!(n k)!

Chẳng hạn với k=2 và n=3 thì có số tổ hợp là: 2

Trang 22

Với S = {1, 2, 3} Các tổ hợp chập 2 của 3 phần tử số nguyên dương đầutiên là: {1, 2}; {1, 3}; {2, 3}.

Tổng quát nghiệm X của bài toán tìm tổ hợp chập k của n số nguyêndương đầu tiên phải thỏa mãn các điều kiện sau đây:

 Véc tơ X = x , x , , x ;1 2 k

 Tập S = {1, 2, 3, , n-1, n} và xi  S;

 Vì tập hợp không phân biệt thứ tự các phần tử nên ta sắp xếp thứ tự các phần

tử để tránh bị sót nghiệm và không có hai nghiệm nào trùng nhau, chẳng hạn:

xi < xi+1

 Tìm tất cả các cấu hình thỏa mãn

Thuật toán quay lui như sau:

Tohop(i); //Tìm kiếm thành phần thứ i thỏa mãn

for j=x[i-1] +1 to n-k+i do

án mà cho rằng nó sẽ không đưa đến kết quả đúng ở bước thứ i nào đó Do đóphương pháp nhánh cận tiết kiệm được thời gian tính toán và không gian lưu trữ

Có thể nói nhánh cận là một cải tiến của phương pháp quay lui, áp dụng để giải

Trang 23

một bài toán tối ưu Trong đó, bài toán tối ưu là bài toán yêu cầu tìm phương ántốt nhất theo một tiêu chí nào đó.

Giả sử nghiệm của bài toán biểu diễn bởi một véc tơ hữu hạn X=

điều kiện của bài toán Trong đó các thành phần xi thuộc một tập hữu hạn nào đósao cho véc tơ X thỏa mãn một số điều kiện theo yêu cầu đề bài đồng thời thỏamãn hàm mục tiêu f(X) Xét các điều kiện để hàm mục tiêu f(X) phải đạt giá trịlớn nhất hoặc nhỏ nhất tùy thuộc vào yêu cầu của bài toán Sử dụng hàm mụctiêu để đánh giá độ tốt của phương án được xem xét và lựa chọn

Tư tưởng của phương pháp nhánh cận như sau: Ta xây dựng dần dần

các thành phần của nghiệm Giả sử ta đã xây dựng được k thành phần của véc tơnghiệm x , x , , x , nhiệm vụ tiếp theo là phải xây dựng được thành phần1 2 kthứ k+1 tức là tìm xk+1 cho phù hợp Trong quá trình mở rộng nghiệm như vậynếu như bằng cách nào đó có thể đánh giá được tất cả các nghiệm mở rộng của

nó x , x , , x , x , đều không tốt bằng nghiệm tốt nhất đã biết thì ta1 2 k k+1 không mở rộng nghiệm theo nhánh này nữa Như vậy thuật toán nhánh cận sẽnhanh hơn thuật toán quay lui vét cạn vì nhánh cận không phải duyệt hết tất cảcác trường hợp của bài toán Nói tóm lại, với phương pháp nhánh cận ta có thểthu hẹp phạm vi tìm kiếm nghiệm bằng cách đánh giá trong quá trình ta mở rộngcác thành phần của nghiệm để bỏ đi những nhánh chắc chắn không phải lànghiệm của bài toán Do đó phương pháp nhánh cận sẽ nhanh hơn và bớt độphức tạp về mặt không gian

Lược đồ tổng quát phương pháp nhánh cận bằng mô hình đệ quy:

<Đánh giá các nghiệm mở rộng thành phần>;

if (Các nghiệm mở rộng không tốt hơn Totnhat) then

Trang 24

Exit; //Bỏ qua các nhánh đánh giá được là không tối ưu

<Xác định Si>;

for xi  Si do

<Ghi nhận thành phần thứ i>;

if (Tìm thấy nghiệm) then

<Cập nhật Totnhat> //Tốt nhất tại thời điểm đó

else Nhanhcan(i+1);

<Loại thành phần i>;

endfor;

End.

1.2.5 Phương pháp quy hoạch động (Dynamic Programming )

Một trong những phương pháp thiết kế thuật toán giải bài toán tối ưu đólà: Quy hoạch động Tư tưởng của phương pháp quy hoạch động giống nhưphương pháp chia để trị ở chỗ chia bài toán ban đầu thành nhiều bài toán con,chia liên tiếp cho đến khi bài toán con có lời giải Sau đó việc giải quyết bài toánban đầu trở nên đơn giản hơn bằng cách kết hợp lời giải của các bài toán con.Nhưng phương pháp quy hoạch động tiên tiến hơn phương pháp chia để trị ở chỗphương pháp quy hoạch động lưu trữ lại kết quả của các bài toán con ở nhiều cấp

và sử dụng lại chúng nhiều lần mà không cần phải tính toán lại Ngược lại,phương pháp chia để trị giải các bài toán con một cách độc lập và mỗi lần nhưvậy lại phải tính toán lại một dãy các bài toán con đệ quy cần sử dụng Nên vớiphương pháp chia để trị thì một bài toán con có thể phải tính đi tính lại nhiều lầndẫn tới việc tốn thời gian tính toán Phương pháp quy hoạch động đã khắc phụcđược nhược điểm này của phương pháp chia để trị bằng cách sử dụng một bảnggọi là bảng phương án Bảng này dùng để lưu trữ lời giải của các bài toán connhiều cấp đã được giải

Trang 25

Phương pháp quy hoạch động nhìn chung được áp dụng cho lớp các bàitoán tối ưu và cho kết quả đúng Trong thuật toán giải bài toán tối ưu thườngphải giải quyết nhiều trường hợp có thể quy về các bài toán con để giải và lựachọn giải pháp tối ưu nhất của bài toán.

Các bước để giải bài toán bằng quy hoạch động gồm những công việcchính sau đây:

 Tìm nghiệm của bài toán con nhỏ nhất (Thường là trường hợp suy biến);

 Tìm công thức (gọi là công thức truy hồi) xây dựng nghiệm cho bài toáncon thông qua nghiệm của bài toán con nhỏ hơn;

 Tạo bảng phương án lưu trữ giá trị nghiệm của các bài toán con;

 Từ bảng phương án suy ra nghiệm của bài toán ban đầu cần giải

Ví dụ Số Fibonacci:

Bài toán Số Fibonacci được cho bởi công thức sau:

1 2

Trang 26

1.2.6 Phương pháp tham lam (Greedy Method)

Chúng ta đã biết quy hoạch động là một phương pháp tốt để giải các bàitoán tối ưu, tuy nhiên có nhiều bài toán trong thực tế không thể thực hiện giảiđược với phương pháp quy hoạch động có thể là do bảng phương án quá lớn, quáphức tạp hoặc thời gian tính toán không đáp ứng được yêu cầu thực tế hoặckhông thể xác định được phương án tốt nhất Và ngay cả khi sử dụng phươngpháp nhánh cận thì các phương án còn là quá phức tạp Trong những trường hợpnhư vậy thì phương pháp tham lam lại có thể thực hiện được Đặc điểm củaphương pháp này là lựa chọn giải pháp tối ưu cục bộ và hy vọng rằng lựa chọnnày sẽ dẫn đến giải pháp tối ưu toàn cục Hiện nay phương pháp tham lam là rấthiệu quả và làm việc tốt cho lớp rất rộng các bài toán Giải pháp tham lam có ưuđiểm là độ phức tạp nhỏ và thường tìm được lời giải một cách nhanh chóng

Giả sử nghiệm của bài toán biểu diễn bởi một véc tơ hữu hạn X=

tơ X thỏa mãn một số điều kiện theo yêu cầu đề bài đồng thời thỏa mãn hàmmục tiêu f(X) Xét các điều kiện để hàm mục tiêu f(X) phải đạt giá trị lớn nhấthoặc nhỏ nhất tùy thuộc vào yêu cầu của bài toán Sử dụng hàm mục tiêu đểđánh giá độ tốt của phương án được xem xét và lựa chọn

Tư tưởng của phương pháp tham lam như sau: Ta xây dựng dần dần

các thành phần của nghiệm Giả sử ta đã xây dựng được k thành phần của véc tơnghiệm x , x , , x , nhiệm vụ tiếp theo là phải xây dựng được thành phần1 2 kthứ k+1 tức là tìm xk+1 Lúc này thành phần xk+1 được lựa chọn theo tiêu chí là tốtnhất theo hàm f(X) trong tập các ứng cử viên Sk để được x , x , , x , x1 2 k k+1.

Cứ tiếp tục xây dựng như vậy cho đến hết các thành phần của nghiệm X

Với cách làm như vậy có một số bài toán nếu xây dựng được hàm f(X)thích hợp thì có thể tìm được nghiệm tối ưu Còn đối với phần nhiều bài toán ta

Trang 27

chỉ tìm được nghiệm gần đúng với nghiệm tối ưu khi sử dụng thuật toán thamlam.

Lược đồ tổng quát phương pháp tham lam:

1.3 Phân tích thuật toán

Trong lập trình việc phân tích thuật toán là không thể thiếu được Phântích để thiết kế được thuật toán đúng và hiệu quả hơn Ngay cả sau khi đã cóthuật toán rồi thì việc phân tích thuật toán vẫn là cần thiết vì sau khi thiết xongcũng không chắc chắn hoàn toàn đó là thuật toán đúng và phù hợp với yêu cầuthực tế Công việc này cũng có thể phải lặp đi lặp lại nhiều lần

Phân tích thuật toán gồm nhiều vấn đề như phân tích tính đúng, tính hiệuquả, độ phức tạp của thuật toán

1.3.1 Tính đúng đắn của thuật toán

Thiết kế xong một thuật toán câu hỏi luôn luôn phải có đó là thuật toánđược thiết kế đã đúng chưa? Cách đơn giản nhất mà được sử dụng thông dụng đó

là viết chương trình cho thuật toán đã thiết kế và chạy thử chương trình với nhiều

bộ dữ liệu vào cụ thể (tests) để kiểm tra dữ liệu ra có chuẩn xác hay chưa Tuynhiên, cách này cũng chỉ khẳng định được thuật toán đúng với các trường hợp cụthể mà thôi Có một cách khác chứng minh được thuật toán đúng đó là chứng

Trang 28

minh bằng toán học Nhưng với cách chứng minh thuật toán đúng bằng toán họcthì phức tạp hơn nhiều và đòi hỏi nhiều kiến thức tổng hợp cả về toán học và tinhọc cộng với khả năng của người thực hiện việc chứng minh thuật toán Chúng

ta sẽ nghiên cứu việc này cụ thể hơn ở các chương sau

1.3.2 Độ phức tạp thuật toán

a) Độ phức tạp về mặt thời gian

Vấn đề thời gian thực hiện thuật toán cũng là một vấn đề quan trọng vìmột thuật toán cho dù có đúng nhưng thời gian thực hiện quá lâu không đáp ứngnhu cầu thực tế thì cũng sẽ không thể hoặc ít được sử dụng Nên đối với thuậttoán người ta luôn quan tâm đến vấn đề sao cho có thể cải tiến để thuật toánnhanh hơn (nhưng chưa chắc ít phức tạp hơn) Để đánh giá về thời gian thựchiện thuật toán ta có thể viết chương trình, chạy thử và đánh giá thời gian thựckhi chạy chương trình Cách này tuy là có thể thực hiện được nhưng lại phụthuộc vào tốc độ của từng loại máy tính do có thể nhanh trên máy này nhưng lạichậm trên máy khác Để hạn chế nhược điểm phụ thuộc vào phần cứng máy tínhnhư vậy người nghiên cứu phương pháp đánh giá bằng toán học Cách này tuykhó thực hiện hơn, phức tạp hơn nhưng đánh giá được ngay cả với dữ liệu cókích thước lớn Nhưng với đề tài của luận văn ta không nghiên cứu thêm về vấn

đề này

b) Độ phức tạp về mặt không gian

Không gian ở đây là sự đánh giá về tài nguyên mà chương trình sử dụng,chủ yếu là bộ nhớ máy tính Do bộ nhớ máy tính là hữu hạn nên nếu dữ liệu đầuvào và các dữ liệu cần lưu trữ trong quá trình xử lý quá lớn vượt quá không gian

bộ nhớ, các thiết bị lưu trữ cho phép thì chương trình không thể chạy được Dovậy khi thiết kế thuật toán hay lựa chọn thuật toán, lựa chọn ngôn ngữ lập trình

để viết chương trình ta cũng phải qua tâm đến những vấn đề này để đạt hiệu quảmong muốn

Trang 29

CHƯƠNG 2 MỘT SỐ PHƯƠNG PHÁP CHỨNG MINH TÍNH ĐÚNG

CỦA THUẬT TOÁN

Chúng ta đã biết thuật toán là vô cùng quan trọng và có thể nói là thuậttoán mang tính chất quyết định để giải một bài toán trên máy tính Nhưng mộtthuật toán vừa thiết kế xong chưa thể khẳng định được ngay là thuật toán đó cóđúng hay không Ở chương này nghiên cứu tổng quan về các chiến lược chứngminh tính đúng của thuật toán Nghiên cứu chi tiết về chiến lược chứng minhtính đúng của thuật toán một cách trực tiếp dựa vào toán học mà không cần chạycác bộ test chương trình cụ thể

2.1 Các chiến lược chứng minh tính đúng thuật toán

Để kiểm tra thuật toán có đúng hay không ta có nhiều chiến lược nhưkiểm thử, chứng minh tính đúng hoặc kết hợp cả kiểm thử và chứng minh tínhđúng nhưng mỗi chiến lược đều có ưu, nhược điểm riêng Sau đây là một số đặcđiểm sơ lược về mỗi chiến lược

a) Kiểm thử (Testing):

Để kiểm tra tính đúng đắn của thuật toán chúng ta có thể cài đặt thuật toán

đó và cho thực hiện trên máy với một số bộ dữ liệu mẫu rồi lấy kết quả thu được

so sánh với kết quả đã biết Có thể phải có rất nhiều bộ dữ liệu vào với kích cỡkhác nhau mới kiểm tra được hết các trường hợp của bài toán đặt ra nhưng cũng

có khả năng người lập trình không phát hiện ra hết các trường hợp Thực ra thìcách làm này không chắc chắn bởi vì có thể thuật toán đúng với tất cả các bộ dữliệu chúng ta đã thử nhưng lại sai với một bộ dữ liệu nào đó Do đó với chiếnlược này là tương đối dễ thực hiện nhưng lại không thể phát hiện hết các lỗi tiểm

ẩn Vả lại cách làm này chỉ phát hiện ra thuật toán sai chứ chưa chứng minhđược là nó đúng Tính đúng đắn của thuật toán cần phải được chứng minh bằngtoán học Tuy nhiên kiểm thử vẫn được sử dụng phổ biến cho các chương trình

Trang 30

trong thực tế, vì các chương trình lớn khó có thể chứng minh hoàn toàn bằngtoán học Hiện nay, trong công nghệ phần mềm công đoạn kiểm thử là bắt buộc.

b) Chứng minh tính đúng (Correctness proof):

Với chiến lược chứng minh tính đúng của thuật toán cần dùng các kiếnthức toán học để chứng minh thuật toán đúng Cách này chứng minh được chobài toán tổng quát nhưng đòi hỏi tư duy trừu tượng và logic toán học chặt chẽ

Có các phương pháp chứng minh tính đúng của thuật toán như phương pháp quynạp, phương pháp bất biến vòng lặp Đây cũng là nội dung nghiên cứu chủ yếukhi thực hiện luận văn này

c) Kết hợp kiểm thử và chứng minh tính đúng:

Để đảm bảo tính đúng của thuật toán một cách chặt chẽ hơn nữa ta có thểkết hợp cả hai chiến lược kiểm thử và chứng minh tính đúng đã nêu ở trên

2.2 Các phương pháp chứng minh tính đúng (Correctness proofs)

Làm thế nào để biết thuật toán hoạt động thế nào? Cách tốt nhất là chứngminh thuật toán là đúng Có một số phương pháp chứng minh tính đúng củathuật toán như: Đối với các thuật toán đệ quy có thể chứng minh tính đúng bằngphương pháp quy nạp Đối với các thuật toán không đệ quy có thể sử dụngphương pháp bất biến vòng lặp cho mọi vòng lặp

2.2.1 Phương pháp quy nạp (induction)

a) Phương pháp quy nạp toán học

Gọi P(n) là một phát biểu nào đó liên quan đến biến số tự nhiên n (n ≥ n0).Chứng minh bằng quy nạp sẽ gồm các bước sau:

Bước 1: gọi là bước khởi điểm Chúng ta sẽ chứng minh P(n) đúng cho

trường hợp đầu tiên n = n0

Trang 31

Bước 2: gọi là bước quy nạp Đây là bước quan trọng nhất Ở bước này,

giả sử rằng P(n) đúng cho các trường hợp n0 ≤ n ≤ k, chúng ta cần chứngminh P(n) cũng đúng với trường hợp n = k+1

Từ hai bước này, theo nguyên lý quy nạp toán học, chúng ta sẽ kết luậnrằng P(n) sẽ đúng với mọi số tự nhiên n ≥ n0

Cách sử dụng phương pháp quy nạp toán học để chứng minh tính đúngcủa thuật toán sẽ được trình bày cụ thể sau đây

b) Chứng minh tính đúng của thuật toán bằng phương pháp quy nạp

Các thuật toán nếu chỉ có các dòng lệnh đơn lẻ không có chứa đệ quy haylặp thì ta dễ dàng thấy được tính đúng của nó nhưng với các thuật toán có chứa

đệ quy hay vòng lặp thì việc chứng minh trở nên phức tạp hơn Sau đây ta sửdụng phương pháp quy nạp toán học đã nêu ở trên để chứng minh tính đúng củathuật toán đệ quy

Ta sẽ chứng minh tính đúng của thuật toán đệ quy bằng phương pháp quynạp theo kích thước dữ liệu vào như sau:

 Cơ sở của quy nạp: Trường hợp suy biến của đệ quy Đây cũng chính là điềukiện phải có để thuật toán có tính dừng

 Giả thiết quy nạp: Giả sử thuật toán đúng với dữ liệu kích thước n

 Tổng quát: Chứng minh thuật toán đúng với dữ liệu kích thước n+1

c) Một số ví dụ

Bài toán 2.1 Tính giai thừa.

Tính giai thừa của một số nguyên dương n cho trước

 Input: Số nguyên dương n

 Output: n!

Thuật toán:

Giaithua(n): int; //Hàm đệ quy tính n!

Trang 32

if (n = 0) or (n = 1) then return 1

End.

Chứng minh:

Chứng minh tính đúng của thuật toán theo phương pháp quy nạp như sau:

 Cơ sở quy nạp: Với n = 0 hoặc n = 1 thì Giaithua(0) = Giaithua(1) = 1 Tứclà: 0! = 1! = 1 Như vậy thuật toán luôn đúng trong trường hợp cơ sở

 Giả thiết quy nạp: Giả sử thuật toán đúng với n Tức là ta có: Giaithua(n) = n!

 Tổng quát: ta chứng minh thuật toán đúng đắn với n+ 1, tức là phải chứngminh Giathua(n + 1) = (n + 1)! Thật vậy:

Ta có: Giaithua(n + 1) = (n + 1)*Giaithua(n)

= (n + 1)*n! //Theo giả thiết quy nạp = (n + 1)!

Vậy thuật toán tính giai thừa của số nguyên dương n là thuật toán đúng

Bài toán 2.2 Tìm max.

Tìm giá trị lớn nhất của một dãy số có n phần tử A1, A2,…, An

Input: Số nguyên dương n và dãy số A1, A2,…, An

 Output: max

Thuật toán đệ quy:

Maximum(n); //Trả về giá trị max của dãy số có n phần tử

Trang 33

 Giả thiết quy nạp: Maximum(n) trả lại giá trị max(A1, A2, …, An).

 Tổng quát: Maximum(n+1) trả lại max(Maximum(n), An+1) = max(A1, A2, …,

An, An+1)

Như vậy theo phương pháp chứng minh quy nạp thuật toán đệ quy tìm giátrị max là thuật toán đúng

Bài toán 2.3 Tháp Hà Nội.

Phát biểu bài toán: Khởi đầu có 3 cọc, trong đó có 2 cọc rỗng và một cọc

chứa một số lượng nhất định các đĩa kích thước khác nhau xếp theo thứ tự bé ởtrên, lớn ở dưới Trò chơi kết thúc khi toàn bộ đĩa từ một cọc ban đầu đượcchuyển sang một cọc khác theo đúng thứ tự bé ở trên, lớn ở dưới Với yếu cầukhi chuyển như sau:

 Mỗi lần chỉ được di chuyển một đĩa từ cọc này sang cọc khác

 Khi di chuyển phải di chuyển đĩa ở trên cùng

 Khi đặt đĩa vào cọc nào đó cũng phải đặt ở trên cùng

 Không được phép đặt đĩa to hơn lên trên đĩa bé hơn

Ngày đăng: 17/06/2016, 23:00

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Hồ Sĩ Đàm (Chủ biên) – Đỗ Đức Đông – Lê Minh Hoàng – Nguyễn Thanh Tùng (2012), Tài liệu chuyên Tin học, quyển(1) tr.5-185, quyển(2) tr.111-165, NXB Giáo dục Việt Nam Sách, tạp chí
Tiêu đề: Hồ Sĩ Đàm (Chủ biên) – Đỗ Đức Đông – Lê Minh Hoàng – NguyễnThanh Tùng (2012), "Tài liệu chuyên Tin học
Tác giả: Hồ Sĩ Đàm (Chủ biên) – Đỗ Đức Đông – Lê Minh Hoàng – Nguyễn Thanh Tùng
Nhà XB: NXB Giáo dục Việt Nam
Năm: 2012
2. Nguyễn Hữu Điển (2006), Một số vấn đề về thuật toán, NXB Giáo Dục Sách, tạp chí
Tiêu đề: Nguyễn Hữu Điển (2006), "Một số vấn đề về thuật toán
Tác giả: Nguyễn Hữu Điển
Nhà XB: NXB Giáo Dục
Năm: 2006
3. Đỗ Đức Giáo (1998), Cơ sở Toán trong lập trình, NXB Khoa học và Kỹ thuật Sách, tạp chí
Tiêu đề: Đỗ Đức Giáo (1998), "Cơ sở Toán trong lập trình
Tác giả: Đỗ Đức Giáo
Nhà XB: NXB Khoa học và Kỹthuật
Năm: 1998
4. Lê Minh Hoàng (2004), Cấu trúc dữ liệu và giải thuật, NXB Đại học Sư phạm Hà Nội Sách, tạp chí
Tiêu đề: Lê Minh Hoàng (2004), "Cấu trúc dữ liệu và giải thuật
Tác giả: Lê Minh Hoàng
Nhà XB: NXB Đại học Sưphạm Hà Nội
Năm: 2004
5. Nguyễn Xuân Huy (2009), Sáng tạo trong thuật toán và lập trình, tập(1), tập(2), NXB Duy Tân Sách, tạp chí
Tiêu đề: Nguyễn Xuân Huy (2009), "Sáng tạo trong thuật toán và lập trình
Tác giả: Nguyễn Xuân Huy
Nhà XB: NXB Duy Tân
Năm: 2009
6. Nguyễn Thị Hồng Minh (2014), Lecture 01 – Preliminaries, Lecture 02 - Methods using Recursice Technique, Lecture 03 – Compromise principle based Methods Sách, tạp chí
Tiêu đề: Nguyễn Thị Hồng Minh (2014)
Tác giả: Nguyễn Thị Hồng Minh
Năm: 2014
7. Nguyễn Hữu Ngự (2001), Lý thuyết đồ thị, NXB Đại học Quốc gia Hà Nội Sách, tạp chí
Tiêu đề: Nguyễn Hữu Ngự (2001), "Lý thuyết đồ thị
Tác giả: Nguyễn Hữu Ngự
Nhà XB: NXB Đại học Quốc gia HàNội
Năm: 2001
8. Hoàng Chí Thành (Chủ biên) (2004), Các thuật toán thông dụng, chương 1, 2, 4, 15, 16, 22, 23, 24, 25 Sách, tạp chí
Tiêu đề: Hoàng Chí Thành (Chủ biên) (2004), "Các thuật toán thông dụng
Tác giả: Hoàng Chí Thành (Chủ biên)
Năm: 2004
9. Đặng Huy Ruận (2004), Lý thuyết đồ thị và ứng dụng, NXB Khoa học và Kỹ thuật - Hà Nội Sách, tạp chí
Tiêu đề: Đặng Huy Ruận (2004), "Lý thuyết đồ thị và ứng dụng
Tác giả: Đặng Huy Ruận
Nhà XB: NXB Khoa học vàKỹ thuật - Hà Nội
Năm: 2004

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w