Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 79 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
79
Dung lượng
1,61 MB
Nội dung
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 1 ĐẠI HỌC THÁI NGUYÊN TRƢỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN&TRUYỀN THÔNG Đỗ Tuấn Anh TỔ CHỨC DỮ LIỆU CHO LỚP THUẬT TOÁN CHIA ĐỂ TRỊ VÀ ỨNG DỤNG Chuyên ngành: Khoa học máy tính Mã số: 60.48.01 TÓM TẮT LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH Thái Nguyên - 2014 Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 2 LỜI CAM ĐOAN Tôi xin cam đoan đây là công trình nghiên cứu của bản thân, được xuất phát từ yêu cầu phát sinh trong công việc để hình thành hướng nghiên cứu. Các số liệu có nguồn gốc rõ ràng tuân thủ đúng nguyên tắc và kết quả trình bày trong luận văn được thu thập được trong quá trình nghiên cứu là trung thực chưa từng được ai công bố trước đây. Thái Nguyên, ngày 19 tháng 5 năm 2014 Học viên thực hiên Đỗ Tuấn Anh Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 3 LỜI CẢM ƠN Đầu tiên, em xin gửi lời cảm ơn sâu sắc nhất đến cán bộ hướng dẫn khoa học, thầy giáo, PGS.TSKH Nguyễn Xuân Huy, người đã truyền cho em nguồn cảm hứng nghiên cứu khoa học, người đã định hướng cho em đến với lĩnh vực nghiên cứu này. Em xin bày tỏ lời cảm ơn tới các thầy giáo, cô giáo đã giảng dạy em trong suốt hai năm học qua. Em cũng muốn gửi lời cảm ơn tới những thành viên lớp đã có những góp ý chuyên môn cũng như sự động viên về tinh thần rất đáng trân trọng. Cuối cùng, em xin gửi lời cảm ơn sâu sắc tới tất cả người thân trong gia đình và những bạn bè em với những động viên dành cho em trong công việc và trong cuộc sống. Học viên thực hiện luận văn Đỗ Tuấn Anh Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 4 MỤC LỤC Trang Lời cam đoan Lời cảm ơn Mục lục iii Danh mục các bảng v Danh mục các hình vẽ v MỞ ĐẦU 1 CHƢƠNG 1. CÁC CHIẾN LƢỢC THIẾT KẾ THUẬT TOÁN 2 1.1 Các bước cơ bản khi giải bài toán trên máy tính 2 1.2 Phân tích thời gian thực hiện thuật toán 6 1.2.1 Độ phức tạp thuật toán 6 1.2.2 Xác định độ phức tạp của thuật toán 9 1.2.3 Ký hiệu Big-O và biểu diễn thời gian chạy của thuật toán 10 1.2.4 Độ phức tạp thuật toán với tình trạng dữ liệu vào 13 1.2.5 Chi phí thực hiện thuật toán 13 CHƢƠNG 2. TỔ CHỨC DỮ LIỆU CHO LỚP THUẬT TOÁN CHIA ĐỂ TRỊ 14 2.1 Chiến lược chia để trị 14 2.2 Tổ chức dữ liệu cho lớp thuật toán chia để trị 15 2.3 Định lý tổng quát tính độ phức tạp các thuật toán chia để trị 16 2.4 Một số lớp bài toán điển hình 17 2.4.1 Lớp bài toán tìm kiếm 18 2.4.1.1 Thuật toán tìm kiếm nhị phân 18 2.4.1.2 Bài toán tìm Max và min 20 2.4.2 Lớp bài toán sắp xếp 22 2.4.2.1 Thuật toán sắp xếp trộn (Merge Sort) 22 2.4.2.2 Thuật toán sắp xếp nhanh (Quick Sort) 24 2.4.3 Lớp bài toán tối ưu 27 2.4.3.1 Bài toán dãy con dài nhất 27 2.3.3.2 Bài toán tháp Hà Nội 29 2.3.3.5 Bài toán xếp lịch thi đấu 30 CHƢƠNG 3. ỨNG DỤNG THUẬT TOÁN CHIA ĐỂ TRỊ GIẢI BÀI TOÁN NHÂN HAI SỐ NGUYÊN LỚN 32 3.1 Mô tả bài toán 32 3.2 Thuật toán nhân tự nhiên 32 3.3 Thuật toán nhân cơ bản 33 Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 5 3.4 Thuật toán nhân Karatsuba-Ofman 35 3.5 Thuật toán nhân dựa trên biến đổi Fourier nhanh 37 3.6 Thuật toán nhân chia để trị 40 3.6.1 Ý tưởng chung 40 3.6.2 Phân tích thuật toán 41 3.6.3 Mô hình thuật toán chia để trị cho bài toán nhân hai số nguyên lớn 44 3.6.4 So sánh độ phức tạp giữa các thuật toán 46 3.7 Tổ chức dữ liệu cho thuật toán chia để trị 46 3.7.1 Biểu diễn dưới dạng bit 46 3.7.2 Biểu diễn dùng mảng và xâu 47 3.8 Thực nghiệm và đánh giá 51 3.8.1 Cài đặt trên C 51 3.8.2 Cài đặt trên C# 59 KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN 64 TÀI LIỆU THAM KHẢO 65 Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 6 DANH MỤC CÁC BẢNG Bảng 1.1 Các lớp độ phức tạp tính toán 11 Bảng 1.2 Thời gian chạy của các lớp thuật toán 12 Bảng 2.1 Độ phức tạp của thuật toán tìm kiếm nhị phân 20 Bảng 2.2 Độ phức tạp của thuật toán sắp xếp nhanh 26 Bảng 3.1 So sánh độ phức tạp tính toán của các thuật toán nhân 46 DANH MỤC CÁC HÌNH Hình 2.1 Thuật toán chia để trị 14 Hình 2.2 Tổ chức dữ liệu cho lớp bài toán chia để trị 15 Hình 2.3 Ví dụ thuật toán sắp xếp trộn 23 Hình 3.1 Thuật toán nhân Brute-force 33 Hình 3.2 Thuật toán nhân chuẩn 34 Hình 3.3 Thuật toán nhân SRMA 35 Hình 3.4 Thuật toán nhân Karatsuba-Ofman 37 Hình 3.5 Thuật toán nhân FFT 39 Hình 3.6 Thuật toán nhân chia để trị 45 Hình 3.7 Phép nhân chia để trị tổ chức dưới dạng bit 46 Hình 3.8 Thuật toán nhân chia để trị biểu diễn bit 47 Hình 3.9 Ví dụ về phép chia Ấn Độ Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 7 MỞ ĐẦU .Ngày nay phương pháp này vẫn còn được áp dụng trong nhiều lĩnh vực của đời sống. Đặc biệt, phương pháp này rất hiệu quả khi thiết kế thuật toán giải các bài toán lớn, phức tạp. Với bài toán đầu vào rất lớn ta chia thành những phần nhỏ hơn và tìm lời giải cho các bài toán nhỏ riêng biệt này, rồi sau đó tổng hợp các nghiệm riêng rẽ thành nghiệm bài toán toàn cục. Trong luận văn này, tôi sẽ tập trung phân tích việc tổ chức dữ liệu cho lớp thuật toán chia để trị và cách đánh giá độ phức tạp đối với các thuật toán chia để trị.Với mục tiêu chính là áp dụng thiết kế thuật toán chia để trị để giải quyết bài toán nhân hai số nguyên lớn, luận văn được trình bày trong 3 chương với bố cục như sau: Chƣơng 1: Các chiến lƣợc thiết kế thuật toán. Giới thiệu tổng quan về các bước giải bài toán trên máy tính và phân tích đánh giá thời gian thực hiện thuật toán cùng các chiến lược thiết kế thuật toán cơ bản. Chƣơng 2: Tổ chức dữ liệu cho lớp thuật toán chia để trị.Trình bày ý tưởng, cơ sở khoa học của thuật toán chia để trị và cách thức tổ chức dữ liệu cho thuật toán chia để trị với các bài toán kinh điển. Chƣơng 3: Ứng dụng thuật toán chia để trị giải bài toán nhân hai số nguyên lớn. Tập trung phân tích các cách tiếp cận giải bài toán nhân hai số nguyên lớn. Từ đó đề xuất thuật toán dựa trên tư tưởng chia để trị để giải quyết và thực nghiệm so sánh với các cách tiếp cận trước đó. Cuối cùng là kết luận và hƣớng phát triển:Tóm tắtnhững kết quả đạt được, những hạn chế và nêu lên các hướng phát triển trong tương lai. Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 8 CHƢƠNG 1. CÁC CHIẾN LƢỢC THIẾT KẾ THUẬT TOÁN 1.1 Các bƣớc cơ bản khi giải bài toán trên máy tính Một thuật toán một thủ tục tính toán được định nghĩa chính xác, mà lấy một giá trị hoặc một tập các giá trị, được gọi là đầu vào hay dữ liệu vào và tạo ra một giá trị, hoặc một tập các giá trị, và gọi là đầu ra. Miêu tả một vấn đề thường được xác định nói chungqua quan hệ đầu vào/đầu ra. Một thuật toán là một dãy bước xác định để chuyển đổi dữ liệu đầu vào thành dữ liệu đầu ra. Chúng ta có thể xem một thuật toán như một công cụ để giải quyết một vấn đề tính toán. Việc trình bày rõ ràng một vấn đề nói chung hình thành mối quan hệ mong muốn đầu vào/đầu ra. Một thuật toán mô tả chính xác một thủ tục tính toán để đạt được mối liên hệ giữa dữ liệu đầu vào và dữ liệu đầu ra. 1.1.1 Xác định bài toán Việc xác định bài toán tức là phải xác định xem ta phải giải quyết vấn đề gì? với giả thiết nào đã cho và lời giải cần phải đạt những yêu cầu nào. Khác với bài toán thuần tuý toán học chỉ cần xác định rõ giả thiết và kết luận chứ không cần xác định yêu cầu về lời giải, đôi khi những bài toán tin học ứng dụng trong thực tế chỉ cần tìm lời giải tốt tới mức nào đó, thậm chí là tồi ở mức chấp nhận được. Bởi lời giải tốt nhất đòi hỏi quá nhiều thời gian và chi phí. Input → Process → Output (Dữ liệu vào →Xử lý →Kết quả ra) Ví dụ: Khi cài đặt các hàm số phức tạp trên máy tính. Nếu tính bằng cách khai triển chuỗi vô hạn thì độ chính xác cao hơn nhưng thời gian chậm hơn hàng tỉ lần so với phương pháp xấp xỉ. Trên thực tế việc tính toán luôn luôn cho phép chấp nhận một sai số nào đó nên các hàm số trong máy tính đều được tính bằng phương pháp xấp xỉ của giải tích số. Xác định đúng yêu cầu bài toán là rất quan trọng bởi nó ảnh hưởng tới cách thức giải quyết và chất lượng của lời giải. Một bài toán thực tế thường cho bởi những thông tin khá mơ hồ và hình thức, ta phải phát biểu lại một cách chính xác và chặt chẽ để hiểu đúng bài toán. Trên thực tế, ta nên xét một vài trường hợp cụ thể để thông qua đó hiểu được bài toán rõ hơn và thấy được các thao tác cần phải tiến hành. Đối với những bài toán đơn giản, đôi khi chỉ cần qua ví dụ là ta đã có thể đưa về một bài toán quen thuộc để giải. 1.1.2 Tìm cấu trúc dữ liệu biểu diễn bài toán Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 9 Khi giải một bài toán, ta cần phải định nghĩa tập hợp dữ liệu để biểu diễn tình trạng cụ thể. Việc lựa chọn này tuỳ thuộc vào vấn đề cần giải quyết và những thao tác sẽ tiến hành trên dữ liệu vào. Có những thuật toán chỉ thích ứng với một cách tổ chức dữ liệu nhất định, đối với những cách tổ chức dữ liệu khác thì sẽ kém hiệu quả hoặc không thể thực hiện được. Chính vì vậy nên bước xây dựng cấu trúc dữ liệu không thể tách rời bước tìm kiếm thuật toán giải quyết vấn đề. Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu: - Phải biểu diễn được đầy đủ các thông tin nhập và xuất của bài toán - Phù hợp với các thao tác của thuật toán mà ta lựa chọn để giải quyết bài toán. - Phải cài đặt được trên máy tính với ngôn ngữlập trình đang sửdụng. Đối với một sốbài toán, trước khi tổchức dữliệu ta phải viết một đoạn chương trình nhỏ để khảosátxem dữliệu cần lưu trữlớn tới mức độnào. 1.1.3 Xây dựng thuật toán Thuật toán là một hệ thống chặt chẽ và rõ ràng các quy tắc nhằm xác định một dãy thao tác trên cấu trúc dữ liệu sao cho: Với một bộ dữ liệu vào, sau một số hữu hạn bước thực hiện các thao tác đã chỉ ra, ta đạt được mục tiêu đã định.Các đặc trưng của thuật toán: 1. Tính đơn định: Ở mỗi bước của thuật toán, các thao tác phải hết sức rõ ràng, không gây nên sự nhập nhằng, lộn xộn, tuỳ tiện, đa nghĩa. Thực hiện đúng các bước của thuật toán thì với một dữ liệu vào, chỉ cho duy nhất một kết quả ra. 2. Tính dừng: Thuật toán không được rơi vào quá trình vô hạn, phải dừng lại và cho kết quả sau một số hữu hạn bước. 3. Tính đúng: Sau khi thực hiện tất cả các bước của thuật toán theo đúng quá trình đã định, ta phải được kết quả mong muốn với mọi bộ dữ liệu đầu vào. Kết quả đó được kiểm chứng bằng yêu cầu bài toán. 4. Tính phổ dụng: Thuật toán phải dễ sửa đổi để thích ứng được với bất kỳ bài toán nào trong một lớp các bài toán và có thể làm việc trên các dữ liệu khác nhau. 5. Tính khả thi:Đối với một bài toán, có thể có nhiều thuật toán nhưng chúng phải cho cùng một output đối với một input. Tuy nhiên chúng có thể khác nhau về hiệu quả. Hiệu quả thời gian là tốc độ xử lý là nhanh hay chậm. Ta có thể đánh giá căn cứ vào số bước thực hiện. Hiệu quả không gian là không gian lưu trữ theo số các đối tượng dùng để ghi nhớ các kết quả (kể cả kết quả trung gian). Trong Tin học có cả một ngành chuyên đánh giá độ phức tạp của giải thuật, chủ yếu là đánh giá về hiệu quả thời gian. Thực tế sử dụng cho thấy thách thức về không gian lưu trữ có thể giải quyết dễ hơn thách thức về thời gian thực hiện. Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 10 1.1.4 Lập trình Sau khi đã có thuật toán, ta phải tiến hành lập trình thể hiện thuật toán đó. Muốn lập trình đạt hiệu quả cao, cần phải có kỹ thuật lập trình tốt. Kỹ thuật lập trình tốt thể hiện ở kỹ năng viết chương trình, khả năng gỡ rối và thao tác nhanh. Lập trình tốt không phải chỉ cần nắm vững ngôn ngữ lập trình là đủ mà phải biết cách viết chương trình uyển chuyển, phát triển từng bước để chuyển các ý tưởng ra thành chương trình hoàn chỉnh. Kinh nghiệm cho thấy một thuật toán hay nhưng do cài đặt vụng về nên khi chạy lại cho kết quả sai hoặc tốc độ chậm. Thông thường, chúng ta không nên cụ thể hoá ngay toàn bộ chương trình mà nên tiến hành theo phương pháp tinh chế từng bước (Stepwiserefinement): - Ban đầu, chương trình được thể hiện bằng ngôn ngữ tự nhiên, thể hiện thuật toán với các bước tổng thể, mỗi bước nêu lên một công việc phải thực hiện. - Một công việc đơn giản hoặc là một đoạn chương trình đã được học thuộc thì ta tiến hành viết mã lệnh ngay bằng ngôn ngữ lập trình. - Một công việc phức tạp thì ta lại chia ra thành những công việc nhỏ hơn để lại tiếp tục với những công việc nhỏ hơn đó. Trong quá trình tinh chế từng bước, ta phải đưa ra những biểu diễn dữ liệu. Như vậy cùng với sự tinh chế các công việc, dữ liệu cũng được tinh chế dần, có cấu trúc hơn, thể hiện rõ hơn mối liên hệ giữa các dữ liệu.Phương pháp tinh chếtừng bước là một thểhiện của tưduy giải quyết vấn đềtừtrên xuống, giúpcho người lập trình có được một định hướng thểhiện trong phong cách viết chương trình. Tránhviệc mò mẫm, xoá đi viết lại nhiều lần, biến chương trình thành tờgiấy nháp. 1.1.5 Chạy và kiểm thử 1.1.5.1 Chạy thử và tìm lỗi Chương trình là do con người viết ra, mà đã là con người thì ai cũng có thể nhầm lẫn. Một chương trình viết xong chưa chắc đã chạy được ngay trên máy tính để cho ra kết quả mong muốn. Kỹ năng tìm lỗi, sửa lỗi, điều chỉnh lại chương trình cũng là một kỹ năng quan trọng của người lập trình. Kỹ năng này chỉ có được bằng kinh nghiệm tìm và sửa chữa lỗi của chính mình.Có ba loại lỗi: - Lỗi cú pháp: Lỗi này hay gặp nhất nhưng lại dễ sửa nhất, chỉ cần nắm vững ngôn ngữ lập trình là đủ. Một người được coi là không biết lập trình nếu không biết sửa lỗi cú pháp. - Lỗi cài đặt: Việc cài đặt thể hiện không đúng thuật toán đã định, đối với lỗi này thì phải xem lại tổng thể chương trình, kết hợp với các chức năng gỡ rối để sửa lại cho đúng. [...]... đắn Khi đó, tổ chức dữ liệu cho lớp bài toán chia để trị được mô tả như sau: Hình 2. 4Tổ chức dữ liệu cho lớp bài toán chia để trị Trong đó: Bài toán ban đầu được chia thành k bài toán con Đầu vào của bài toán ban đầu n, m, …được phân nhỏ thành đầu vào lần lượt của các bài toán con là ni, mi (i=1 k) Đầu ra bài toán ban đầu o được chia thành các đầu ra oi (i=1 k) Giải thuật đệ quy cho một vấn đề... bài toán thu được đủ đơn giản để có thể giải quyết trực tiếp Sau đó lời giải của các bài toán nhỏ được tổng hợp lại thành lời giải cho bài toán ban đầu Kĩ thuật này là cơ sở cho nhiều thuật toán hiệu quả Tuy nhiên, khả năng hiểu và thiết kế thuật toán chia để trị là một kĩ năng đòi hỏi nhiều thời gian để làm chủ Trong chương này, tôi sẽ trình bày cách tổ chức dữ liệu cho lớp thuật toán chia để trị và. .. toán con Ai (i=1,…,m) để nhận được nghiệm x của bài toán A; Hình 2. 3Thuật toán chia để trị Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 22 Chia một bài toán thành các bài toán con” cần được hiểu là ta thực hiện các phép biến đổi, các tính toán cần thiết để đưa việc giải quyết bài toán đã cho về việc giải quyết các bài toán con cỡ nhỏ hơn 2.2 Tổ chức dữ liệu cho lớp thuật toán chia để trị. .. chậm hơn và ngược lại Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 21 CHƢƠNG 2 TỔ CHỨC DỮ LIỆU CHO LỚP THUẬT TOÁN CHIA ĐỂ TRỊ Trong khoa học máy tính, chia để trị là một mô hình thiết kế thuật toán quan trọng dựa trên đệ quy với nhiều phân nhánh Thuật toán chia để trị hoạt động bằng cách chia bài toán thành nhiều bài toán nhỏ hơn thuộc cùng thể loại, cứ như vậy lặp lại nhiều lần, cho đến... làm cho các thuật toán đệ quy kém hiệu quả là các lời gọi đệ quy có thể dẫn đến phải tính nghiệm của cùng một bài toán con rất nhiều lần 2.3 Định lý tổng quát tính độ phức tạp các thuật toán chia để trị Các thuật toán chia để trị thường chuyển bài toán lớn về các bài toán nhỏ rồi kết hợp lời giải các bài toán nhỏ để tạo ra kết quả của bài toán ban đầu Để tính độ phức tạp của các thuật toán chia để trị, ... dữ liệu vào Cỡ của dữ liệu vào được xác định phụ thuộc vào từng thuật toán Ví dụ, trong thuật toán tính định thức của ma trận vuông cấp n, ta có thể chọn cỡ của dữ liệu vào là cấp n của ma trận; còn đối với thuật toán sắp xếp mảng cỡ n thì cỡ của dữ liệu vào chính là cỡ n của mảng Đương nhiên là có vô số dữ liệu vào cùng một cỡ Nói chung trong phần lớn các thuật toán, cỡ của dữ liệu vào là một số nguyên... lớp thuật toán chia để trị Chiến lược "chia để trị" được áp dụng cho các thuật toán quy bài toán ban đầu về đúng một bài toán nhỏ hơn, chẳng hạn như thuật toán tìm kiếm nhị phân, dùng cho việc tìm khóa trong một danh sách đã sắp xếp Khi thiết kế thuật toán giải quyết một vấn đề bằng kỹ thuật chia- để- trị thì thuật toán chúng ta thu được là thuật toán đệ quy Thuật toán đệ quy được biểu diễn trong các ngôn... đến thuật toán và tính hiệu quả của thuật toán 1.2.1.1 Tính hiệu quả của thuật toán Như đã phân tích ở trên, chúng ta thường xem xét thuật toán, lựa chọn thuật toán để áp dụng dựa vào các tiêu chí sau: 1 Thuật toán đơn giản, dễ hiểu 2 Thuật toán dễ cài đặt (dễ viết chương trình) 3 Thuật toán cần ít bộ nhớ Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 13 4 Thuật toán chạy nhanh Khi cài đặt thuật. .. tính hiệu quả của thuật toán Tính hiệu quả của thuật toán gồm hai yếu tố: dung lượng bộ nhớ mà thuật toán đòi hỏi và thời gian thực hiện thuật toán Dung lượng bộ nhớ gồm bộ nhớ dùng để lưu dữ liệu vào, dữ liệu ra, và các kết quả trung gian khi thực hiện thuật toán; dung lượng bộ nhớ mà thuật toán đòi hỏi còn được gọi là độ phức tạp không gian của thuật toán Thời gian thực hiện thuật toán được nói tới... số dữ liệu vào.Một cách tiếp cận khác để đánh giá thời gian chạy của thuật toán là phương pháp phân tích sử dụng các công cụ toán học Chúng ta mong muốn có kết luận về thời gian chạy của một thuật toán mà nó không phụ thuộc vào sự cài đặt của thuật toán, không phụ thuộc vào máy tính mà trên đó thuật toán được thực hiện Để phân tích thuật toán chúng ta cần sử dụng khái niệm cỡ (size) của dữ liệu vào . toán chia để trị. Trình bày ý tưởng, cơ sở khoa học của thuật toán chia để trị và cách thức tổ chức dữ liệu cho thuật toán chia để trị với các bài toán kinh điển. Chƣơng 3: Ứng dụng thuật toán. TOÁN CHIA ĐỂ TRỊ 14 2.1 Chiến lược chia để trị 14 2.2 Tổ chức dữ liệu cho lớp thuật toán chia để trị 15 2.3 Định lý tổng quát tính độ phức tạp các thuật toán chia để trị 16 2.4 Một số lớp. phức tạp tính toán của các thuật toán nhân 46 DANH MỤC CÁC HÌNH Hình 2.1 Thuật toán chia để trị 14 Hình 2.2 Tổ chức dữ liệu cho lớp bài toán chia để trị 15 Hình 2.3 Ví dụ thuật toán sắp xếp