Thomas H Cormen, Charles E Leiserson, Ronald L Rivest & Clifford Stein thuật toán thông dụng Những ngời dịch: Trần Văn Minh, Hoàng Chí Thành (Đồng chủ biên) Nguyễn Hồng Thái, Nguyễn Hiếu Cờng, Trần Trọng Hiếu, Trần Văn Dũng, Lê Hồng Phơng, Nguyễn Thị Bích Thuỷ, Vũ Đức Minh, Vũ Tiến Dũng, Đinh Quang Thắng Hiệu đính giíi thiƯu: PGS.TS Hoµng ChÝ Thµnh Hµ Néi - 2004 Lời giới thiệu Xây dựng thuật toán tốt để giải toán đà cho bớc quan trọng việc giải toán máy tính điện tử Để có đợc thuật toán tốt cần phải nắm vững kỹ thuật thiết kế, phân tích, đánh giá thuật toán thuật toán cho số lớp toán điển hình Cuốn sách Các thuật toán thông dụng tác giả Thomas H Cormen, Charles E Leiserson, Ronald L Rivest & Clifford Stein tài liệu tốt đáp ứng đầy đủ yêu cầu Với 1000 trang sách, bao gồm 35 chơng số phụ lục, sách đà trình bày đợc hầu hết thuật toán thờng dùng tính toán khoa học đại Các dịch giả đà bám sát nội dung sách, chọn lựa thuật ngữ phù hợp diễn đạt vấn đề cách xác dễ hiểu Các tập cuỗi chơng sách thực hữu ích, chúng giúp đọc giả tự kiểm tra kiến thức Cuốn sách tài liệu tổng hợp bổ ích cho quan tâm đến ứng dụng tin học Nó dùng làm giáo trình thuật toán chơng trình giảng dạy tin học trờng đại học, cao đẳng tài liệu tham khảo tốt cho giảng viên sinh viên tin học Với u điểm đó, trân trọng giới thiệu sách Các thuật toán thông dụng với đông đảo bạn đọc Hà Nội, mùa xuân năm 2004 PGS TS Hoàng Chí Thành Chủ nhiệm Bộ môn Tin học Khoa Toán - Cơ - Tin học Trờng Đại học Khoa học Tự nhiên Đại học Quốc gia Hà Nội Phần Chng Cơ sở Vai trị thuật tốn tin học Thuật tốn gì? Tại việc nghiên cứu thuật tốn lại quan trọng? Vai trị thuật tốn có liên quan tới cơng nghệ khác dùng máy tính? Trong chương này, trả lời câu hỏi 1.1 Thuật tốn Một thuật tốn thủ tục tính tốn định nghĩa xác, mà lấy giá trị tập giá trị, gọi đầu vào hay liệu vào tạo giá trị, tập giá trị, gọi đầu Miêu tả vấn đề thường xác định nói chung qua quan hệ đầu vào/đầu Một thuật toán dãy bước xác định để để chuyển đổi liệu đầu vào thành liệu đầu Chúng ta xem thuật tốn cơng cụ để giải vấn đề tính tốn Việc trình bày rõ ràng vấn đề nói chung hình thành mối quan hệ mong muốn đầu vào/đầu Một thuật tốn mơ tả xác thủ tục tính tốn để đạt mối liên hệ liệu đầu vào liệu đầu Ví dụ, cần xếp dãy số theo thứ tự không giảm Vấn đề phát sinh thường xuyên thực tế đưa ý tưởng cho việc đưa vào nhiều kỹ thuật thiết kế chuẩn cơng cụ phân tích Đây cách thường định nghĩa cho toán xếp: Input: Một chuỗi gồm n số < a1, a2, …, an> Output: Một hoán vị (sắp xếp lại) < a'1, a'2, …, a'n > chuỗi đầu vào chẳng hạn như: a'1 a'2 … a'n Ví dụ, với chuỗi số đầu vào , thuật toán xếp tạo chuỗi đầu < 26, 31, 41, 41, 58, 59 > Một chuỗi đầu vào gọi trường hợp toán xếp Trong tổng quát, trường hợp toán gồm liệu vào thoả mãn buộc phần giới thiệu tốn) cần để tính tốn lời giải cho vấn đề Sắp xếp thao tác khoa học máy tính (nhiều chương trình sử dụng bước trung gian), kết số lớn thuật toán xếp tốt phát triển Thuật toán tốt cho ứng dụng -phụ thuộc vào số phần tử cần tính sẵn phần tử, hạn chế giá trị phần tử, loại thiết bị sử dụng: nhớ chính, đĩa hay băng từ Một thuật tốn gọi xác với liệu vào, kết thúc với kết xác Chúng ta nói thuật tốn xác giải vấn đề cho xác Một thuật tốn khơng xác không dừng liệu vào, cho kết khơng xác Đối lập với nhiều suy nghĩ, thuật tốn khơng xác đơi có ích, tỉ lệ lỗi quản lý Chúng ta thấy ví dụ chương 31 nghiên cứu thuật tốn tìm số ngun tố lớn Một thuật tốn mơ tả tiếng Anh, chương trình máy tính, cứng hố u cầu mơ tả cần cung cấp định nghĩa xác để thủ tục tính tốn tn theo Loại vấn đề giải thuật toán? Sắp xếp Các ứng dụng thực tế thuật toán nhiều ta có số dẫn chứng: Dự án gen người có mục tiêu xác định tất 100,000 gen DNA, xác định dãy cặp 3000000 gen sở mà tạo DNA người, lưu giữ chúng sở liệu, phát triển cơng cụ cho việc phân tích liệu Mỗi bước yêu cầu thuật toán phức tạp Trong lời giải cho nhiều vấn đề khác mà liên quan vượt phạm vi sách này, ý tưởng nhiều chương sách sử dụng lời giải nhiều vấn đề sinh học, cho phép nhà khoa học để đạt kết sử dụng tài nguyên hiệu Sự tiết kiệm thời gian, người máy móc,và tiền bạc, thơng tin trích từ kĩ thuật thí nghiệm Internet cho phép người toàn giới truy cập lấy thông tin Để làm điều này, thuật toán tuyệt vời sử dụng sử lý khối lượng lớn liệu Ví dụ vấn đề mà cần phải giải bao gồm việc tìm đường tốt mà liệu cần phải qua (các kĩ thuật giải vấn đề nêu chương 24), sử dụng search engine để nhanh chóng tìm kiếm trang mà thơng tin cần tìm (các kĩ thuật liên quan nờu chng 11 v 32) Thơng mại điện tử cho phép hàng hoá dịch vụ đợc ký kết chuyển giao thông qua mạng Khả bảo mật thông tin nh thẻ ngân hàng, mật khẩu, tài khoản cá nhân nhà băng yếu tố mà thơng mại điện tử đợc sử dụng rộng rÃi Mật mà khoá công cộng (public-key) chữ ký điện tử công nghệ có tính trung tâm đợc sử dụng đợc dựa vào nhiều thuật toán số lý thuyết số Trong sản xuất hình thức thơng mại khác, điều quan trọng sử dụng nguồn tài nguyên khan để có đợc lợi nhuận cao Một công ty dầu lửa cần phải biết nơi đặt giếng dầu họ cho khai thác đợc nhiều dầu ứng cử viên bầu cử tổng thống nớc Mỹ muốn tìm đợc ngời đủ khả chi tiền cho quảng cáo để có đợc nhiều cử tri HÃng hàng không ấn định nhóm chuyÕn bay b»ng ®êng Ýt tèn kÐm nhÊt cã thể, chắn chuyến bay phải đầy kín quy tắc kiểm soát phải đảm bảo Một ngời cung cấp dịch vụ Internet mong muốn xác định đợc nơi thiết lập nguồn để phục vụ khách hàng hiệu hơn.Tất ví dụ vấn đề, đợc giải cách sử dụng chơng trình tuyến tính, mà sÏ häc ë ch¬ng 29 Trong mét sè chi tiết ví dụ nằm phạm vi sách Chúng đa giải pháp kỹ thuật phù hợp với vấn đề khoanh vùng chúng Chúng để giải nhiều vấn đề cụ thể sách này, bao gồm vấn ®Ị sau: Chóng ta cã mét b¶n ®å ®êng mà khoảng cách cặp điểm giao đợc đánh dấu, mục đích xác định đờng ngắn từ giao điểm tới giao điểm khác Số lợng đờng đợc xác định lớn, chí không thừa nhận đờng mà chúng cắt Làm để chọn đợc đờng ngắn nhất? đây, tạo mô hình cho đồ đờng (mô hình đờng thật) dạng đồ thị (chúng ta gặp chơng 10), muốn tìm đờng ngắn từ vectơ đến vector khác đồ thị Chúng ta thấy cách giải vấn đề cách có hiệu chơng 24 Cho mét d·y n ma trËn , muốn xác định tính A1A2 An Bởi phép nhân ma trân có tính trén VÝ dơ, víi n = 4, chóng ta cã thể thực phép nhân ma trận theo theo trật tự sau : (A1(A2(A3A4))), (A1((A2A3)A4)), ((A1A2)(A3A4)), ((A1(A2A3)A4), (((A1A2)A3)A4) Nếu tất ma trận hình vuông (các cạnh có kích thớc), trật tự phép nhân không ảnh hởng tới việc có ma trận cần phải nhân Tuy nhiên, ma trận có kích thớc khác (kích thớc phù hợp với phép nhân), thứ tự phép nhân tạo khác biệt lớn Số lợng phép nhân có số mũ n, thử tất thứ tự nhiều thời gian Chúng ta thấy chơng 15 cách dùng kỹ thuật tổng quát đợc gọi lập trình động để giải vấn đề hiệu Cho phơng trình ax b(mod n) , với a, b n số nguyên, muốn tìm ,mọi số nguyên x, theo modulo n, thoả mÃn phơng trình Có thể không có, có hay nhiều lời giải Một cách giải đơn giản thay x 0,1,2, , n nhng ch¬ng 31 sÏ thÊy phơng pháp hiệu Cho n điểm mặt phẳng, muốn tìm bao lồi nhỏ điểm Bao lồi đa giác lồi nhỏ chứa điểm này, giả thiết điểm nh đinh gắn bảng Bao lồi nh dây cao su bao quanh điểm neo Mỗi điểm neo xung quanh nh đỉnh vectơ cđa miỊn låi (xem h×nh 33.6) BÊt kú mét n tập điểm đỉnh bao lồi Biết điểm tạo nên đỉnh cho bao lồi cha đủ, mặt khác, cần biết thứ tự xếp chúng đỉnh đầu, cuối Có nhiều lựa chọn, cho đỉnh bao lồi.Chơng 33 nêu hai phơng pháp tốt tìm kiếm bao lồi Danh sách khác xa với vấn đề giải pháp thực tế, nhng cho thấy hai đặc trng chung nhiều thuật toán Có nhiều giải pháp ứng cử, nhng hầu hết giải pháp cần Việc tìm đợc giải pháp xác thử th¸ch Cã c¸c øng dơng thùc tÕ Víi c¸c vấn đề danh sách trên, toán tìm đờng đơn giản Một công ty vận chuyển, nh công ty xe tải hay đờng sắt, có mối quan tâm tài tìm đờng ngắn nhất, dẫn đến giá thành thấp Hay route mạng Internet cần tìm đờng ngắn để truyền tin nhắn nhanh Cấu trúc liệu Cuốn sách bao gồm vài cấu trúc liệu Cấu trúc liệu cách tổ chức liệu để dễ dàng tiếp cận thay đổi Không có cấu trúc làm việc tốt cho mục đích, điều quan trọng phải biết sức mạnh giới hạn cấu trúc Kĩ thuật Mặc dù bạn sử dụng sách nh mét “s¸ch híng dÉn” vỊ tht to¸n, cã thĨ mét ngày bạn lại gặp vấn đề mà bạn tìm thấy sách thuật toán (ví dụ nh tập vấn đề sách này) Cuốn sách hớng dẫn bạn kĩ thuật phân tích thiết kế thuật toán bạn tự phát triển thuật toán, chứng minh chúng đa kết đúng, đo đợc hiệu chúng Các vấn đề khó Hầu hết sách thuật toán hiệu Độ đo hiệu thờng tốc độ, thời gian thuật toán cần để giải vấn đề Có số vấn đề, tất nhiên, cha có lời giải hiệu Chơng 34 nêu tập hấp dẫn vấn đề đó, mà đợc gọi NP-đủ Vì NP-đủ lại hấp dẫn nh vậy? Đầu tiên, không thuật toán tiện lợi cho NP-đủ đợc tìm thấy, cha chứng minh đợc thuật toán nh Nói cách khác, đợc có tồn thuật toán hiệu cho toán NP-đủ hay không Thứ hai, tập toán NP-đủ có tính chất đáng ý tồn thuật toán hiệu cho toán tồn thuật toán hiệu cho toán Quan hệ toán NP-đủ làm cho việc tìm lời giải trở nên hấp dẫn Thứ ba, số vấn đề NP-đủ tơng tự, nhng không giống nhau, với vấn đề mà đà có lời giải tốt Một thay đổi nhỏ toán dẫn tới thay đổi lớn hiệu thuật toán tốt đ ợc biết Rất có giá trị biết vấn đề NP-đủ số chúng thờng xảy ứng dụng thực tế Nếu bạn bị gọi phải tạo thuật toán thuận tiện cho vấn đề NP-đủ, bạn phải tốn nhiều thời gian tìm kiếm kết Nếu bạn vấn đề NPđủ, bạn sử dụng thời gian để phát triển thuật toán hiệu mà cho lời giải tốt, nhng không tốt Ví dụ, xem xét công ty vận tải với kho Hàng ngày, chất hàng lên xe kho phân phối tới địa điểm Cuối ngày, xe trở lại kho để chuẩn bị cho ngày mai Để giảm chi phí, công ty muốn chọn thứ tự điểm phân phối để có đợc tổng đờng di chuyển nhỏ Vấn đề tiếng đợc gọi toán ngời đa hàng NP-đủ Cha có thuật toán hiệu đợc biết Dới số giả thiết, đà có số thuật toán hiệu mà đa tổng khoảng cách không xa so với trờng hợp nhỏ Chơng 35 thảo luận thuật toán nh Bài tập 1.1-1 Đa ví dụ thực tế mà vấn đề tính toán sau xảy ra: xếp, tìm trật tự nhân nhanh nhất, hay tìm bao lồi 1.1-2 Ngoài tốc độ, thớc đo hiệu thuận tiện đợc sử dơng thùc tÕ? 1.1-3 Chän mét cÊu tróc d÷ liệu mà bạn đà gặp thảo luận sức mạnh giới hạn 1.1-4 Vấn đề đờng ngắn toán ngời đa hàng tơng tự nh Chúng khác sao? 1.1-5 Trở lại với vấn đề thực tế mà có giải pháp tốt giải đợc Sau tìm lời giải xấp xỉ gần nh tốt 1.2 Thuật toán nh kỹ thuật Giả sử máy tính tốc độ không giới hạn nhớ máy tính không giới hạn Vậy bạn có lý để bạn học thuật toán không? Câu trả lời có, lý khác bạn nên tiếp tục chứng tỏ đáp án bạn, phơng pháp có giới hạn, câu trả lời Nếu máy tính tốc độ cao, phơng pháp cho việc giải vấn đề có thể.Bạn muốn thực bạn nằm giới hạn phần mềm kỹ thuật thực tế (ví dụ đợc thiết kế tốt đợc cung cấp đầy đủ tài liệu, dẫn chứng) nhng bạn nên sử dụng phơng pháp đơn giản nhất, dễ thực hành Đơng nhiên, máy tính nhanh, nhng nhanh đến vô tận Và nhớ máy tính rẻ nhng miễn phí Thời gian tính toán bị giới hạn tài nguyên, không gian nhớ Các tài nguyên nên đợc sử dụng khôn khéo , thuật toán mà hiệu theo thêi gian hay bé nhí cđa m¸y tÝnh sÏ gióp bạn thực điều Tính hiệu Thuật toán đợc thiết kế để giải vấn đề thờng có khác biệt lớn hiệu Những khác quan trọng nhiều khác phần cứng phần mềm Nh ví dụ, đa chơng 2, thấy thuật toán phân loại, xếp.Đầu tiên, xếp chèn, với thời gian c1n để xếp n danh sách ,và c1 không đổi, không phụ thuộc vào n.Thế tỷ lệ với n2 Thứ 2, xếp trộn, cÇn thêi gian c2 n lg n , víi lg n tợng trng cho với log2n c2 số khác không phụ thuộc vào n.Sắp xếp trộn thờng có nhân tố số nhỏ dạng xÕp trén, v× thÕ c1 < c2 Chóng ta thÊy số quan trọng chạy chơng trình tham số phụ thuộc n Khi xếp trộn có nhân tố lgn thêi gian thùc hiƯn, s¾p xÕp chÌn cã tham số n, tham số lớn nhiều Mặc dù xếp chèn thờng nhanh xếp trộn cho kích thớc liệu vào nhỏ, kích thớc liệu vào trở nên lớn, lợi cđa s¾p xÕp trén lg n so víi n sÏ bù lấp nhiều cho khác biệt số Dù c1 < c2 chẳng vấn đề gì, có điểm mà đằng sau xếp trộn nhanh nhiều Với mét vÝ dơ thĨ, chóng ta h·y cho thư sức máy tính nhanh (máy A) chạy xếp chèn với một tính tốc độ chậm (máy B) chạy xếp trộn Mỗi máy phải xÕp mét d·y gåm hµng triƯu sè Cø cho lµ m¸y A thùc hiƯn mét tØ phÐp tÝnh mét giây máy B thực 10 triệu phép tính thôi, nh máy a có tốc độ nhanh gấp 100 lần máy B Để tạo khác biệt lớn hơn, giả thiết ngời lập chơng trình đẳng cấp quốc tế mà hoá xếp chèn ngôn ngữ máy A, mà hoá đòi hỏi 2n2 phép tính để xếp n số Sắp xếp trộn, mặt khác, đợc lập chơng trình cho máy B lập trình viên bình thờng sử dụng ngôn ngữ máy với biên dịch không suất, với kết mà hoá 50n lg n phép tính (c2 = 50) Để xếp triệu số, máy A phải mất: 2.(106)2 phép tính - = 2000 gi©y 109 phÐp tÝnh/gi©y Trong m¸y B chØ hÕt : 50.106 lg106 phÐp tÝnh - 100 gi©y 107 phÐp tÝnh/gi©y B»ng cách sử dụng thuật toán mà thời gian tăng chậm hơn, chí với biên dịch kém, máy B chạy nhanh gấp 20 lần máy A Sự tiện lợi xếp trộn cao xếp hàng chục triệu số : mà xếp chèn phải gần 2-3 ngày, xếp trộn 20 phút Nói chung, nh vấn đề gia tăng kích thớc, kích thớc lớn tác dụng xếp trộn cao Các dạng thuật toán kỹ thuật khác Ví dụ thuật toán, giống nh phần cứng, kỹ thuật Sự thể tỉng thĨ cđa mét hƯ thèng phơ thc vµo lùa chọn thuật toán có hiệu nh lựa chọn phần cứng tố độ cao Cũng nh tăng tốc nhanh công nghệ máy tính, thuật toán có phát triển nhanh chóng Bạn có lẽ phân vân liệu thuật toán có thật quan trọng cho máy tính đại máy tính hệ công nghệ cao, nh : chung, thời gian thuật toán tăng với kích thớc liệu vào, ta thờng mô tả thời gian thực chơng trình hàm kích thớc liệu vào Do đó, ta phải định nghĩa cách xác khái niệm thời gian thực kích thớc đầu vào Kí hiệu tốt cho kích thớc đầu vào phụ thuộc vào vấn đề mà ta nghiên cứu Với nhiều vấn đề, nh xếp biến đổi Fourier rời rạc, thớc đo tự nhiên số phần tử liệu vào- ví dụ nh mảng kích thớc n Với nhiều vấn đề khác, nh nhân hai số nguyên dơng thớc đo tốt lại tổng số bít cần thiết để biểu diễn liệu dạng nhị phân Đôi khi, ta lại cần mô tả kích thớc liệu vào qua hai sè VÝ dơ nh ®èi víi mét tht toán đồ thị, kích thớc liệu mô tả qua số đỉnh số cạnh đồ thị Thời gian thực thuật toán với liệu vào cụ thể số thao tác cần thiết số bớc thực Chúng ta hÃy chấp nhận quan điểm sau: lợng thời gian không đổi cần thiết để thực dòng lệnh mà giả Mỗi dòng lệnh có thời gian thực khác với dòng lệnh khác, nhng chóng ta sÏ gi¶ sư r»ng sù thùc hiƯn cđa dòng thứ i ci thời gian, với ci số Quan điểm với mô hình RAM phản ánh cách mà giả đợc thực hầu hết máy tính thực tế Trong phần thảo luận tiếp theo, biểu thức đánh giá thêi gian thùc hiƯn cho INSERTION-SORT sÏ ph¸t triĨn tõ công thức lằng nhằng mà sử dụng chi phí ci công thức với ký hiệu đơn giản hơn, xác dễ dàng xử lý Các ký hiệu đơn giản làm dễ dàng đánh giá đợc thuật toán hiệu Chúng ta bắt đầu viƯc biĨu diƠn thđ tơc INSERTION-SORT víi “chi phÝ” thêi gian cho câu lệnh nố lần câu lệnh đợc thực Với j = 2, 3, , n, với n = length[A], ta đặt tj số lần kiểm tra vòng lặp while dòng đợc thực với giá trị j Khi vòng lặp for while kết thúc theo cách thông thờng, số lần kiểm tra nhiều số lần lặp lần Chúng ta giả sử câu thích không câu lệnh thực hiện, kh«ng mÊt thêi gian Thêi gian thùc hiƯn cđa tht toán tổng thời gian thực câu lệnh; câu lệnh mà cần thực ci bớc đợc thực n lần cần cin Có số tinh tế nhỏ Các bớc tính toán mà xác định câu văn thờng biến đổi yêu cầu nhiều thời gian hơn, không số Ví dụ, sách ta nói xếp điểm theo toạ độ x, nh ta thấy tốn nhiều thời gian số Cũng nh vậy, ý câu lệnh mà gäi mét thđ tơc sÏ mÊt mét thêi gian h»ng số thủ tục đợc gọi nhiều thời gian Vì vậy, ta tách trình gọi thủ tục - truyền tham số cho với trình thực thđ tơc thêi gian thùc hiƯn.5 §Ĩ tÝnh T(n), thêi gian thùc hiƯn cđa INSERTION-SORT, chóng ta tÝnh tỉng tích cột chi phí số lần, ta có Ngay với liệu vào với kích thớc cố định, thời gian thực thuật toán phụ thuộc vào liệu cụ thể Ví dụ, INSERTION-SORT, trờng hợp tốt mảng đà đợc Với j 2,3, , n , chóng ta nhËn thÊy A[i ] key dòng i nhận giá trị ban đầu j Vì t j với j 2,3, , n , vµ thêi gian thùc hiƯn tèt nhÊt lµ Thêi gian thùc hiƯn nµy cã thĨ đợc biểu diễn qua dạng an b với số a b mà phụ thuộc vào chi phí ci; hàm tuyến tính n Nếu mảng đà đợc theo thứ tự ngợc lại- thứ tự không tăng- trờng hợp xấu xảy Chúng ta phải so sánh phần tử A[j] với phần tử toàn mảng đà đợc A[1 j 1] , t j j víi j 2,3, , n Chó ý r»ng n n(n 1) 2 j n n(n 1) 2 ( j 1) (xem phÇn phơ lơc A), chóng ta thÊy r»ng trêng hỵp xÊu nhÊt, thêi gian thùc hiƯn cđa INSERTION-SORT lµ n(n 1) n(n 1) n(n 1) T (n) c1n c2 (n 1) c4 (n 1) c5 1 c6 c7 c8 (n 1) c c c c c c n c1 c2 c4 c8 n (c2 c4 c5 c8 ) 2 2 2 Thêi gian thùc hiƯn xÊu nhÊt nµy cã thĨ biĨu diƠn qua d¹ng an bn c với số a, b, c phụ thuộc vào chi phí ci; hàm bậc hai n Thông thờng, nh xếp chèn, thời gian thực thuật toán cố định với liệu vào, nhiên chơng sau thấy số thuật toán ngẫu nhiên hóa mà kết biến đổi với liệu vào Phân tích trờng hợp xấu trờng hợp trung bình Trong phân tích xếp chèn, tìm hiểu hai trờng hợp, tốt xấu Trong phần lại sách này, tập trung vào việc xác định thời gian thùc hiƯn xÊu nhÊt, nghÜa lµ thêi gian thùc Đặc tính không thiết cho tài nguyên nh nhớ Một câu lệnh mà sử dụng m từ nhớ đợc thực n lần không nhÊt thiÕt ph¶i sư dơng tỉng céng mn tõ nhí dài cho liệu vào kích thớc n Chúng ta nêu ba lÝ cho viƯc nµy Thêi gian thùc hiƯn xấu thuật toán cận cho thêi gian thùc hiƯn cđa bÊt kú bé d÷ liƯu vào Việc biết đảm bảo thuật toán không chạy cận Víi mét sã tht to¸n, thêi gian thùc hiƯn xÊu hay xảy Ví dụ, việc tìm kiếm sở liệu mẩu tin đặc biệt, trờng hợp xấu xảy không tìm đợc mẩu tin Trong mộy số ứng dụng tìm kiếm, việc tìm thông tin cha có thờng xảy Trờng hợp trung bình thờng tồi nh trờng hợp xấu Giả sử chọn ngẫu nhiên n số áp dụng xếp chèn Mất bao thời gian để xác định vị trí mảng A[1 j 1] để chèn A[j]? Về mặt trung bình, nửa phần tử A[1 j 1] nhỏ A[j], nửa lại lớn Về mặt trung bình , vậy, kiểm tra nửa mảng A[1 j 1] , ®ã t j j / NÕu chóng ta tÝnh thêi gian thực trung bình, hàm bậc hai kích thớc liệu vào, nh trờng hợp xấu Trong số trờng hợp đặc biệt, quan tâm trờng hợp trung b×nh hay thêi gian thùc hiƯn trung b×nh cđa mét thuật toán Trong chơng 5, biết kĩ thuật phân tích mang tính xác suất, dùng để xác định thời gian thực trung bình Một vấn đề với việc thực phân tích trung bình không rõ ràng biết đợc thành phần tạo nên liệu vào trung bình cho vấn đề cụ thể Thông thờng, coi liƯu víi cïng kÝch thíc lµ nh Trong thùc tế, giả thiết bị xâm phạm, nhng sử dụng thuật toán ngẫu nhiên hoá mà tạo lựa chọn ngẫu nhiên, phép phân tích có tính xác suất Bậc tăng trởng Chúng ta đà sử dụng số cách trừu tợng hoá đơn giản để làm dễ dàng phân tích thủ tục INSERTION-SORT Đầu tiên, lờ chi phí thực tế câu lệnh, sử dụng số ci để biểu diễn chi phí Sau đó, nhận thấy số cung cấp nhiều thông tin cần: thời gian thực xấu biểu diễn qua dạng an bn c với số a, b, c phụ thuộc vào chi phí ci Vì vậy, lờ không chi phí thực tế mà chi phí trừu tợng ci Chúng ta đa bớc trừu tợng hoá đơn giản Đó tỉ lệ tăng trởng , hay bậc tăng trởng, thời gian thực mà quan tâm Vì vậy, quan tâm đến số hạng công thức (ví dụ an ), số hạng với bậc nhỏ ảnh hởng với n lín Chóng ta cịng bá ®i hƯ sè h»ng sè số hạng chính, nhân tố không đáng ý bậc tăng trởng việc xác định thuận lợi tính toán cho liệu vào lớn Vì vậy, viết cho xÕp chÌn, cã thêi gian thùc hiƯn xÊu nhÊt lµ (n ) (đọc theta n bình phơng) Chúng ta sử dụng kí hiệu không hình thức chơng này; đợc định nghĩa xác chơng Chúng ta coi thuật toán thuận tiện thuật toán khác thời gian thực trờng hợp xấu có bậc tăng trởng nhỏ Vì lí nhân tố số số hạng có bậc thấp hơn, đánh giá khônh với liệu vào nhỏ Nhng với liệu vào ®đ lín, mét tht to¸n (n ) , sÏ chạy nhanh t có thời gian thực xÊu nhÊt lµ (n ) Bµi tËp 2.2-1 BiĨu diƠn biĨu thøc n / 1000 100n 100n theo định nghĩa 2.2-2 Xem xÐt viƯc s¾p xÕp n sè lu mảng A cách tìm phần tử nhỏ A đổi với phần tử A[1] Sau tìm phần tử nhỏ thứ hai A, đổi nã A[2] TiÕp tơc víi n phÇn tư A Viết mà giả cho thuật toán này, mà đợc gọi xếp chọn Bất biến vòng lặp gì? Vì cần thực với n phần tử đầu tiên, thay cho n phần tử? Đa thời gian thực tốt nhÊt vµ xÊu nhÊt theo kÝ hiƯu 2.2-3 Xem xét tìm kiếm tuyến tính lần (xem tập 2.1-3) Về trung bình, bao nhiều phần tử dẫy cần phải kiểm tra, giả sử phần tử cần tìm giống nh phần tử khác dẫy? Trờng hợp xấu nh nào? Nêu thời gian thực tìm kiếm tuyến tính trờng hợp xấu trung bình theo kí hiệu ? Giải thích kết 2.2-4 Chúng ta thay đổi thuật toán nh để có thời gian thực tốt tốt? 2.3 Thiết kế thuật toán Có nhiều cách để thiết kế thuật toán Sắp xếp chèn sử dụng cách tiếp cận tăng dần: với dÃy đà A[1 j 1] , thêm phần tử đơn A[j] vào vị trí thích hợp, dẫn đến mảng đợc A[1 j ] Trong mơc nµy, chóng ta xem xÐt mét cách tiếp cận khác, gọi chia-đểtrị Chúng ta sử dụng cách tiếp cận chia-để-trị để thiết kế thuật toán xếp mà trờng hợp xấu có thời gian thực nhanh xếp chèn Một lợi thuật toán chia-để-trị thời gian thực dễ dàng đợc xác định qua kĩ thuật đợc giới thiệu chơng 2.3.1 Cách tiếp cận chia-để-trị Nhiều thuật toán có ích đệ quy cấu trúc: để giải vấn đề, thuật toán gọi đến nhiều lần để xử lý với vấn đề liên quan Các thuật toán thờng sử dụng cách tiếp cận chia-đểtrị : chia vấn đề thành vài vấn đề mà tơng tự với vấn đề ban đầu nhng với kích thớc nhỏ hơn, giải vấn đề đệ quy kết hợp lời giải để tạo lời giải cho vấn đề ban đầu Sơ đồ chia-để-trị gồm ba bớc mức đệ quy: Chia vấn đề thành số vấn đề Trị vấn đề cách giải chúng đệ quy Nếu kích thớc vấn đề đủ nhỏ, giải trực tiếp vấn đề Kết hợp lời giải vấn đề thành lời giải cho vấn đề ban đầu Thuật toán xếp trộn gắn liền với sơ đồ chia-để-trị Nó gồm thao tác sau Chia: chia dÃy n phần tử mà cần đợc thành dÃy n / phần tử Trị: xếp hai dẫy cách đệ quy đệ quy sử dụng xếp trộn Kết hợp: sử dụng hai dẫy đà để tạo lời giải Đệ quy dừng dẫy cần có độ dài 1, mà trờng hợp ta không cần phải làm Thao tác thuật toán xếp trộn việc trộn hai dẫy đà đợc bớc kết hợp Để thực trộn, sử dơng mét thđ tơc phơ MERGE ( A, p, q, r ) , với a mảng p, q, r số mà p q r Thủ tục giả thiết mảng A[ p q] A[q r ] xếp trộn Nó trộn chúng để tạo dẫy đợc mà thay thÕ d·y hiƯn t¹i A[ p r ] Thđ tơc MERGE cđa chóng ta cÇn (n) thêi gian với n r p số phần tử cần đợc trộn, mà đợc thực nh sau Quay trở lại trò chơi bài, giả sử có hai cột úp ngửa bàn Mỗi cột đà đợc sắp, với phần tử nhỏ đỉnh Chúng ta muốn trộn hai cột thành mmột cột mà quân đợc sấp bàn Bớc gồm việc chọn quân nhỏ hai quân đỉnh hai cét bµi, chun nã khái cét cđa nã (mµ sÏ quân dới) úp quân xuống cột kết Mỗi bớc sở thời gian số, kiểm tra hai quân Vì thùc hiƯn nhiỊu nhÊt n bíc c¬ së, phÐp trộn cần (n) thời gian Đoạn mà giả sau thể hiƯn ý tëng trªn, nhng víi mét mĐo nhá nh»m tránh việc kiểm tra xem có cột rỗng bớc sở ý tởng thêm vào đáy cột quân lính canh, mà chứa giá trị đặc biệt làm đơn giản mà giả đây, sử dụng nh giá trị lính canh, gặp quân với giá trị , quân nhỏ trừ ta gặp quân lính canh hai cột Nhng điều xảy ra, quân khác đà đợc đa vào cột kết Vì biết trớc có r p quân đợc đa vào cột kết quả, dừng đà thực bớc b¶n MERGE ( A, p, q, r ) n1 q p n2 r q tạo mảng L[1 n1 1] R[1 n 1] for i to n1 L[i ] A[ p i 1] for j to n2 R[ j ] A[q j ] L[n1 1] R[n 1] 10 i 11 j 12 for k p to r 13 if L[i ] R[ j ] 14 then A[k ] L[i ] i i 1 15 16 else A[k ] R[ j ] j j 1 17 VỊ chi tiÕt, thđ tơc MERGE lµm viƯc nh sau Dòng xác định độ dài n1 mảng A[ p q ] , dòng xác định độ dài n2 mảng A[q r ] Chúng ta tạo mảng L R có độ dài n1 + n2 + tơng ứng, dòng 3, Vòng lặp for dòng 4-5 chép mảng A[ p q ] vào L[1 n1 ] vòng lặp for thứ hai dòng 6-7 chép mảng A[q r ] vµo R[1 n2 ] Dòng 8-9 thêm lính canh vào cuối mảng L R Các dòng 10- 17, đợc minh hoạ hình 2.3, thực r p bớc mà trì bất biến sau: Hình 2.3 Các thao tác dòng 10-17 lêi gäi MERGE(A,9,12,16) m¶ng A[9 16] chøa d·y Sau chép thêm phần tử lính cánh, mảng L chứa mảng R chứa Các vị trí đợc tô mờ a chứa giá trị cuối chúng, vị trí tô mờ L R chứa giá trị mà đợc chép ngợc vào A Nói chung vị trí đợc tô mờ tạo nên toàn mảng A, với hai lính canh Các vị trí đợc tô đậm a chứa giá trị mà đợc chép đè lên, vị trí đợc tô đậm L R chứa giá trị mà đợc chép ngợc lại vào A (a)-(h) Các mảng A, L, R số tơng ứng Tại điểm bắt đầu vòng lặp for dòng 1217, m¶ng A[ p k 1] chøa k p phÇn tư nhá nhÊt cđa L[1 n1 1] vµ R[1 n 1] theo thø tù đợc Ngoài ra, L[i] R[j] phần tử nhỏ mảng tơng ứng mà cha đợc chép ngợc lại A Chúng ta phải bất biến vòng lặp trớc lần lặp vòng lặp dòng 12-17, bất biến đợc trì sau lần lặp, ®Ĩ mµ bÊt biÕn nµy cã thĨ cung cÊp mét tÝnh chÊt cã Ých cho viƯc chøng minh tÝnh ®óng đắn vòng lặp kết thúc Khởi tạo: Trớc lần lặp đầu tiên, có k p , mảng A[ p k 1] rỗng Mảng rỗng chứa k p phần tử nhỏ L R, i j , nên L[i] R[j] phần tử nhỏ mảng mà cha đợc chép ngợc lại vào A Duy trì: Để thấy đợc tính bất biến đợc trì sau vòng lặp, hÃy giả sử L[i ] R[ j ] Thì L[i] phần tử nhỏ mà cha đợc chép ngợc lại vào A Bëi v× A[ p k 1] chøa k p phần tử nhỏ nhất, sau dòng 14 chép L[i] vào A[k], mảng A[ p k ] sÏ chøa k p phÇn tư nhỏ Tăng k (sau vòng lặp for) i (trong dòng 15) thiết lập lại bất biến cho vòng lặp Nếu ngợc lại L[i ] R[ j ] , dòng 16-17 thực thao tác thích hợp để trì bất biến vòng lặp Kết thúc: kết thúc, k r Do bất biến vòng lặp, mảng A[ p k 1] mµ lµ A[ p r ] , chøa k p r p phÇn tư nhá nhÊt cđa L[1 n1 1] R[1 n 1] , thø tự đợc Mảng L R có tất c¶ n1 n2 r p phần tử Tất phần tử ngoại trừ hai phần tử lớn đà đợc chép ngợc lại vào A, hai phần tử lớn lính canh Để nhận thấy thủ tục MERGE đợc thực thời gian (n) 2.3.2 Phân tích thuật toán chia-để-trị Khi thuật toán chứa lời gọi tíi chÝnh nã, thêi gian thùc hiƯn cđa nã cã thể đợc mô tả qua phơng trình đệ quy mà mô tả thời gian thực vấn đề kÝch thíc n qua thêi gian thùc hiƯn víi c¸c kÝch thíc nhá h¬n Chóng ta cã thĨ sư dơng công cụ toán học để giải công thức đệ quy đua cận khả thực thuật toán Một công thức đệ quy cho thêi gian thùc hiƯn cđa mét tht to¸n chia-đểtrị dựa vào ba bớc sơ đồ Nh trớc, đặt T (n) thời gian thùc hiƯn cđa vÊn ®Ị kÝch thíc n NÕu kÝch thớc vấn đề đủ nhỏ, n c , thời gian cho vấn đề (1) Giả sử ta chia toán thành a toán con, với toán có kích thớc 1/b so với toán ban đầu Nếu D(n) thời gian để chia toán thành toán C (n) thời gian để kết hợp nghiệm toán thành toán ban đầu, ta có phép truy to¸n nc (1) T (n) aT (n / b) D(n) C (n) ngợc lại Trong chơng 4, biết đợc cách giải công thức đệ quy kiểu Phân tích kĩ thuật xếp trộn Mặc dù mà giả MERGE-SORT làm việc số phần tử không số chẵn, phân tích dựa vào đệ quy lại dựa vào giả thiết đơn giản kích thớc vấn đề bội Mỗi bớc chia dẫn đến hai dÃy với kích thớc n / Trong chơng 4, thấy giả thiết nh không ảnh hởng đến bậc tăng trởng lời giải với công thức đệ quy Chúng ta giải thích nh sau để ®a c«ng thøc ®Ư quy cho T (n) , thời gian thực xấu n phần tử xếp trộn Sắp xếp trộn phần tö mÊt mét thêi gian h»ng sè Khi ta cã n phÇn tư, chóng ta tÝnh thêi gian thực nh sau: Chia: Bớc chia xác định điểm mảng con, thời gian số Nh vậy, D(n) (1) Trị: Chúng ta giải đệ quy hai vấn đề con, vấn đề kích thớc n / , mà cần T (n / 2) thời gian Kết hợp: Chúng ta đà biết thời gian thực thủ tục MERGE n phần tử (n) , C ( n) (n) Hình 2.4 Phép toán xếp trộn mảng a = Chiều dài dÃy xếp đợc trộn gia tăng thuật toán tiến dần từ dới lên Khi cộng hàm C (n) D(n) phân tích xếp trộn, cộng hàm (n) hàm O (1) Tỉng nµy lµ mét hµm tun tÝnh n, nghĩa (n) Cộng với số hạng 2T (n / 2) bớc trị, ta có công thøc ®Ư quy cho thêi gian thùc hiƯn T (n) trêng hỵp xÊu nhÊt (1) T (n) 2T (n / 2) (n) nÕu n = 1, nÕu n > Trong ch¬ng chóng ta thấy định lý chính, mà sử dụng để có kết T (n) (n lg n) , víi lg n tỵng trng cho log n Vì hàm logarit tăng chậm hàm tuyến tính nào, nên với liệu lớn, s¾p xÕp trén, víi (n lg n) thêi gian thùc hiện, nhanh nhiều so với xếp chèn, mà thêi gian thùc hiƯn lµ (n ) trêng hợp xấu Ch úng ta không cần định lý để hiểu rõ lời giải cho công thức đệ quy (2.1) T (n) (n lg n) Chúng ta hÃy viết lại công thức (2.1) nh sau nÕu n = 1, c T (n) nÕu n > 2T (n / 2) cn với c số biểu diễn thời gian cần thiết để giải vấn đề kích th ớc cung nh thời gian cho phần tử phép chia trộn.6 Hình 2.5 giải đệ quy (2.2) Để thuận tiện, giả thiết n luỹ thừa xác Phần (a) hình T (n) , mà đợc mở rộng phần (b) thành tơng đơng biểu diễn cấu trúc đệ quy Số hạng cn gốc (chi phí mức đỉnh đệ quy), hai gốc đệ quy nhỏ T (n / 2) Phần (c) thực trình thêm bớc cách mở rộng T (n / 2) Chi phí cho nút mức thứ hai đệ quy cn / Phần (d) đệ quy kết Không xác dùng số ®Ĩ biĨu diƠn thêi gian gi¶i vÊn ®Ị kÝch thíc thời gian cho phần tử mảng bớc chia trộn Chúng ta vợt qua vấn đề cách chọn c lớn hai số hiểu công thức ®Ư quy cđa chóng ta cho cËn trªn cđa thời gian thực hiện, chọn c nhỏ hai số hiểu công thức đệ quy cđa chóng ta cho cËn díi cđa thêi gian thực Cả hai cận có bậc nlg n đó, thời gian thực ( n lg n) T (n) 2T (n / 2) cn Phần (a) T(n), sau đợc mở rộng sang phần (b) (c) Cây mở rộng đầy đủ phần (d) có lg n Hình 2.5 Cây xây dựng đệ quy møc TiÕp theo, chóng ta céng c¸c chi phÝ mức Mức cao có chi phí cn, møc tiÕp theo cã chi phÝ c( n / 2) c (n / 2) cn , møc tiÕp theo n÷a cã chi phÝ c( n / 4) c (n / 4) c (n / 4) c(n / 4) cn … Nãi chung, møc thø i có 2i nút, nút có chi phí c (n / i ) , ®ã tỉng chi phÝ ë møc thø i lµ i c(n / i ) cn Tại mức đỉnh, có n nút, nút có chi phí c, tổng chi phí cn Tổng số mức đệ quy hình 2.5 lg n Điều dễ nhận thấy từ tham số quy nạp không hình thức Trờng hợp sở xảy n 1 , hay chØ cã mét møc V× lg1 , nên ta có lg n kết xác số mức Bây giả thiết số mức đệ quy với i nót lµ lg i i Do giả thiết ban đầu kích thớc đầu vào bội 2, kích thớc liệu vµo tiÕp theo sÏ lµ i 1 Mét với i nút có nhiều møc so víi mét c©y i 1 i nót, tổng số mức (i 1) lg §Ĩ tÝnh tỉng chi phí biểu diễn đệ quy (2.2), đơn giản cộng tất chi phí mức Có lg n mức, mức có chi phÝ cn, vËy tỉng chi phÝ lµ cn(lg n 1) cn lg n cn Bá qua số hạng có bậc thấp số c, ta có kết cần tìm (n lg n) Bài tập 2.3-1 Sử dụng hình 2.4, mô tả thao tác xếp trộn mảng a = 2.3-2 ViÕt lại thủ tục MERGE mà không sử dụng lính canh, thay vào dừng hai mảng L R đà đợc chép hết phần tử ngợc vào A sau chép phần tử lại mảng lại ngợc vào A 2.3-3 Chứng minh nghiệm công thức đệ quy Nếu n = 2, T (n) NÕu n k , k 2T (n / 2) n lµ T (n) (n lg n) 2.3-4 Sắp xếp chèn đợc viết dới dạng đệ quy nh sau Để xếp A[1 n] , ta xếp đệ quy A[1 n 1] chèn A[n] vào mảng đà xếp A[1 n 1] Viết công thức đệ quy cho thời gian thực phiên xếp chèn 2.3-5 Quay lại toán tìm kiếm (bài tập 2.1-3), ta nhận thấy dÃy a đà đợc sắp, ta kiểm tra điểm dÃy theo v loại bỏ phân nửa dẫy mà không cần xét Tìm kiếm nhị phân thuật toán lặp lại thủ tục này, lần chia đôi kích thớc dÃy Viết mà giả, lặp đệ quy cho kỹ thuật tìm kiÕm nµy Chøng tá r»ng thêi gian thùc hiƯn trờng hợp xấu (lg n) 2.3-6 Ta nhận thấy vòng lặp while dòng 5-7 thđ tơc INSERTIONSORT ë mơc 2.1 sư dơng t×m kiếm tuyến tính để tìm ngợc mảng đà s¾p xÕp A[1 j 1] Cã thĨ dïng kĩ thuật tìm kiếm nhị phân (bài tập 2.35) để cải thiện thời gian thực chung trờng hợp xấu xếp chèn (n lg n) đợc không? 2.3-7 Mô tả thuật toán (n lg n) thời gian để xác định tập S gåm n sè thùc cã sè thùc x hay kh«ng? Vấn đề 2-1 Sắp xếp chèn mảng nhỏ xếp chọn Mặc dù xếp trộn thực hiƯn víi (n lg n) trêng hỵp xÊu nhÊt xếp chèn thực với (n ) thời gian trờng hợp xấu nhất, nhân tố số xếp chèn làm thực nhanh với n nhỏ Vì vậy, ta sử dơng s¾p xÕp chÌn s¾p xÕp trén vÊn đề trở nên đủ nhỏ Xét phiên xếp trộn mà n / k mảng độ dài k đợc xếp xếp chèn sau đợc trộn chế trộn thông thờng, với k giá trị cần xác định a Chứng minh với n / k danh sách con, danh sách độ dài k, đợc s¾p xÕp chÌn víi (nk ) thêi gian trêng hợp xấu b Chứng minh danh sách đợc trộn (nk lg(n / k )) thêi gian trêng hỵp xÊu nhÊt c Tht toán sửa đổi chạy với (nk n lg(n / k )) thời gian trờng hợp xấu Giá trị tiệm cận lớn k (theo kí hiệu ) mà thuật toán sửa đổi cã cïng tiƯm cËn thêi gian víi s¾p xÕp trén chuẩn d Trong thực tế nên chọn k bao nhiêu? 2-2 Chứng minh tính đắn xếp bọt Sắp xếp bọt thuật toán xếp thông thờng Nó làm việc theo cách liên tiếp hoán đổi hai vị trí kề mà không thứ tự 2-3 Các phép nghịch đảo Cho A[1 n] mảng n số phân biệt Nếu i j A[i ] A[ j ] cặp (i, j ) đợc gọi nghịch A a Liệt kê năm nghịch đảo mảng b Mảng với phần tử thuộc tập {1,2, , n} có nhiều nghịch nhất? Tính số lợng c Nêu mối quan hệ thời gian thực kỹ thuật xếp chèn số lợng nghịch mảng liệu vào Xác minh câu trả lời d Nêu thuật toán xác định số lợng nghịch hoán vị n phần tử (n lg n) thời gian trờng hợp xấu (Hớng dẫn: sửa đổi phơng pháp xếp trộn) ... đi? ?m mặt phẳng, muốn t? ?m bao lồi nhỏ đi? ?m Bao lồi đa giác lồi nhỏ chứa đi? ?m này, giả thiết đi? ?m nh đinh gắn bảng Bao lồi nh dây cao su bao quanh đi? ?m neo M? ??i đi? ?m neo xung quanh nh đỉnh vectơ miền... đi? ?m mà đằng sau xếp trộn nhanh nhiỊu Víi m? ?t vÝ dơ thĨ, chóng ta h·y cho thử sức m? ?y tính nhanh (m? ?y A) chạy xếp chèn với m? ??t tính tốc độ ch? ?m (m? ?y B) chạy xếp trộn M? ??i m? ?y phải xếp dÃy g? ?m hàng... l? ?m dùng m? ? hình RAM Vấn đề, RAM có lệnh xếp điều xảy Thì xếp lệnh Nhng nh không thực tế, m? ?y tính có loại lệnh Vì ta quan t? ?m đến m? ? hình m? ?y tính thực tế M? ? hình RAM có thị lệnh phổ biến m? ?y