1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO cáo THỰC tập (21)

41 13 0

Đ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

Nội dung

Chương I MỞ ĐẦU Algorithms + Data Structures = Programs Niklaus Wirth Lưu trữ xử lý thông tin hạt nhân tất chương trình máy tính Việc lập trình giải tốn thực tế cần phải qua nhiều bước, hai bước quan trọng nhất, khơng thể tách rời, tìm mơ hình lưu trữ thông tin (xây dựng cấu trúc liệu) mơ hình xử lý thơng tin (tìm giải thuật) Chương nói quy trình thiết kế chương trình máy tính, cách xây dựng cấu trúc liệu cách phân tích đánh giá giải thuật Những cấu trúc liệu giải thuật cụ thể phân tích rõ chương sau Bài Từ tốn tới chương trình Có nhiều cơng đoạn phải thực viết chương trình máy tính để giải tốn thực tế: Mơ hình hóa tốn, làm rõ ràng buộc đặc điểm kỹ thuật, tìm thuật giải, cài đặt, kiểm thử đánh giá…Trong phần đầu tiên, trình bày sơ lược bước tiến hành phải lập trình giải tốn thực tế 1.1 Mơ hình hóa tốn Đa số tốn thực tế khơng thể mơ tả cách đơn giản xác Có tốn khơng thể giải máy tính với trình độ kỹ thuật Ngay với tốn giải tính khả thi lời giải phụ thuộc vào vài tham số (hay ràng buộc) đó, chẳng hạn kích thước liệu, thời gian thực máy tính, … Đơi ta biết tham số qua thí nghiệm Nếu mơ hình hóa tốn, tức xác định xem phải giải vấn đề gì?, với giả thiết cho lời giải cần phải đạt yêu cầu gì, bắt tay vào việc tìm giải pháp Cách dễ dàng tìm sử dụng chương trình/lời giải sẵn có, mơ hình tốn chưa có lời giải, khảo sát xem mơ hình tốn có đặc điểm biết để từ xây dựng giải pháp tốt Hầu hết cơng cụ tốn học huy động việc mơ hình hóa phát biểu tốn Xác định mơ hình tốn quan trọng ảnh hưởng tới cách thức giải chất lượng lời giải Một vấn đề thực tế thường cho thông tin mơ hồ hình thức, ta phải xây dựng mơ hình tốn cách xác chặt chẽ để hiểu tìm giải pháp tốt Ví dụ: Bài tốn: Một dự án có 𝑛 người tham gia thảo luận, họ muốn chia thành nhóm nhóm thảo luận riêng phần dự án Nhóm có người trình lên nhiêu ý kiến Nếu lấy nhóm ý kiến đem ghép lại ý kiến triển khai dự án Hãy tìm cách chia để số ý kiến cuối thu lớn Mô hình hóa: Cho số ngun dương 𝑛, tìm phân tích 𝑛 thành tổng số nguyên dương cho tích số lớn Trên thực tế, ta nên xét vài trường hợp cụ thể để thơng qua hiểu tốn rõ thấy thao tác cần phải tiến hành Một vấn đề cần lưu ý yêu cầu chất lượng lời giải: Có tốn thực tế yêu cầu lời giải tuyệt đối xác, có tốn u cầu lời giải tốt tới mức độ (tồi mức chấp nhận được), mà lời giải xác tuyệt đối địi hỏi q nhiều chi phí thời gian nhớ 1.2 Tìm thuật tốn Ngay có mơ hình tốn học cho vấn đề cần giải quyết, bắt tay vào tìm giải pháp dạng thuật tốn hay giải thuật Thuật toán hệ thống chặt chẽ rõ ràng thị nhằm xác định dãy thao tác liệu vào cho: Bất kể liệu vào nào, sau số hữu hạn bước thực thao tác ra, ta đạt mục tiêu định 1.2.1 Các đặc trưng thuật tốn  Tính đơn nghĩa Ở bước thuật toán, thao tác phải rõ ràng, không gây nên nhập nhằng, lộn xộn, tùy tiện, đa nghĩa Khơng nên lẫn lộn tính đơn nghĩa tính đơn định: Người ta phân loại thuật toán làm hai loại: Đơn định (Deterministic) Ngẫu nhiên (Randomized) Với hai liệu vào giống nhau, thuật toán đơn định thi hành mã lệnh giống cho kết giống nhau, thuật tốn ngẫu nhiên thực theo mã lệnh khác cho kết khác Ví dụ: Để số tự nhiên 𝑥: 𝑎 ≤ 𝑥 ≤ 𝑏, ta viết 𝑥 ≔ 𝑎 hay 𝑥 ≔ 𝑏 hay 𝑥 ≔ (𝑎 + 𝑏) div 2, thuật tốn ln cho giá trị với liệu vào hai số tự nhiên 𝑎 𝑏 Nhưng ta viết 𝑥 ≔ 𝑎 + Random(𝑏 − 𝑎 + 1) thu kết khác lần thực với liệu vào 𝑎 𝑏 tùy theo máy tính tạo số ngẫu nhiên  Tính dừng Thuật tốn khơng rơi vào q trình vơ hạn, phải dừng lại cho kết sau số hữu hạn bước  Tính Sau thực tất bước thuật tốn theo q trình định, ta phải kết mong muốn với liệu đầu vào Kết kiểm chứng yêu cầu tốn  Tính phổ dụng Thuật tốn phải dễ sửa đổi để thích ứng với tốn lớp tốn làm việc liệu khác  Tính khả thi Tính khả thi thuật tốn kiểm tra điều kiện:  Kích thước phải đủ nhỏ: Ví dụ: Một thuật tốn có tính hiệu lượng nhớ mà yêu cầu vượt khả lưu trữ hệ thống máy tính  Thuật tốn phải chuyển thành chương trình: Ví dụ thuật tốn u cầu phải biểu diễn số vơ tỉ với độ xác tuyệt đối không thực với hệ thống máy tính  Thuật tốn phải máy tính thực thời gian cho phép, điều khác với lời giải toán (chỉ cần chứng minh kết thúc sau hữu hạn bước) Ví dụ xếp thời khóa biểu cho học kỳ khơng thể cho phép máy tính chạy tới học kỳ sau 1.2.2 Mơ tả thuật tốn Có ba phương pháp mơ tả thuật tốn:  Dùng ngơn ngữ tự nhiên (Natural Language): Diễn giải thuật toán bước thực nêu rõ nhiệm vụ bước Mơ tả thuật tốn ngơn ngữ tự nhiên có ưu điểm dễ đọc, dễ hiểu đơi dễ gây hiểu lầm ngơn ngữ tự nhiên thường không đủ chặt chẽ  Dùng mã giả (Pseudo code): Mượn từ khóa, cú pháp ngơn ngữ lập trình để mơ tả thuật tốn, khác với việc lập trình chương trình hồn thiện, viết mã giả, ta không cần chi tiết việc mô tả số công đoạn, mà cần đặc tả nhiệm vụ công đoạn Dùng giả mã có ưu điểm mã giả dựa ngơn ngữ lập trình sử dụng việc lập trình cụ thể trở nên dễ dàng, nhiên lập trình viên khơng biết ngơn ngữ gốc dùng làm mã giả gặp nhiều khó khăn việc đọc hiểu thuật toán  Dùng lưu đồ thuật giải hay sơ đồ khối (Flow chart): Đây cách cổ điển để mơ tả thuật tốn Lưu đồ thuật giải bao gồm khối mũi tên tiến trình thực hiện, khối có chức riêng tùy theo chức năng, có quy định hình dạng khối Khi thiết kế phần mềm hay thuật toán phức tạp, người ta thường sử dụng sơ đồ khối để mơ hình tiến trình xử lý, cịn việc mơ tả chi tiết hoạt động khối tùy theo tính phức tạp vấn đề, người ta dùng ngơn ngữ tự nhiên mã giả Ví dụ: Thuật tốn Euclide tính ước số chung lớn hai số nguyên dương Mô tả ngôn ngữ tự nhiên: Nhập vào hai số nguyên dương 𝑎, 𝑏, chừng thấy 𝑏 ≠ thay (𝑎, 𝑏) ≔ (𝑏, 𝑎 mod 𝑏) Trả giá trị 𝑎 ước số chung lớn hai số ban đầu Mô tả mã giả dựa PASCAL: Input  a, b; while b ≠ (a, b) := (b, a mod b); Output  a; Mô tả lưu đồ thuật giải: Start Input → 𝑎, 𝑏 𝑏≠0 NO Output ← 𝑎 YES 𝑟 ≔ 𝑎 mod 𝑏 𝑎≔𝑏 𝑏≔𝑟 End 1.3 Tìm cấu trúc liệu cài đặt thuật tốn Chương trình (sub routines) yếu tố quan trọng lập trình cấu trúc Chương trình thực chất tổng quát hóa phép biến đổi (hay thao tác – operators) liệu Thay bị giới hạn phép tốn cộng, trừ, nhân, chia, … ngôn ngữ môi trường lập trình, lập trình viên tự định nghĩa tốn tử dạng chương trình để áp dụng cho kiểu liệu phức hợp Ví dụ viết hàm xử lý phép tốn cộng, trừ, nhân, chia tập đa thức Một ưu điểm khác chương trình chúng sử dụng để giản lược thao tác tồn thuật tốn Bằng cách đưa chương trình vào phần riêng chứa thao tác định để thực việc đó, lập trình viên dễ dàng tìm đến đoạn mã cần sửa đổi cần thiết Với tính chất chương trình con, có thêm khái niệm kiểu liệu trừu tượng (Abstract Data Type), coi kiểu liệu trừu tượng mơ hình tốn học với thao tác định nghĩa mơ hình Kiểu liệu trừu tượng khơng tồn ngơn ngữ lập trình mà dùng để tổng qt hóa tóm lược thao tác thực liệu Ví dụ: Ta định nghĩa kiểu liệu trừu tượng tên TPriorityQueue (hàng đợi có độ ưu tiên) dùng để chứa tập hợp số Trên kiểu liệu có ba thao tác:  𝐼𝑛𝑠𝑒𝑟𝑡(𝑣): Đưa thêm giá trị 𝑣 vào tập hợp  𝐸𝑥𝑡𝑟𝑎𝑐𝑡: Trả phần tử nhỏ tập hợp loại bỏ phần tử khỏi tập hợp  𝑈𝑝𝑑𝑎𝑡𝑒(𝑂𝑙𝑑𝑉𝑎𝑙𝑢𝑒, 𝑁𝑒𝑤𝑉𝑎𝑙𝑢𝑒): Thay đổi giá trị phần tử có giá trị 𝑂𝑙𝑑𝑉𝑎𝑙𝑢𝑒 thành 𝑁𝑒𝑤𝑉𝑎𝑙𝑢𝑒 Kiểu liệu trừu tượng lập trình cài đặt cấu trúc liệu (data structures) Như ví dụ ta cài đặt hàng đợi có độ ưu tiên mảng số nguyên viết hàm/thủ tục 𝐼𝑛𝑠𝑒𝑟𝑡, 𝐸𝑥𝑡𝑟𝑎𝑐𝑡, 𝑈𝑝𝑑𝑎𝑡𝑒 tương ứng Cần phân biệt rõ khái niệm: Kiểu liệu (Data Type), Cấu trúc liệu (Data Structure) Kiểu liệu trừu tượng (Abstract Data Type) Với ngơn ngữ lập trình mơi trường lập trình, kiểu liệu biến tập giá trị mà biến nhận, đồng thời có số phép tốn định nghĩa sẵn tập giá trị Ví dụ PASCAL, biến kiểu Boolean nhận giá trị True False, nhận giá trị khác Với kiểu liệu Boolean, có phép tốn định nghĩa sẵn AND, OR, NOT, XOR Tuy kiểu liệu sở phụ thuộc vào mơi trường lập trình cung cấp (Integer, Boolean, …), có quy tắc để định nghĩa kiểu liệu phức hợp từ kiểu liệu sở (mảng, ghi, …) Một kiểu liệu trừu tượng mơ hình tốn tốn tử định nghĩa mơ hình Có thể thiết kế thuật tốn dựa kiểu liệu trừu tượng, cài đặt thuật toán thành chương trình, lập trình viên phải tìm cách biểu diễn kiểu liệu trừu tượng cấu trúc liệu: bao gồm kiểu liệu, phép tốn mơi trường lập trình cung cấp phép toán tự định nghĩa Trong kỹ thuật lập trình cấu trúc (Structural Programming), kiểu liệu trừu tượng thường cài đặt biến, thủ tục hàm xử lý biến Trong kỹ thuật lập trình hướng đối tượng (Object-Oriented Programming), kiểu liệu trừu tượng thường cài đặt lớp (class), thuộc tính phương thức tác động lên đối tượng hay vài thuộc tính đối tượng Việc lựa chọn cấu trúc liệu tìm cách tổ chức liệu cách hợp lý Việc tùy thuộc vào thuật toán tiến hành liệu vào Có thuật tốn thích ứng với cách tổ chức liệu định, cách tổ chức liệu khác hiệu khơng thể thực Chính vậy, nên mơ tả thuật toán dựa kiểu liệu trừu tượng, tùy theo kiểu liệu trừu tượng cần lưu trữ thơng tin cần có phép tốn gì, xây dựng cấu trúc liệu phù hợp để cài đặt kiểu liệu trừu tượng cho hợp lý Các tiêu chuẩn lựa chọn cấu trúc liệu  Cấu trúc liệu trước hết phải biểu diễn đầy đủ thơng tin nhập xuất tốn  Cấu trúc liệu phải phù hợp với thao tác thuật toán mà ta lựa chọn để giải toán  Cấu trúc liệu phải cài đặt máy tính với ngơn ngữ lập trình sử dụng 1.4 Lập trình Sau có thuật tốn, ta phải tiến hành lập trình cài đặt thuật tốn Muốn lập trình đạt hiệu 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ể kỹ viết chương trình, khả gỡ rối thao tác nhanh Lập trình tốt khơng phải cần nắm vững ngơn ngữ lập trình đủ, phải biết cách viết chương trình uyển chuyển, khơn khéo phát triển để chuyển ý tưởng thành chương trình hồn chỉnh Kinh nghiệm cho thấy thuật toán hay cài đặt vụng nên chạy lại cho kết sai tốc độ chậm Thông thường, ta khơng nên cụ thể hóa tồn chương trình mà nên tiến hành theo phương pháp tinh chế bước (Stepwise refinement):  Ban đầu, chương trình viết để thể thuật toán với bước tổng thể, bước nêu lên công việc phải thực  Một công việc đơn giản đoạn chương trình học thuộc ta tiến hành viết mã lệnh ngơn ngữ lập trình  Một cơng việc phức tạp ta lại chia thành công việc nhỏ để lại tiếp tục với cơng việc nhỏ Trong q trình tinh chế bước, ta phải đưa biểu diễn liệu Như với tinh chế công việc, liệu tinh chế dần, có cấu trúc hơn, thể rõ mối liên hệ liệu Phương pháp tinh chế bước thể tư giải vấn đề từ xuống, giúp cho người lập trình có định hướng thể phong cách viết chương trình Tránh việc mị mẫm, xóa viết lại nhiều lần, biến chương trình thành tờ giấy nháp 1.5 Kiểm thử 1.5.1 Chạy thử tìm lỗi Chương trình người viết ra, mà người nhầm lẫn Một chương trình viết xong chưa chạy máy tính kết mong muốn Kỹ tìm lỗi, sửa lỗi, điều chỉnh lại chương trình kỹ quan trọng người lập trình Kỹ có kinh nghiệm tìm sửa chữa lỗi Có ba loại lỗi:  Lỗi cú pháp: Lỗi hay gặp lại dễ sửa nhất, cần nắm vững ngơn ngữ lập trình đủ Một người bị coi khơng biết lập trình khơng biết sửa lỗi cú pháp  Lỗi cài đặt: Việc cài đặt thể khơng thuật tốn định, lỗi phải xem lại tổng thể chương trình, kết hợp với chức gỡ rối để sửa lại cho  Lỗi thuật tốn: Lỗi gặp nguy hiểm nhất, nhẹ phải điều chỉnh lại thuật tốn, nặng có phải loại bỏ hồn tồn thuật tốn sai làm lại từ đầu 1.5.2 Xây dựng test Có nhiều chương trình khó kiểm tra tính đắn Nhất ta kết Vì chương trình chạy kết (khơng biết sai nào) việc tìm lỗi khó khăn Khi ta nên làm test để thử chương trình Các test nên đặt file văn bản, việc tạo file văn nhanh lần chạy thử cần thay tên file liệu vào xong, không cần gõ lại test từ bàn phím Kinh nghiệm làm test là:  Bắt đầu với test nhỏ, đơn giản, làm tay có đáp số để so sánh với kết chương trình chạy  Tiếp theo test nhỏ, chứa giá trị đặc biệt tầm thường Kinh nghiệm cho thấy test dễ sai  Các test phải đa dạng, tránh lặp lặp lại test tương tự  Có vài test lớn để kiểm tra tính chịu đựng chương trình mà thơi Kết có hay khơng đa số trường hợp, ta khơng thể kiểm chứng với test Lưu ý chương trình chạy qua hết test khơng có nghĩa chương trình Bởi ta chưa xây dựng test làm cho chương trình chạy sai Vì có thể, ta nên tìm cách chứng minh tính đắn thuật tốn chương trình, điều thường khó 1.6 Tối ưu chương trình Một chương trình chạy khơng có nghĩa việc lập trình xong, ta phải sửa đổi lại vài chi tiết để chương trình chạy nhanh hơn, hiệu Thơng thường, trước kiểm thử ta nên đặt mục tiêu viết chương trình cho đơn giản, chạy kết được, sau tối ưu chương trình, ta xem lại chỗ viết chưa tốt tối ưu lại mã lệnh để chương trình ngắn hơn, chạy nhanh Khơng nên viết tới đâu tối ưu mã đến đó, chương trình có mã lệnh tối ưu hóa thường phức tạp khó kiểm sốt Việc tối ưu chương trình thường dựa vào tiêu chí sau đây: 1.6.1 Tính tin cậy Chương trình phải chạy dự định, mơ tả giải thuật Thông thường viết chương trình, phải ln có thói quen kiểm tra tính đắn bước 1.6.2 Tính uyển chuyển Chương trình phải dễ sửa đổi Bởi có chương trình viết hồn hảo mà cần phải sửa đổi lại Chương trình viết dễ sửa đổi làm giảm bớt công sức lập trình viên việc nâng cấp bảo trì 1.6.3 Tính sáng Chương trình viết phải dễ đọc dễ hiểu, để sau thời gian dài, đọc lại cịn hiểu làm Nếu có điều kiện sửa sai (nếu phát lỗi mới), cải tiến hay biến đổi để chương trình giải tốn khác Tính sáng chương trình phụ thuộc nhiều vào cơng cụ lập trình phong cách lập trình 1.6.4 Tính hữu hiệu Chương trình phải chạy nhanh tốn nhớ, tức tiết kiệm khơng gian thời gian Để có chương trình hữu hiệu, cần phải có giải thuật tốt tiểu xảo lập trình Tuy nhiên, việc áp dụng q nhiều tiểu xảo khiến chương trình trở nên rối rắm, khó hiểu sửa đổi Tốc độ phần cứng phát triển nhanh, sử dụng tiểu xảo để tăng tốc độ chương trình khơng phải biện pháp nên lạm dụng 1.7 Tóm tắt Từ phân tích trên, nhận thấy việc làm chương trình địi hỏi nhiều công đoạn tiêu tốn nhiều công sức Chỉ công đoạn không hợp lý làm tăng chi phí viết chương trình Nghĩ cách giải vấn đề khó, biến ý tưởng thành thực khơng dễ Những tốn, thuật tốn, cấu trúc liệu đề cập tới sách kiến thức phổ thông, người học lập trình khơng sớm muộn phải biết tới Hy vọng học xong chuyên đề này, qua việc cài đặt cấu trúc liệu giải thuật mẫu mực, tự rút cho kinh nghiệm lập trình mà kinh nghiệm khơng thể học qua sách Bài Vai trị thuật tốn tính tốn Chúng ta có hiểu biết khái niệm thuật toán Trong phần này, sâu vào việc phân tích chi tiết sau:  Thế thuật toán?  Tại việc học kiến thức thuật toán cần thiết?  Thuật tốn đóng vai trị chương trình máy tính? 2.1 Thế thuật tốn Sau mơ hình hóa tốn, bước phải làm thiết kế thuật toán giải tốn Nhắc lại định nghĩa thuật toán hệ thống chặt chẽ rõ ràng thị nhằm xác định dãy thao tác liệu vào cho: Bất kể liệu vào (input) nào, sau số hữu hạn bước thực thao tác ra, ta thu kết (output) mong muốn 2.2 Những loại tốn có thuật tốn để giải Những loại tốn giải thuật toán nằm phạm vi hiểu biết người, phạm vi nhỏ bé so với chưa biết Ta kể vài ví dụ điển hình tốn thực tế giải thuật tốn: Dự án gien người (Human Genome Project) có nhiệm vụ lập đồ gần tất 20000-25000 gien chuỗi DNA người, mã hóa chúng dãy tỉ ký hiệu lưu trữ sở liệu phát triển cơng cụ phân tích liệu Để xử lý lượng liệu lớn đến vậy, vấn đề liên quan đến hàng loạt thuật toán hiệu để tiết kiệm thời gian, công sức tiền bạc Dự án kết thúc vào năm 2003 (nửa kỷ sau Watson Crick đưa mô tả cấu trúc DNA) với phần lớn mục tiêu định hoàn thành Mạng Internet cho lượng thông tin khổng lồ Nhưng để truy cập sử dụng thông tin đó, phải có cơng cụ xử lý liệu hiệu Ví dụ tìm đường nhanh để truyền tải liệu, xây dựng máy tìm kiếm để nhanh chóng lọc thơng tin cần tìm…, việc xây dựng công cụ kéo theo việc phát triển hàng loạt thuật toán xử lý văn bản, nén, tách phân loại thông tin, … Thương mại điện tử cho phép việc trao đổi sản phẩm dịch vụ trở nên nhanh chóng đơn giản Cùng với thương mại điện tử, khả bảo mật thông tin cá nhân mã số thẻ tín dụng, mật mã, … trở nên quan trọng Chính nhu cầu đó, thuật tốn kiểm tra tính tồn vẹn thơng tin đường truyền liệu, thuật tốn mã hóa cơng khai chữ ký điện tử phát triển dựa lý thuyết thuật toán số học Mỗi vấn đề kể liên quan tới nhiều chuyên ngành khoa học máy tính: Tin sinh học (BioInformatics), Lý thuyết đồ thị (Graph theory), Trích chọn thơng tin (Information extraction), Tìm kiếm thông tin (Information retrieval), Xử lý ngôn ngữ tự nhiên (Natural  Lập giả thuyết đủ mạnh Đôi đoán thời gian thực giải thuật, không chứng minh giả thuyết không đủ mạnh Xét ví dụ cơng thức sau: 𝑇(𝑛) = 𝑇(⌊𝑛⁄2⌋) + 𝑇(⌈𝑛⁄2⌉) + (3.15) Nếu đoán 𝑇(𝑛) = Ο(𝑛) cố gắng chứng minh 𝑇(𝑛) ≤ 𝑐𝑛 phương pháp thế, ta có: 𝑇(𝑛) = 𝑇(⌊𝑛⁄2⌋) + 𝑇(⌈𝑛⁄2⌉) + ≤ 𝑐⌊𝑛⁄2⌋ + 𝑐⌈𝑛⁄2⌉ + (3.16) = 𝑐𝑛 + Điều không suy 𝑇(𝑛) ≤ 𝑐𝑛 với lựa chọn số dương 𝑐 Để chứng minh, ta phải đặt giả thuyết mạnh hơn, chẳng hạn 𝑇(𝑛) ≤ 𝑐𝑛 − Khi đó: 𝑇(𝑛) = 𝑇(⌊𝑛⁄2⌋) + 𝑇(⌈𝑛⁄2⌉) + ≤ 𝑐⌊𝑛⁄2⌋ − + 𝑐⌈𝑛⁄2⌉ − + (3.17) = 𝑐𝑛 −  Tránh suy diễn sai logic Cần ý tới tính logic chứng minh quy nạp, chẳng hạn với công thức (3.13), ta sai lầm đốn 𝑇(𝑛) = Ο(𝑛) cách chứng minh 𝑇(𝑛) ≤ 𝑐𝑛 sau: 𝑇(𝑛) = 2𝑇(⌊𝑛⁄2⌋) + 𝑛 ≤ 2𝑐⌊𝑛⁄2⌋ + 𝑛 ≤ 𝑐𝑛 + 𝑛 (3.18) = Ο(𝑛) Sai lầm ta không chứng minh giả thuyết định: 𝑇(𝑛) ≤ 𝑐𝑛  Đổi biến Trong số trường hợp, sử dụng vài phép biến đổi đại số làm vấn đề trở nên đơn giản Chẳng hạn với công thức: 𝑇(𝑛) = 2𝑇(√𝑛) + lg 𝑛 (3.19) Cơng thức phức tạp, nhiên qua phép đổi biến số, vấn đề trở nên quen thuộc: Đặt 𝑚 = lg 𝑛, ta có: 𝑇(2𝑚 ) = 2𝑇(2𝑚⁄2 ) + 𝑚 (3.20) Nếu đặt 𝑆(𝑚) = 𝑇(2𝑚 ), công thức (3.20) trở thành 𝑆(𝑚) = 2𝑆(𝑚⁄2) + 𝑚 (3.21) Cơng thức có dạng tương tự cơng thức (3.13), ta chứng minh 𝑆(𝑚) = Ο(𝑚 lg 𝑚) Vậy thì: 𝑇(𝑛) = 𝑇(2𝑚 ) = 𝑆(𝑚) = Ο(𝑚 lg 𝑚) = Ο(lg 𝑛 lg lg 𝑛) (3.22) 3.5.7 Phương pháp áp dụng định lý Master Định lý 3-7 (Định lý Master) Định lý Master cho ta cách đánh giá hàm 𝑇(𝑛) có dạng: 𝑇(𝑛) = 𝑎𝑇(𝑛⁄𝑏) + 𝑓(𝑛) (3.23) Trong 𝑎 ≥ 𝑏 > hai số, 𝑓(𝑛) hàm dương, 𝑇(𝑛) hàm xác định tập số tự nhiên, 𝑛⁄𝑏 ⌊𝑛⁄𝑏⌋ hay ⌈𝑛⁄𝑏⌉ Khi đó,  Nếu 𝑓(𝑛) = Ο(𝑛log𝑏 𝑎−𝜖 ) với số 𝜖 > 0, 𝑇(𝑛) = Θ(𝑛log𝑏 𝑎 )  Nếu 𝑓(𝑛) = Θ(𝑛log𝑏 𝑎 ) 𝑇(𝑛) = Θ(𝑛log𝑏 𝑎 lg 𝑛)  Nếu 𝑓(𝑛) = Ω(𝑛log𝑏 𝑎+𝜖 ) với số 𝜖 > 𝑎𝑓(𝑛⁄𝑏) ≤ 𝑐𝑓(𝑛) với số 𝑐 < với giá trị 𝑛 đủ lớn 𝑇(𝑛) = Θ(𝑓(𝑛)) Định lý Master định lý quan trọng việc phân tích thời gian thực giải thuật lặp hay đệ quy có thời gian thực viết dạng (3.23) Tuy nhiên việc chứng minh định lý dài dịng, ta tham khảo tài liệu khác 3.6 Thời gian thực tình trạng liệu vào Có nhiều trường hợp, thời gian thực giải thuật phụ thuộc vào kích thước liệu mà cịn phụ thuộc vào tình trạng liệu Chẳng hạn thời gian xếp dãy số theo thứ tự tăng dần mà dãy đưa vào chưa có thứ tự khác với thời gian xếp dãy số xếp xếp theo thứ tự ngược lại Lúc này, phân tích thời gian thực giải thuật ta phải xét tới trường hợp tốt nhất, trường hợp trung bình trường hợp xấu Nếu ta xét tất liệu kích thước 𝑛 tìm liệu có thời gian thực lâu nhất, gọi thời gian 𝑇𝑤𝑜𝑟𝑠𝑡 (𝑛) Khi việc đánh giá thời gian thực giải thuật dựa hàm 𝑇𝑤𝑜𝑟𝑠𝑡 (𝑛) gọi phân tích thời gian thực giải thuật trường hợp xấu (worst-case analysis) Tương tự vậy, ta gọi 𝑇𝑏𝑒𝑠𝑡 (𝑛) thời gian thực nhanh liệu kích thước 𝑛 việc đánh giá thời gian thực giải thuật dựa hàm 𝑇𝑏𝑒𝑠𝑡 (𝑛) gọi phân tích thời gian thực giải thuật trường hợp tốt (bestcase analysis) Phép phân tích thời gian trung bình thực giải thuật (average-case analysis) thực sau: Giả sử liệu vào tuân theo phân phối xác suất (chẳng hạn phân phối nghĩa khả chọn liệu vào nhau), tính giá trị kỳ vọng (trung bình) thời gian chạy cho kích thước liệu 𝑛: 𝑇𝑎𝑣𝑒𝑟𝑎𝑔𝑒 (𝑛), sau phân tích thời gian thực giải thuật dựa hàm 𝑇𝑎𝑣𝑒𝑟𝑎𝑔𝑒 (𝑛) Để lấy ví dụ việc phân tích thời gian thực giải thuật trường hợp, ta xét lại tốn tìm kiếm: Cho dãy số 𝐴 = (𝑎1 , 𝑎2 , … , 𝑎𝑛 ) xếp theo thứ tự không giảm: 𝑎1 ≤ 𝑎2 ≤ ⋯ ≤ 𝑛 số 𝑣, cho biết số 𝑣 có dãy 𝐴 khơng, số 𝑣 có dãy 𝐴, cho biết số phần tử dãy 𝐴 có giá trị 𝑣 Thuật tốn tìm kiếm tuần tự: Input  a[1 n], v; p := 1; while (p  n) and (a[p] < v) p := p + 1; if (p > n) or (a[p]  v) then Output  “Not Found” else Output  p; Thuật toán tìm kiếm so sánh phần tử dãy với giá trị 𝑣 kết thúc gặp phần tử 𝑎𝑝 ≥ 𝑣 Cuối việc kiểm chứng 𝑎𝑝 có 𝑣 hay khơng Trong thuật tốn tìm kiếm coi phép so sánh 𝑝 ≤ 𝑛 phép toán tích cực Trường hợp tốt nhất, giá trị 𝑣 nhỏ phần tử dãy 𝐴, phép toán tích cực thực lần, thời gian thực thuật tốn tìm kiếm Θ(1) Trường hợp xấu nhất, giá trị 𝑣 lớn phần tử cuối dãy 𝐴, phép tốn tích cực thực 𝑛 + lần, thời gian thực thuật tốn tìm kiếm Θ(𝑛) Để xác định thời gian trung bình thực giải thuật, xét ba đoạn (−∞, 𝑎1 ); [𝑎1 , 𝑎𝑛 ] (𝑎𝑛 , +∞) Gọi 𝑝1 , 𝑝2 , 𝑝3 xác suất để giá trị 𝑣 rơi vào ba đoạn trên, gọi 𝑇1 (𝑛), 𝑇2 (𝑛) 𝑇3 (𝑛) trung bình số lần phép tốn tích cực giá trị 𝑣 rơi vào ba đoạn xét Khi trung bình số lần thực phép tốn tích cực thuật tốn tìm kiếm là: 𝑇(𝑛) = 𝑝1 𝑇1 (𝑛) + 𝑝2 𝑇2 (𝑛) + 𝑝3 𝑇3 (𝑛) (3.24) Nếu cho phần tử 𝑎1…𝑛 𝑣 nhận giá trị khơng gian ℝ, [𝑎1 , 𝑎𝑛 ] bị chặn hai phía cịn (−∞, 𝑎1 ] (𝑎𝑛 , +∞] khơng bị chặn phía, ta suy 𝑝1 = 0.5, 𝑝2 = 𝑝3 = 0.5 Tức là: 𝑇(𝑛) = 0.5𝑇1 (𝑛) + 0.5𝑇3 (𝑛) (3.25) Ngồi ra, số lần thực phép tốn tích cực 𝑣 < 𝑎1 trường hợp tốt nhất: 𝑇1 (𝑛) = 1, số lần thực phép tốn tích cực 𝑣 > 𝑎𝑛 trường hợp xấu nhất: 𝑇3 (𝑛) = 𝑛 + Vậy trung bình số lần thực phép tốn tích cực là: 𝑇(𝑛) = 𝑛+2 (3.26) Vậy thuật tốn tìm kiếm có thời gian thực trung bình Θ(𝑛) Bây ta xét thuật tốn tìm kiếm nhị phân: Input  a[1 n], v; L := 1; H := n; while L  H begin M := (L + H) div 2; if a[M] < v then L := M + else H := M - 1; end; if (L > n) or (a[L]  v) then Output  “Not Found” else Output  L; Trong thuật toán tìm kiếm nhị phân, coi phép so sánh 𝐿 ≤ 𝐻 phép tốn tích cực, số lần thực phép tốn số lần thực vòng lặp while cộng thêm Tại bước lặp, giả sử đoạn xét 𝑎𝐿…𝐻 có độ dài 𝑚 = 𝐻 − 𝐿 + 1, thuật toán thực phép tốn tích cực giảm độ dài đoạn xét xuống nhiều ⌊𝑚⁄2⌋ phần tử Vậy số lần thực phép tốn tích cực là: 𝑇(𝑚) = + 𝑇(⌊𝑚⁄2⌋) (3.27) Ta đưa dự đốn 𝑇(𝑚) ≤ 𝑐 lg 𝑚 tìm cách chứng minh điều phương pháp thế: 𝑇(𝑚) ≤ + 𝑇(⌊𝑚⁄2⌋) ≤ + 𝑐 lg(𝑚⁄2) ≤ 𝑐(1 + lg(𝑚⁄2) (3.28) = 𝑐 lg 𝑚 Điều dự đoán với cách chọn số 𝑐 > 1, thuật tốn tìm kiếm nhị phân có thời gian thực Ο(lg 𝑛) tình trạng liệu đầu vào Điều có trường hợp thuật tốn tìm kiếm thực nhanh chút, đa số trường hợp, thuật tốn tìm kiếm nhị phân (Ο(lg 𝑛)) tốt hẳn thuật tốn tìm kiếm (Ω(𝑛)) Cũng khơng khó khăn để chứng minh thời gian thực thuật tốn tìm kiếm nhị phân Ω(lg 𝑛), tức 𝑇(𝑛) = Θ(lg 𝑛) 3.7 Thời gian thực tổng thể chương trình Việc đánh giá thời gian thực trường hợp tốt nhất, xấu trung bình nói phần trước trường hợp thực giải thuật lần Nếu giải thuật thực nhiều lần chương trình, cần có đánh giá tổng thể Thời gian thực giải thuật phải tính tổng thời gian thực giải thuật chia cho số lần thực giải thuật chương trình Cách đánh giá gọi đánh giá bù trừ (amortized analysis) Không nên nhầm lẫn đánh giá bù trừ với đánh giá thời gian thực trung bình Khi đánh giá độ phức tạp trung bình, ta coi giải thuật thử với tất tình trạng liệu tính thời gian trung bình thực hiện, lần thử thực độc lập Nhưng chương trình, mà giải thuật thực nhiều lần lần thực sau tận dụng kết lần thực trước để giảm bớt chi phí khơng gian thời gian Đánh giá bù trừ phải tính đến yếu tố Ta lại lấy ví dụ tốn tìm kiếm: Cho hai dãy số xếp theo thứ tự không giảm: 𝐴 = (𝑎1 ≤ 𝑎2 ≤ ⋯ ≤ 𝑎𝑛 ) 𝐵 = (𝑏1 ≤ 𝑏2 ≤ ⋯ ≤ 𝑏𝑛 ) Hãy cho biết số phần tử dãy 𝐵 có mặt dãy 𝐴 Như phân tích thuật tốn tìm kiếm thuật tốn tìm kiếm nhị phân, ta xét tất phần tử dãy 𝐵 dùng thuật tốn tìm kiếm nhị phân để xác định xem phần tử có dãy 𝐴 khơng, tổng thời gian để thực thuật tốn tìm kiếm Θ(𝑛 lg 𝑛), lấy tổng thời gian chia cho số lần thực thuật tốn tìm kiếm nhị phân, ta suy thời gian thực thuật tốn tìm kiếm nhị phân chương trình Θ(lg 𝑛) Input  a[1 n], b[1 n]; for i := to n begin L := 1; H := n; while L  H //Thuật tốn tìm kiếm nhị phân tìm phần tử ≥ b[i] đoạn a[L H] begin M := (L + H) div 2; if a[M] < b[i] then L := M + else H := M - 1; end; if (L  n) and (a[L] = b[i]) then Output  i; end; Có thể thêm vào tiểu tiết để giới hạn bớt khoảng tìm kiếm sau lần thực thuật tốn tìm kiếm nhị phân Ví dụ cho dãy 𝐴 = (1, 2,5,6,8,9) 𝐵 = (8, 10,11,12,18,20), sau thực tìm kiếm 𝑏1 = dãy 𝐴, ta rút gọn dãy 𝐴 xuống phần tử (8,9) phần tử (1,2,5,6) chắn nhỏ 𝑏2 = 10 Tương tự vậy, sau tìm kiếm giá trị 𝑏2 = 10, dãy 𝐴 bị rút gọn thành dãy rỗng không thời gian thực lệnh tìm kiếm Tuy vậy, tiểu xảo khơng giúp ích tất phần tử dãy 𝐵 nhỏ 𝑎1 Tức trường hợp xấu nhất, đánh giá bù trừ thuật tốn tìm kiếm nhị phân cho kết chi phí thời gian Θ(lg 𝑛) Bây ta thử xét thuật tốn sau, thuật tốn dựa thuật tốn tìm kiếm Input  a[1 n], b[1 n]; p := 1; for i := to n begin //Tìm phần tử ≥ b[i] đoạn a[p n] while (p  n) and (a[p] < b[i]) p := p + 1; if (p ≤ n) and (a[p] = b[i]) then Output  i; end; Thuật toán duyệt số 𝑖 = … 𝑛 dãy 𝐵 bước, tìm phần tử dãy 𝐴 lớn hay 𝑏𝑖 , việc tìm kiếm dừng số 𝑝 gặp phải thoả mãn 𝑝 > 𝑛 𝑎𝑝 ≥ 𝑏𝑖 Sau xác định 𝑏𝑖 có xuất dãy 𝐴 không (𝑏𝑖 = 𝑎𝑝 ?), việc tìm kiếm bước với phần tử 𝑏𝑖+1 tiếp tục từ vị trí 𝑝 khơng cần tìm lại từ đầu dãy 𝐴, tính chất tăng dần hai dãy 𝐴, 𝐵, tất phần tử đứng trước 𝑎𝑝 chắn nhỏ 𝑏𝑖+1 Trong thuật tốn này, ta coi phép tốn tích cực phép so sánh 𝑝 ≤ 𝑛 Tại bước vòng lặp for với biến 𝑖, ta có nhận xét phép tốn tích cực thực 𝑇𝑖 lần giá trị 𝑝 tăng lên 𝑇𝑖 − đơn vị (theo nguyên lý vòng lặp while) Khi kết thúc thuật tốn, giá trị 𝑝 khơng thể vượt q 𝑛 + 1, có nghĩa là: 𝑛 (𝑇1 − 1) + (𝑇2 − 1) + ⋯ + (𝑇𝑛 − 1) = (∑ 𝑇𝑖 ) − 𝑛 ≤ 𝑛 + (3.29) 𝑖=1 Tức xét tổng số lần thực phép tốn tích cực: 𝑛 ∑ 𝑇𝑖 ≤ 2𝑛 + < 3𝑛 , ∀𝑛 > 𝑛0 = (3.30) 𝑖=1 Từ suy số lần thực phép tốn tích cực Ο(𝑛) tính tồn thuật tốn lớn Thuật tốn tìm kiếm bên thực 𝑛 lần , suy đánh giá bù trừ, thời gian lần thực thuật toán tìm kiếm ví dụ Ο(1), tốt so với thuật tốn tìm kiếm nhị phân Ngun lý bù trừ ln phải tính đến thuật toán thực nhiều lần chương trình Sẽ sai lầm đánh giá thuật tốn tìm kiếm trường hợp xấu chi phí thời gian Ω(𝑛) thuật tốn thực 𝑛 lần phí thời gian tổng thể Ω(𝑛2 ) trường hợp xấu 3.8 Chi phí thực giải thuật Khái niệm thời gian thực đặt không dùng để đánh giá chi phí thực giải thuật mặt thời gian mà để đánh giá chi phí thực giải thuật nói chung, bao gồm chi phí khơng gian (lượng nhớ cần sử dụng) Tuy nhiên ta đưa định nghĩa thời gian thực dựa chi phí thời gian cho dễ trình bày Việc đánh giá thời gian thực theo tiêu chí khác tương tự ta biểu diễn mức chi phí theo hàm 𝑇(𝑛) kích thước liệu vào 𝑛 Nếu phát biểu thời gian thực giải thuật Θ(𝑛2 ) thời gian Θ(𝑛) nhớ khơng có sai mặt ngữ nghĩa Thông thường, thời gian thực giải thuật đánh giá qua ký pháp Θ coi phép đánh giá đủ chặt không cần đánh giá qua ký pháp khác Nếu không, để nhấn mạnh đến tính “tốt” giải thuật, người ta thường dùng ký pháp Ο, 𝜊 với ý nghĩa: Chi phí thực giải thuật tối đa là…, hơn… Cịn để đề cập đến tính “tồi” giải thuật, ký pháp Ω, 𝜔 thường sử dụng với ý nghĩa: Chi phí thực giải thuật tối thiểu là…, cao hơn… Bài tập 3-1 Bắt đầu giá trị 𝑛 thuật tốn có thời gian thực 100𝑛2 nhanh thuật tốn có thời gian thực 2𝑛 Bài tập 3-2 Giả sử thời gian thực giải thuật 𝑇(𝑛) 𝜇𝑠 (một micro giây phần triệu giây), điền nốt vào bảng sau giá trị lớn 𝑛 mà thuật toán kết thúc giới hạn thời gian 𝑡 (Để đơn giản, ta coi tháng có 30 ngày năm có 365 ngày) 𝑡 𝑇(𝑛) 1 giây 1 1 phút ngày tháng năm kỷ lg 𝑛 210 √𝑛 1012 𝑛 106 𝑛 lg 𝑛 62746 𝑛2 1000 𝑛3 100 2𝑛 19 51 𝑛! 10 18 Bài tập 3-3 Hãy tường tận cách thực thuật tốn tìm kiếm nhị phân để tìm vị trí xuất giá trị dãy (1,2,3,3,3,8,8,9) Chú ý nêu rõ giá trị biến sau bước lặp Bài tập 3-4 Dùng phép quy nạp để chứng minh 𝑛 luỹ thừa 2, công thức truy hồi: 𝑇(𝑛) = { 2, neu 𝑛 = 2𝑇(𝑛⁄2) + 𝑛, neu 𝑛 = 2𝑘 , ∀𝑘 > viết dạng 𝑇(𝑛) = 𝑛 lg 𝑛 Bài tập 3-5 Có 16 giải thuật có thời gian tính tốn liệu kích thước 𝑛 là: 1000 lg 𝑛 𝑇1 (𝑛) = 2100 𝑇2 (𝑛) = (√2) 𝑇3 (𝑛) = 𝑛2 𝑇4 (𝑛) = 𝑛! 𝑇5 (𝑛) = 3𝑛 𝑇6 (𝑛) = ∑𝑛𝑘=1 𝑘 𝑇7 (𝑛) = lg ∗ 𝑛 𝑇8 (𝑛) = lg(𝑛!) 𝑇9 (𝑛) = 𝑇10 (𝑛) = lg ∗ (lg 𝑛) 𝑇11 (𝑛) = ln 𝑛 𝑇12 (𝑛) = 𝑛lg(𝑙𝑔 𝑛) 𝑇13 (𝑛) = (lg 𝑛)lg 𝑛 𝑇14 (𝑛) = 2𝑛 𝑇15 (𝑛) = 𝑛 lg 𝑛 𝑇16 (𝑛) = ∑𝑛𝑘=1 𝑘 Hãy xếp lại giải thuật theo chiều tăng thời gian thực hiện, có nghĩa tìm thứ tự 𝑖1 , 𝑖2 , … , 𝑖16 cho 𝑇𝑖𝑗 (𝑛) = Ο (𝑇𝑖𝑗+1 (𝑛)) , rõ giải thuật “tương đương” thời gian thực theo nghĩa 𝑇𝑖𝑗 (𝑛) = Θ (𝑇𝑖𝑗+1 (𝑛)) Bài tập 3-6 “Thuật tốn 𝐴 thực chậm với liệu kích thước 𝑛, thời gian thực khơng Ο(2𝑛 )” Hãy câu nói khơng logic Bài tập 3-7 Giải thích khơng có ký pháp 𝜃(𝑓(𝑛)) để hàm vừa 𝜊(𝑓(𝑛)), vừa 𝜔(𝑓(𝑛)) Bài tập 3-8 Chứng minh rằng, ∀𝑎, 𝑏 ∈ ℝ, 𝑏 > 0, ta có (𝑛 + 𝑎)𝑏 = 𝜃(𝑛𝑏 ) Bài tập 3-9 Trong mệnh đề sau, mệnh đề đúng, mệnh đề sai?  𝑓(𝑛) = Ο(𝑔(𝑛)) ⇒ 𝑔(𝑛) = Ο(𝑓(𝑛))  𝑓(𝑛) + 𝑔(𝑛) = Θ(min(𝑓(𝑛), 𝑔(𝑛)))  𝑓(𝑛) = Ο(𝑔(𝑛)) ⇒ lg 𝑓(𝑛) = Ο(lg 𝑔(𝑛)), 𝑓(𝑛) ≥ 𝑔(𝑛) ≥ với giá trị 𝑛 đủ lớn  𝑓(𝑛) = Ο ((𝑓(𝑛)) )  𝑓(𝑛) = Ο(𝑔(𝑛)) ⇒ 𝑔(𝑛) = Ω(𝑓(𝑛))  𝑓(𝑛) = Θ(𝑓(⌊𝑛⁄2⌋))  𝑔(𝑛) = 𝜊(𝑓(𝑛)) ⇒ 𝑓(𝑛) + 𝑔(𝑛) = Θ(𝑓(𝑛)) Bài tập 3-10 Thuật tốn tìm kiếm nhị phân viết dạng đệ quy: Đưa việc tìm kiếm dãy 𝑛 phần tử việc tìm kiếm dãy có ≤ ⌊𝑛⁄2⌋ phần tử Hãy viết thuật tốn tìm kiếm nhị phân dạng đệ quy, từ viết cơng thức tính thời gian thực giải thuật dạng công thức truy hồi dùng phương pháp để xác định thời gian thực Bài tập 3-11 Chỉ chỗ sai chứng minh sau: Giả sử giải thuật có thời gian thực 𝑇(𝑛) cho 𝑇(𝑛) = { 1, 𝑛 ≤ 2𝑇(⌈𝑛⁄2⌉) + 𝑛, 𝑛 > Khi 𝑇(𝑛) = Ω(𝑛 lg 𝑛) 𝑇(𝑛) = Ο(𝑛) Chứng minh 𝑇(𝑛) = Ω(𝑛 lg 𝑛), chọn số dương 𝑐 nhỏ đủ nhỏ để 𝑇(𝑛) ≥ 𝑐𝑛 lg 𝑛 với ∀𝑛 < (chẳng hạn chọn 𝑐 = 0.1) Ta chứng minh 𝑇(𝑛) ≥ 𝑐𝑛 lg 𝑛 với ∀𝑛 ≥ phương pháp quy nạp: 𝑇(𝑛) = 2𝑇(⌈𝑛⁄2⌉) + 𝑛 ≥ 2𝑐⌈𝑛⁄2⌉ lg(⌈𝑛⁄2⌉) + 𝑛 ≥ 2𝑐(𝑛⁄2) lg(𝑛⁄2) + 𝑛 ≥ 𝑐𝑛 lg 𝑛 − 𝑐𝑛 + 𝑛 = 𝑐𝑛 lg 𝑛 + (1 − 𝑐)𝑛 ≥ 𝑐𝑛 lg 𝑛 𝑇(𝑛) = Ο (𝑛), thật vậy, ta lại chọn số dương 𝑐 đủ lớn để 𝑇(𝑛) < 𝑐𝑛 với ∀𝑛 < Ta chứng minh quy nạp cho trường hợp 𝑛 ≥ 𝑇(𝑛) = 2𝑇(⌈𝑛⁄2⌉) + 𝑛 ≤ 2𝑐⌈𝑛⁄2⌉ + 𝑛 ≤ 𝑐(𝑛 + 1) + 𝑛 ≤ (𝑐 + 1)𝑛 + 𝑐 = Ο(𝑛) Ta kết “thú vị”: Từ 𝑇(𝑛) = Ω(𝑛 lg 𝑛) suy 𝑛 lg 𝑛 = Ο(𝑇(𝑛)), lại có 𝑇(𝑛) = Ο(𝑛), theo luật bắc cầu ta suy ra: 𝑛 lg 𝑛 = Ο(𝑛)!!!wow!!! Bài tập 3-12 (Tìm số bị thiếu) Người ta liệt kê tất số tự nhiên từ tới 𝑛 theo thứ tự ngẫu nhiên, sau bỏ số Các số lại cho dãy 𝑎1…𝑛 yêu cầu đặt lập trình để tìm số bị bỏ Để tìm số bị thiếu, vấn đề trở thành dễ dàng ta lập mảng phụ kiểu logic 𝑏0…𝑛 với giá trị khởi tạo hoàn toàn 𝐹𝑎𝑙𝑠𝑒, sau duyệt phần tử 𝑎𝑖 đặt 𝑏𝑎𝑖 ≔ 𝑇𝑟𝑢𝑒 Cuối ta duyệt mảng 𝑏0…𝑛 để tìm số 𝑣 mà 𝑏𝑣 = 𝐹𝑎𝑙𝑠𝑒, 𝑣 số bị bỏ Tuy nhiên, giả sử máy tính khơng thể biết giá trị phần tử 𝑎𝑖 thị sơ cấp, phần tử dãy 𝑎1…𝑛 biểu diễn dạng nhị phân máy đọc bit 𝑎1…𝑛 thị sơ cấp Hãy tìm thuật toán để chứng tỏ với thị sơ cấp này, ta tìm số bị bỏ thời gian Ο(𝑛) Bài Một số ý đọc sách 4.1 Ngôn ngữ mơi trường lập trình Các chương trình minh họa sách viết chủ yếu Object Pascal (OBJPAS) Mơi trường lập trình tương ứng Free Pascal for Windows - phần mềm miễn phí phổ biến giới học sinh/sinh viên việc học lập trình Tuy nhiên bạn có Embarcadero RAD Studio*, bạn nên thực hành trực tiếp mơi trường để có hỗ trợ tối đa từ cơng cụ phát triển phần mềm chuyên nghiệp Tôi có dự định cung cấp thêm mã nguồn C++ song song với mã nguồn OBJPAS, nhiên việc tùy vào thời gian cho phép Mã nguồn OBJPAS chắn giữ Lý OBJPAS ngơn ngữ self-documented (đọc chương trình hiểu thuật tốn) nên để diễn giải thuật tốn dùng OBJPAS làm mã giả chương trình thuật tiện nhiều† Ngồi hai ngơn ngữ này, tơi chưa có ý định chuyển sang ngơn ngữ khác, có trình dịch OBJPAS C++ cho mã khả thi có tốc độ tốt Khơng nên quan trọng hóa việc sử dụng ngơn ngữ lập trình Ngơn ngữ bạn thành thạo ngôn ngữ mạnh Để học thuật tốn điều quan trọng tư thiết kế đánh giá giải thuật, để phát triển phần mềm điều quan trọng lại hiểu nắm vững công cụ phát triển Bạn học OBJPAS/C++ tuần bạn học lập trình ngơn ngữ đó, để học Delphi/Visual C++, theo tơi cần năm đủ độ thành thạo chưa kể việc phải liên tục cập nhật kiến thức cho phiên Trong phần lớn chương trình, tơi cố gắng không sử dụng đặc tả hướng đối tượng, chương trình minh hoạ ngắn Ngồi việc viết theo đặc tả hướng đối tượng yêu cầu người đọc phải đọc từ đầu tới cuối để hiểu kiến trúc kế thừa (inheritance) đa hình (polymorphism) thư viện lớp, điều gây thời gian người đọc cần tra cứu toán, hay thuật toán sách 4.2 Nhập/xuất liệu Nếu khơng có ghi thêm, tất chương trình minh họa sách sử dụng thiết bị nhập/xuất chuẩn (standard input/output devices): Mặc định chương trình lấy liệu vào từ bàn phím in kết hình Nếu lượng liệu nhập/xuất lớn, * Embarcadero RAD Studio bao gồm Delphi®, C++Builder®, Delphi Prism RadPHP™ † Dĩ nhiên viết mã C++ theo kiểu self-documented, khơng phải phong cách viết C++ chuyên nghiệp Viết chẳng tận dụng chút ưu điểm C++ cả, đơn “dịch thuật” từ mã Object Pascal sang C++ mà việc có nhiều phần mềm chuyển mã bán tự động làm Phong cách lập trình C++ trọng đến tính ngắn gọn hiệu (cần hiểu chương trình phải có tài liệu diễn giải kèm theo) lập trình Object Pascal đề cao tính chặt chẽ cấu trúc bạn sửa đổi chút mã nguồn cho nhập/xuất liệu qua files văn bản, làm theo cách sau: Soạn thảo file văn chứa liệu vào (ví dụ INPUT.TXT) theo khn dạng chương trình quy định Chọn tên file chứa kết (ví dụ OUTPUT.TXT), tốt file chưa có đĩa để tránh bị ghi đè lên thông tin quan trọng Trong Free Pascal IDE, bạn vào menu Run/Parameters…, gõ vào tham số dòng lệnh: OUTPUT.TXT (Dấu < dùng để file văn dùng thiết bị nhập chuẩn, dấu > dùng để file văn dùng thiết bị xuất chuẩn, bạn viết >PRN, chương trình in kết máy in) Sau chạy chương trình, bạn có file OUTPUT.TXT chứa kết tương ứng với liệu vào file INPUT.TXT TÀI LIỆU THAM KHẢO Adelson-Velsky, G M., & Landis, Y M (1962) An algorithm for the organization of information Proceedings of the USSR Academy of Sciences, (pp 263-266) Aho, A V., Hopcroft, J E., & Ullman, J D (1983) Data Structures and Algorithms Addison Wesley Bayer, R (1972) Symmetric binary B-Trees: Data structure and maintenance algorithms Acta Informatica, 1, 290–306 Bentley, J (1977) Solution to Klee's rectangle problems Technical report, Carnegie-Mellon university, Pittsburgh, PA Coppersmith, D., & Winograd, S (1987) Matrix multiplication via arithmetic progressions STOC '87: Proceedings of the nineteenth annual ACM symposium on Theory of computing (pp 1-6) New York, United States: ACM Cormen, T H., E., L C., L., R R., & Clifford, S (2009) Introduction to Algorithms (3rd ed.) MIT Press de Berg, M., Cheong, O., van Kreveld, M., & Overmars, M (2008) Computational Geometry: Algorithms and Applications (3rd ed.) Springer-Verlag Ding, Y., & Weiss, M A (1993) Best case lower bounds for heapsort Computing, 49(1), 1-9 Fenwick, P M (1994) A New Data Structure for Cumulative Frequency Tables Software: Practice and Experience, 24, 327-336 Floyd, R W (1964) Algorithm 245 - Treesort Communications of the ACM, 7(12), 701 Ford, L R., & Johnson, S M (1959) A Tournament Problem The American Mathematical Monthly, 66(5), 387-389 Fredman, M L., & Tarjan, R E (1987) Fibonacci heaps and their uses in improved network optimization algorithms Journal of the ACM, 34(3), 596-615 Hoare, C A (1962) QuickSort Computer Journal, 5(1), 10-15 Hopcroft, J E., & Tarjan, R E (1973) Efficient algorithms for graph manipulation Communications of the ACM, 16(6), 372-378 Huffman, D A (1952) A Method for the Construction of Minimum-Redundancy Codes Proceedings of the Institute of Radio Engineers, 40(9), 1098-1101 Karatsuba, A A., & Ofman, Y (1962) Multiplication of Many-Digital Numbers by Automatic Computers Doklady Akad Nauk SSSR, 145, 293-294 Lacey, S., & Box, R (1991) A fast, easy sort BYTE, 16(4), 315-ff Musser, D R (1997) Introspective Sorting and Selection Algorithms Software: Practice and Experience, 27(8), 983 - 993 Seidel, R G., & Aragon, C R (1996) Randomized search trees Algorithmica, 16, 464-497 Shell, D L (1959) A high-speed sorting procedure Communications of the ACM, 2(7), 30-32 Sleator, D D., & Tarjan, R E (1985) Self-Adjusting Binary Search Trees Journal of the ACM, 32(3), 652-686 Strassen, V (1969) Gaussian Elimination is not Optimal Numerische Mathematik, 13(4), 354356 Tarjan, R E (1972) Depth first search and linear graph algorithms SIAM Journal on Computing, 1(2), 146-160 Vuillemin, J (1978) A data structure for manipulating priority queues Communications of the ACM, 21(4), 309-314 Williams, J (1964) Algorithm 232: Heapsort Communications of the ACM, 7(6), 347-348 Chương I MỞ ĐẦU Bài Từ tốn tới chương trình 1.1 Mơ hình hóa tốn 1.2 Tìm thuật tốn 1.3 Tìm cấu trúc liệu cài đặt thuật tốn 1.4 Lập trình 1.5 Kiểm thử 1.6 Tối ưu chương trình 1.7 Tóm tắt Bài Vai trị thuật tốn tính tốn 2.1 Thế thuật toán 2.2 Những loại toán có thuật tốn để giải 2.3 Những loại tốn khó 2.4 Tại lại phải học thuật toán 2.5 Chứng minh thuật toán Bài Đánh giá giải thuật 3.1 Mơ hình máy tính để đánh giá giải thuật 3.2 Phân tích thời gian thực giải thuật 3.3 Tốc độ tăng hàm 3.4 Các hàm đánh giá thời gian thực 3.5 Xác định thời gian thực giải thuật 3.6 Thời gian thực tình trạng liệu vào 3.7 Thời gian thực tổng thể chương trình 3.8 Chi phí thực giải thuật Bài Một số ý đọc sách 4.1 Ngôn ngữ môi trường lập trình 4.2 Nhập/xuất liệu TÀI LIỆU THAM KHẢO ... trường hợp thực giải thuật lần Nếu giải thuật thực nhiều lần chương trình, cần có đánh giá tổng thể Thời gian thực giải thuật phải tính tổng thời gian thực giải thuật chia cho số lần thực giải... tích thời gian thực giải thuật 3.3 Tốc độ tăng hàm 3.4 Các hàm đánh giá thời gian thực 3.5 Xác định thời gian thực giải thuật 3.6 Thời gian thực tình trạng liệu vào 3.7 Thời gian thực tổng thể... gian thực giải thuật dựa hàm

Ngày đăng: 26/01/2022, 15:45

TỪ KHÓA LIÊN QUAN

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

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w