1. Trang chủ
  2. » Giáo án - Bài giảng

Đề cương Cấu trúc dữ liệu và giải thuật

62 121 2

Đ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

BÀI 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT I Tầm quan trọng cấu trúc liệu giải thuật đề án tin học Xây dựng cấu trúc liệu Có thể nói khơng có BÀI trình máy tính mà khơng có liệu để xử lý Dữ liệu liệu đưa vào (input data), liệu trung gian liệu đưa (output data) Do vậy, việc tổ chức để lưu trữ liệu phục vụ cho BÀI trình có ý nghĩa quan trọng tồn hệ thống BÀI trình Việc xây dựng cấu trúc liệu định lớn đến chất lượng cơng sức người lập trình việc thiết kế, cài đặt BÀI trình Xây dựng giải thuật Khái niệm giải thuật hay thuật giải mà nhiều gọi thuật tốn dùng để phương pháp hay cách thức (method) để giải vần đề Giải thuật minh họa ngôn ngữ tự nhiên (natural language), sơ đồ (flow chart) mã giả pseudo code) Trong thực tế, giải thuật thường minh họa hay thể mã giả tựa hay số ngôn ngữ lập trình (thường ngơn ngữ mà người lập trình chọn để cài đặt thuật tốn), chẳng hạn C, Pascal, … Khi xác định cấu trúc liệu thích hợp, người lập trình bắt đầu tiến hành xây dựng thuật giải tương ứng theo yêu cầu toán đặt sở cấu trúc liệu chọn Để giải vấn đề có nhiều phương pháp, lựa chọn phương pháp phù hợp việc mà người lập trình phải cân nhắc tính tốn Sự lựa chọn góp phần đáng kể việc giảm bớt công việc người lập trình phần cài đặt thuật tốn ngôn ngữ cụ thể Mối quan hệ cấu trúc liệu giải thuật Mối quan hệ cấu trúc liệu Giải thuật minh họa đẳng thức: Cấu trúc liệu + Giải thuật = BÀI trình Như vậy, có cấu trúc liệu tốt, nắm vững giải thuật thực việc thể BÀI trình ngơn ngữ cụ thể vấn đề thời gian Khi có cấu trúc liệu mà chưa tìm thuật giải khơng thể có BÀI trình ngược lại khơng thể có Thuật giải chưa có cấu trúc liệu Một BÀI trình máy tính hồn thiện có đầy đủ Cấu trúc liệu để lưu trữ liệu Giải thuật xử lý liệu theo yêu cầu toán đặt II Đánh giá cấu trúc liệu giải thuật Các tiêu chuẩn đánh giá cấu trúc liệu Để đánh giá cấu trúc liệu thường dựa vào số tiêu chí sau: - Cấu trúc liệu phải tiết kiệm tài nguyên (bộ nhớ trong), - Cấu trúc liệu phải phản ảnh thực tế toán, - Cấu trúc liệu phải dễ dàng việc thao tác liệu Đánh giá độ phức tạp thuật toán Việc đánh giá độ phức tạp thuật toán không dễ dàng chút Ở dây, muốn ước lượng thời gian thực thuận toán T(n) để có so sánh tương đối thuật toán với Trong thực tế, thời gian thực thuật tốn phụ thuộc nhiều vào điều kiện khác cấu tạo máy tính, liệu đưa vào, …, xem xét mức độ lượng liệu đưa vào ban đầu cho thuật toán thực Để ước lượng thời gian thực thuật toán xem xét thời gian thực thuật toán hai trường hợp: Trang - Trong trường hợp tốt nhất: Tmin - Trong trường hợp xấu nhất: Tmax Từ ước lượng thời gian thực trung bình thuật tốn: Tavg III Kiểu liệu Khái niệm kiểu liệu Kiểu liệu T xem kết hợp thành phần: - Miền giá trị mà kiểu liệu T lưu trữ: V, - Tập hợp phép toán để thao tác liệu: O T = Mỗi kiểu liệu thường đại diện tên (định danh) Mỗi phần tử liệu có kiểu T có giá trị miền V thực phép toán thuộc tập hợp phép toán O Để lưu trữ phần tử liệu thường phải tốn số byte(s) nhớ, số byte(s) gọi kích thước kiểu liệu Các kiểu liệu sở Hầu hết ngơn ngữ lập trình có cung cấp kiểu liệu sở Tùy vào ngôn ngữ mà kiểu liệu sở có tên gọi khác song lại có loại kiểu liệu sở sau: - Kiểu số ngun: Có thể có dấu khơng có dấu thường có kích thước sau: + Kiểu số nguyên byte + Kiểu số nguyên bytes + Kiểu số nguyên bytes Kiểu số nguyên thường thực với phép toán: O = {+, -, *, /, DIV, MOD, , =, =, …} - Kiểu số thực: Thường có kích thước sau: + Kiểu số thực bytes + Kiểu số thực bytes + Kiểu số thực bytes + Kiểu số thực 10 bytes Kiểu số thực thường thực với phép toán: O = {+, -, *, /, , =, =, …} - Kiểu ký tự: Có thể có kích thước sau: + Kiểu ký tự byte + Kiểu ký tự bytes Kiểu ký tự thường thực với phép toán: O = {+, -, , =, =, ORD, CHR, …} - Kiểu chuỗi ký tự: Có kích thước tùy thuộc vào ngơn ngữ lập trình Kiểu chuỗi ký tự thường thực với phép toán: O = {+, &, , =, =, Length, Trunc, …} - Kiểu luận lý: Thường có kích thước byte Trang Kiểu luận lý thường thực với phép toán: O = {NOT, AND, OR, XOR, ,=, =, …} Các kiểu liệu có cấu trúc Kiểu liệu có cấu trúc kiểu liệu xây dựng sở kiểu liệu có (có thể lại kiểu liệu có cấu trúc khác) Tùy vào ngơn ngữ lập trình song thường có loại sau: - Kiểu mảng hay gọi dãy: kích thước tổng kích thước phần tử - Kiểu ghi hay cấu trúc: kích thước tổng kích thước thành phần (Field) Kiểu liệu trỏ Các ngơn ngữ lập trình thường cung cấp cho kiểu liệu đặc biệt để lưu trữ địa nhớ, trỏ (Pointer) Tùy vào loại trỏ gần (near pointer) hay trỏ xa (far pointer) mà kiểu liệu trỏ có kích thước khác nhau: + Con trỏ gần: bytes + Con trỏ xa: bytes Kiểu liệu tập tin Tập tin (File) xem kiểu liệu đặc biệt, kích thước tối đa tập tin tùy thuộc vào không gian đĩa nơi lưu trữ tập tin Việc đọc, ghi liệu trực tiếp tập tin thời gian khơng bảo đảm an tồn cho liệu tập tin Do vậy, thực tế, không thao tác trực tiếp liệu tập tin mà cần chuyển phần toàn nội dung tập tin vào nhớ để xử lý IV Thuật toán Khái niệm thuật toán Thuật toán (algorithm) khái niệm quan trọng tin học Thuật ngữ thuật toán xuất phát từ nhà toán học Arập Abu Ja'far Mohammed ibn Musa al Khowarizmi (khoảng năm 825) Tuynhiên lúc nhiều kỷ sau, khơng mang nội dung ngày quan niệm thuật tốn tiếng nhất, có từ thời cổ Hy lạp thuật toán Euclid, thuật toán tìm ước chung lớn hai số ngun Có thể mơ tả thuật tốn sau Thuật tốn Euclid Vào : m, n nguyên dương Ra : d, ước chung lớn m n Phương pháp Bước 1: Tìm r, phần dư phép chia m cho n Bước 2: Nếu r = 0, d  n (gán giá trị n cho d) dừng lại Ngược lại, m  n, n  r quay lại bước Định nghĩa: Thuật toán dãy hữu hạn bước, bước mô tả xác phép tốn hành động cần thực để giải vấn đề đặt Đặc trưng thuật tốn : Định nghĩa trên, chứa đựng nhiều điều chưa rõ ràng Để hiểu đầy đủ ý nghĩa thuật toán, nêu đặc trưng nó: Trang  Bộ liệu vào: Mỗi thuật tốn cần có số (có thể 0) liệu vào (input) Đó giá trị cần đưa vào thuật toán bắt đầu lam việc Các liệu cần lấy từ tập hợp giá trị cụ thể Chẳng hạn, thuật toán Euclid trên, m n liệu vào lấy từ tập số nguyên dương  Dữ liệu ra: Mỗi thuật tốn cần có nhiều liệu (output) Đó giá trị có quan hệ hồn tồn xác định với liệu vào kết thực thuật tốn.Trong thuật tốn Euclid có liệu ra, d, thực đến bước phải dừng lại (trường hợp r = 0), giá trị d ước chung lớn m n  Tính xác định: Mỗi bước thuật tốn cần phải mơ tả xác, có cách hiểu Hiển nhiên đòi hỏi quan trọng Bởi vì, bước hiểu theo nhiều cách khác nhau, liệu vào, người thực thuật tốn khác dẫn đến kết khác Để đảm bảo tính xác định thuật tốn cần phải mơ tả ngơn ngữ lập trình Trong ngơn ngữ này, mệnh đề tạo thành theo qui tắc cúphápnghiêm ngặt có ý nghĩa  Tính khả thi: Tất phép tốn có mặt bước thuật toán phải đủ đơn giản Điều có nghĩa là, người lập trình thực giấy trắng bút khoảng thời gian hữu hạn Chảng hain với thuật toán Euclid, ta cần thực phép chia số nguyên số nguyên, phép gán phép so sánh để biết r = hay r   Tính dừng : Với liệu vào thoả mãn điều kiện liệu vào, thuật toán phải dừng lại sau số hữu hạn bước cần thực Chẳng hạn, thuật toán Euclid thoả mãn điều kiện Bởi thực bước giá trị r nhỏ n, r  giá trị n bước giá trị r bước trước, ta có n > r = n 1> r1 = n2 > r2 Dãy số nguyên dương giảm dần cần phải kết thúc 0, sau số bước giá trị r phải 0, thuật tốn dừng 2.Biểu diễn thuật tốn Có nhiều phương pháp biểudiễn thuật tốn Có thể biểu diễn thuật tốn danh sách bước, bước diễn đạt ngơn ngữ thơng thường ký hiệu tốn học Có thể biểu diễn sơ đồ khối Tuy nhiên, trình bày, để đảm bảo tính định thuật toán nên thuật toán cần viết ngơn ngữ lập trình Phân tích thuật tốn Giả sử tốn có số thuật tốn giải Một câu hỏi đặt là, cần chọn thuật toán số thuật tốn có để giải tốn cách hiệu Sau ta phân tích thuật tốn đánh giá độ phức tạp tính tốn a.Tính hiệu thuật tốn Khi giải vấn đề, cần chọn số thuật toán, thuật toán mà cho tốt Vậy ta cần lựa chọn thuật toán dựa sở ? Thông thường ta dựa hai tiêu chuẩn sau đây: (1) Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết BÀI trình) (2) Thuật toán sử dụng tiếp kiện nguồn tài nguyên máy tính, đặc biệt, chạy nhanh Khi ta viết BÀI trình để sử dụng số lần, giá thời gian viết BÀI trình vượt xa giá chạy BÀI trình tiêu chuẩn (1) quan trọng Nhưng có trường hợp ta cần viết BÀI trình (thủ tục hàm ) để sử dụng nhiều lần, cho nhiều người sử dụng, giá thời gian chạy BÀI trình vượt xa giá viết Chẳng hạn, thủ tục xếp, Trang tìm kiếm sử dụng nhiều lần, nhiều người toán khác Trong trường hợp ta cần dựa tiêu chuẩn (2) Ta cài đặt thuật tốn phức tạp, miễn BÀI trình nhận chạy nhanh thuật tốn khác Tiêu chuẩn (2) xem tính hiệu thuật tốn Tính hiệu thuật tốn bao gơmg hai nhân tố (1) Dung lượng không gian nhớ cần thiết để lưu giữ liệu vào, kết tính tốn trung gian kết thuật toán (2) Thời gian cần thiết để thực thuật toán (ta gọi thời gian chạy BÀI trình, thời gian khơng phụ thuộc vào yếu tố vật lý máy tính (tốc độ xử lý máy tính, ngơn ngữ viết BÀI trình )) Chúng ta quan tâm đến thời gian thực thuật tốn Vì nói đến đánh giá độ phức tạp thuật tốn, có nghĩa ta nói đến đánh giá thời gian thực Một thuật tốn có hiệu xem thuật tốn có thời gian chạy thuật toán khác b Đánh giá thời gian thực thuật tốn Có hai cách tiếp cận để đánh giá thời gian thực thuật toán Phương pháp thử nghiệm: Chúng ta viết BÀI trình cho chạy BÀI trình với liệu vào khác máy tính Thời gian chạy BÀI trình phụ thuộc vào nhân tố sau đây: Các liệu vào BÀI trình dịch để chuyển BÀI trình nguồn thành BÀI trình mã máy Tốc độ thực phép tốn máy tính sử dụng để chạy BÀI trình Vì thời gian chạy BÀI trình phụ thuộc vào nhiều nhân tố, nên ta khơng thể biểu diễn xác thời gian chạy bao nhiêuđơn vị thời gian chuẩn, chẳng hạn giây Phương pháp lý thuyết: Ta coi thời gian thực thuật toán hàm số cỡ liệu vào Cỡ liệu vào tham số đặc trưng cho liệu vào, no có ảnh hưởng định đến thời gian thực BÀI trình Cái mà chọn làm cỡ liệu vào phụ thuộc vào thuật toán cụ thể Chẳng hạn, thuật toán xếp mảng, cỡ liệu vào số thành phần mảng; thuật toán giải hệ n phương trình tuyến tính với n ẩn, ta chọn n cỡ Thông thường liệu vào số nguyên dương n Ta sử dụng hàm số T(n), n cỡ liệu vào, để biểu diễn thời gian thực thuật tốn Ta xác định thời gian thực T(n) số phép toán sơ cấp cần phải tiến hành thực thuật toán Các phép toán sơ cấp phép toán mà thời gian thực vbị chặn số phụ thuộc vào cách cài đặt sử dụng Chẳng hạn phép toán số học +, -, *, /, phép toán so sánh =, phép toán sơ cấp c Độ phức tạp tính tốn giải thuật Khi đánh giá thời gian thực phương pháp toán học, bỏ qua nhân tố phụ thuộc vào cách cài đặt, tập trung vào xác định độ lớn thời gian thực T(n) Ký hiệu tốn học O (đọc lớn) sử dụng để mô tả độ lớn hàm T(n) Giả sử n số nguyên không âm, T(n) f(n) hàm thực không âm Ta viết T(n) = O(f(n)) (đọc : T(n) ô lớn f(n)), tồn số dương c n o cho T(n)  c.f(n), với  n > no Nếu thuật tốn có thời gian thực T(n) = O(f(n)), nói thuật tốn có thời gian thực cấp f(n) Ví dụ Giả sử T(n) = 10n2 + 4n + Trang Ta có : T(n)  10n2 + 4n2 + 4n2 = 12 n2 , với n  Vậy T(n) = O(n2) Trong trường hợp ta nói thuật tốn có độ phức tạp (có thời gian thực hiện) cấp n2 Bảng sau cho ta cấp thời gian thực thuật toán sử dụng rộng rãi tên gọi thông thường chúng Ký hiệu ô lớn Tên gọi thông thường O(1) Hằng O(log2n) logarit O(n) Tuyến tính O(nlog2n) nlog2n Bình phương Lập phương n Mũ O(n ) O(n ) O(2 ) Danh sách xếp theo thứ tự tăng dần cấp thời gian thực Các hàm log2n, n, nlog2n, n2, n3 gọi hàm đa thức Giải thuật với thời gian thực có cấp hàm đa thức thường chấp nhận Các hàm 2n, n!, nn gọi hàm loại mũ Một giải thuật mà thời gian thực hàm loại mũ tốc độ chậm d Xác định độ phức tạp tính tốn Xác định độ phức tạp tính tốn giải thuật dẫn đến tốn phức tạp Tuy nhiên, thực tế, số giải thuật ta phân tích số qui tắc đơn giản  Qui tắc tổng: Giả sử T1(n) T2(n) thời gian thực hai giai đoạn BÀI trình P P2 mà T1(n) = O(f(n)); T2(n) = O(g(n)) thời gian thực đoạn P P2 T1(n) + T2(n) = O(max(f(n),g(n))) Ví dụ : Trong BÀI trình có bước thực mà thời gian thực tưng bước O(n2), O(n3) O(nlog2n) thời gian thực bước đầu O(max (n 2, n3)) = O(n3) Khi thời gian thực BÀI trình O(max(n3,nlog2n)) = O(n3)  Qui tắc nhân: Nếu tương ứng với P1 P2 T1(n) = O(f(n)), T2(n) = O(g(n)) thời gian thực P1 P2 lồng : T1(n)T2(n) = O(f(n)g(n)) Trong sách báo quốc tế thuật tốn thường trình bầy dạng thủ tục hàm ngôn ngữ tựa Pascal Để đánh giá thời gian thực thuật toán, ta cần biết cách đánh giá thời gian thực câu lệnh Pascal Các câu lệnh Pascal định nghĩa đệ qui sau: (1) Các phép gán, đọc, viết, goto câu lệnh Các lệnh gọi lệnh đơn (2) Nếu S1, S2, , Sn câu lệnh thì: begin S1, S2, , Sn end câu lệnh Lệnh gọi hợp thành (hoặc khối) (3) Nếu S1 S2 câu lệnh E biểu thức logic if E then S1 else S2 câu lệnh, Trang if E then S1 câu lệnh Các lệnh gọi lệnh if (4) Nếu S1, S2, , Sn + câu lệnh, E biểu thức có kiểu thứ tự đếm được, v 1, v2, , giá trị kiểu với E case E of v1 : S1 ; v2 : S2 ; : Sn ; [else Sn + 1] end; câu lệnh Lệnh gọi lệnh case (5) Nếu S câu lệnh E biểu thức logic while E S câu lệnh Lệnh gọi lệnh while (6) Nếu S1, S2, , Sn câu lệnh, E biểu thức logic repeat S1, S2, , Sn until E câu lệnh Lệnh gọi lệnh repeat (7) Với S câu lệnh, E1 E2 biểu thức có kiểu thứ tự đếm được, for i:= E1 to E2 S câu lệnh, for i:= E2 downto E1 S câu lệnh Lệnh gọi lệnh for Giả sử rằng, lệnh gán không chứa lời gọi hàm Khi để đánh giá thời gian thực BÀI trình, ta áp dụng phương pháp đệ qui sau (1) Thời gian thực lệnh đơn : gán, đọc, viết O(1) (2) Lệnh hợp thành : Thời gian thực lệnh hợp thành xác định luật tổng (3) Lệnh if : Giả sử thời gian thực lệnh S1, S2 O(f(n)) O(g(n)) tương ứng Khi thời gian thực lệnh if O(max (f()n), g(n))) (4) Lệnh case: Lệnh đánh lệnh if (5) Lệnh while : Giả sử thời gian thực lệnh S (thân while) O(f(n)) Giả sử g(n) số tối đa lần thực lệnh while O(f(n)g(n)) (6) Lệnh repeat :Giả sử thời gian thực khối begin S1, S2, ,Sn end O(f(n)) Giả sử g(n) số lần tối đa lần lặp Khi thời gian thực lệnh repeat O(f(n)g(n)) (7) Lệnh for : Lệnh đánh giá tương tự lệnh repeat while Đánh giá thủ tục (hoặc hàm) đệ qui Trước hết xét ví dụ cụ thể Ta đánh giá thời gian thực hàm đệ qui sau function Fact (n: integer) : integer; begin Trang if n cần thực lệnh gán fact := n*fact(n - 1) Do thời gian T(n) O(1) (để thực phép nhân phép gán) cộng với T(n -1) (để thực lời gọi đệ qui fact(n - 1)) Tóm lại, ta có quan hệ đệ qui sau: T(1) = O(1) T(n) = O(1) + T(n - 1) Thay O(1) đó, ta nhận quan hệ đệ qui sau T(1) = C1 T(n) = C2 + T(n - 1) Để giải phương trình đệ qui, tìm T(n), áp dụng phương pháp lặp Ta có phương trình đệ qui T(m) = C2 + T(m - 1), với m > Thay m 2, 3, , n - 1, n, ta nhận quan hệ sau T(2) = C2 + T(1) T(3) = C2 + T(2) T(n -1) = C2 + T(n -2) T(n) = C2 + T(n - 1) Bằng phép liên tiếp, ta nhận T(n) = (n - 1) C2 + T(1) hay T(n) = (n - 1) C2 + C1, C1 C2 Do đó, T(n) = O(n) Từ ví dụ trên, ta suy phương pháp tổng quát sau để đánh giá thời gian thực thủ tục (hàm) đệ qui Để đơn giản, ta giả thiết thủ tục (hàm) đệ qui trực tiếp Điều có nghĩa thủ tục (hàm) chứa lời gọi đệ qui đến Giả sử thời gian thực thủ tục T(n), với n cỡ liệu đầu vào Khi thời gian thực lời gọi đệ qui đánh giá thông qua bước sau  Đánh giá thời gian thực T(n0), với n0 cỡ liệu vào nhỏ (trong ví dụ trên, T(1))  Đánh giá thân thủ tục theo qui tắc 1-7 (qui tắc đánh giá thời gian thực câu lệnh) ta nhận quan hệ đệ qui sau T(n) =F(T(m1), T(m2), , T(mk)) Trong m1, m2, , mk < n Giải phương trình đệ qui này, ta nhận đánh giá T(n) Câu hỏi Bài tập Trình bày tầm quan trọng Cấu trúc liệu Giải thuật người lập trình? Các tiêu chuẩn để đánh giá cấu trúc liệu giải thuật? Trang Khi xây dựng giải thuật có cần thiết phải quan tâm tới cấu trúc liệu hay không? Tại sao? Liệt kê kiểu liệu sở, kiểu liệu có cấu trúc C, Pascal? Với đoạn BÀI trình xác định độ phức tạp tính tốn giải thuật ký pháp chữ O lớn trường hợp tồi a) sum := 0; for i := to n begin readln(x); sum := sum + 1; end; b) for i := to n for j := ton n begin C[i,j] := 0; for k := to n C[i,j] := C[i,j] + A[i,k] + B[k,j]; end; c) for i := to n - begin for j :=1 n -1 if X[j] > X[j + 1] then begin tg := X[j]; X[j] := X[j + 1]; X[j + 1] := tg; end; end; Trang BÀI 2: ĐỆ QUI VÀ GIẢI THUẬT ĐỆ QUI Đệ quy (tiếng Anh: recursion) phương pháp tự gọi Khái niệm hình thức đệ quy Trong tốn học khoa học máy tính, tính chất (hoặc cấu trúc) gọi đệ quy lớp đối tượng phương pháp xác định việc xác định số trường hợp phương pháp đơn giản (thông thường một) sau xác định quy tắc đưa trường hợp phức tạp trường hợp đơn giản Chẳng hạn, định nghĩa sau định nghĩa đệ quy tổ tiên:  Bố mẹ người tổ tiên người (trường hợp bản);  Bố mẹ tổ tiên người tổ tiên người (bước đệ quy) Các định nghĩa kiểu thường thấy tốn học (chính quy nạp toán học) Định nghĩa theo đệ quy Một khái niệm X định nghĩa theo đệ quy định nghĩa X có sử dụng khái niệm X  Ví dụ 1: Định nghĩa số tự nhiên - số tự nhiên - n số tự nhiên n - số tự nhiên Giải thuât đệ quy Thuật toán (giải thuật) đệ quy mở rộng khái niệm thuật toán Như biết, thuật tốn cần phải thỏa mãn tính chất : – Tính hữu hạn – Tính xác định – Tính đắn Tuy nhiên, có tốn mà việc xây dựng thuật toán với đầy đủ ba tính chất khó khăn Trong đó, ta xây dựng thuật toán vi phạm vài tính chất cách giải lại trở nên đơn giản nhiều chấp nhận Một trường hợp thuật tốn đệ quy Tư tưởng giải toán thuật toán đệ quy đưa toán toán loại, tính chất (hay nói cách nơm na đồng dạng) ởcấp độ thấp (chẳng hạn : độ lớn liệu nhập nhỏ hơn, giá trị cần tính tốn nhỏ hơn, ), q trình tiếp tục lúc toán đưa cấp độ mà giải Từ kết cấp độ này, ta lần ngược để giải toán cấp độ cao lúc giải toán cấp độ ban đầu Trong toán học ta thường gặp định nghĩa đối tượng, khái niệm dựa đối tượng, khái niệm Ðịnh nghĩa giai thừa Trang 10 B6.1: If (X Pos) //Nếu phải dời phần tử từ Pos->K phía sau vị trí B8.1: M[I] = M[I-1] B8.2: I-B8.3: Lặp lại B8 B9: ELSE //Đã dời xong phần tử từ Pos->K phía sau vị trí B9.1: M[Pos] = X //Chèn X vào vị trí Pos B9.2: K++ B9.3: Lặp lại B2 Bkt: Kết thúc - Cài đặt thuật toán: Hàm thực việc xếp N phần tử có kiểu liệu T mảng M theo thứ tự tăng dựa thuật toán xếp chèn trực tiếp Nội dung hàm sau: void InsertionSort(T M[], int N){ int K = 1, Pos; while (K < N){ T X = M[K]; Pos = 0; while (X > M[Pos]) Pos++; for (int I = K; I > Pos; I ) M[I] = M[I-1]; M[Pos] = X; K++; } return; } - Ví dụ minh họa thuật toán: Giả sử ta cần xếp mảng M có 10 phần tử sau (N = 10): M: 11 16 12 75 51 54 73 36 52 Ta thực lần chèn (N - = 10 - = 9) phần tử vào dãy có thứ tự tăng đứng đầu dãy M: Trang 48 Trang 49 - Phân tích thuật tốn: + Trường hợp tốt nhất, mảng M ban đầu có thứ tự tăng: Số phép gán: Gmin = 2×(N-1) Số phép so sánh: Smin = 1+2+…+(N-1) = N×(N-1)/2 Số phép hoán vị: Hmin = + Trường hợp xấu nhất, mảng M ban đầu ln có phần tử nhỏ N-K phần tử lại đứng vị trí sau sau lần hốn vị: Trang 50 Số phép gán: Gmax = [2×(N-1)]+[ 1+2+…+(N-1)] = [2×(N-1)] + [N×(N-1)/2] Số phép so sánh: Smax = (N-1) Số phép hốn vị: Hmax = + Trung bình: Số phép gán: Gavg = 2×(N-1) + [N×(N-1)/4] Số phép so sánh: Savg = [N×(N-1)/2 + (N-1)]/2 = (N+2)×(N-1)/4 Số phép hoán vị: Havg = + Chúng ta nhận thấy q trình tìm kiếm vị trí chèn phần tử K+1 trình dời phần tử từ vị trí chèn đến K phía sau vị trí kết hợp lại với Như vậy, trình di dời phần tử sau phần tử thứ K trở đầu dãy M gặp phần tử có giá trị nhỏ phần tử K+1 đồng thời vừa di dời xong đồng thời bắt gặp vị trí chèn Ngồi ra, tính tốn giá trị ban đầu cho K tùy thuộc vào số phần tử đứng đầu dãy M ban đầu có thứ tự tăng phần tử khơng thiết phải Khi đó, thuật toán xếp chèn trực tiếp hiệu chỉnh lại sau: - Thuật toán hiệu chỉnh: B1: K = B2: IF (M[K] And X < M[Pos]) B6.1: M[Pos+1] = M[Pos] B6.2: Pos-B6.3: Lặp lại B6 B7: ELSE //Chèn X vào vị trí Pos+1 B7.1: M[Pos+1] = X B7.2: K++ B7.3: Lặp lại B3 Bkt: Kết thúc - Cài đặt thuật toán hiệu chỉnh: Hàm InsertionSort1 Hàm thực việc xếp N phần tử có kiểu liệu T mảng M theo thứ tự tăng dựa thuật toán xếp chèn trực tiếp hiệu chỉnh Nội dung hàm sau: void InsertionSort1(T M[], int N){ int K = 1, Pos; while(M[K-1]

Ngày đăng: 24/08/2019, 20:01

Xem thêm:

TỪ KHÓA LIÊN QUAN

Mục lục

    ĐỆ QUI VÀ GIẢI THUẬT ĐỆ QUI

    1. Khái niệm hình thức về đệ quy

    Định nghĩa theo đệ quy

    CÁC PHƯƠNG PHÁP SẮP XẾP (SORTING)

    I. Khái quát về sắp xếp

    II. Các giải thuật sắp xếp nội (Sắp xếp trên dãy/mảng)

    B11: IF (I _ J)

    Phân hoạch các phần tử trong dãy con từ First -> J:

    First = 1 Last = J = 2 X = M[(1+2)/2] = M[1] = 3

    Ở đây chúng ta chỉ trình bày thuật toán sắp xếp chọn trực tiếp

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

TÀI LIỆU LIÊN QUAN

w