1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Cấu trúc dữ liệu và giải thuật: Phần 1 - ĐH Sư phạm kỹ thuật Nam Định

102 11 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

Thông tin cơ bản

Định dạng
Số trang 102
Dung lượng 831,44 KB

Nội dung

Giáo trình Cấu trúc dữ liệu và giải thuật: Phần 1 cung cấp cho người học những kiến thức như: Cấu trúc dữ liệu và các vấn đề liên quan; Ngôn ngữ diễn đạt giải thuật. Mời các bạn cùng tham khảo để nắm chi tiết nội dung giáo trình!

MỤC LỤC MỤC LỤC CHƢƠNG 1: MỞ ĐẦU 1.1 Giải thuật 1.1.1 Khái niệm giải thuật 1.1.2 Các đặc trưng giải thuật 1.2 Cấu trúc liệu vấn đề liên quan 1.2.1 Cấu trúc liệu giải thuật 1.2.2 Cấu trúc liệu ngơn ngữ lập trình 1.3 Ngôn ngữ diễn đạt giải thuật 1.3.1 Đặt vấn đề 1.3.2 Quy cách cấu trúc chương trình 1.3.3 Ký tự biểu thức 1.3.4 Các câu lệnh CHƢƠNG : THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT 11 2.1 Từ toán đến chương trình 11 2.1.1 Mơ - đun hố việc giải toán 11 2.1.2 Phương pháp tinh chỉnh bước 13 2.2 Phân tích giải thuật 21 2.2.1 Đặt vấn đề 24 2.2.2 Phân tích thời gian thực giải thuật 24 2.3 Bài tập 26 CHƢƠNG : ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY 35 3.1 Khái niệm đệ quy 35 3.2 Giải thuật đệ quy chương trình đệ quy 35 3.3 Thiết kế giải thuật đệ quy 37 3.3.1 Hàm N ! 37 3.3.2 Bài toán Tháp Hà Nội 38 3.3.3 Bài toán quân hậu giải thuật quay lui 40 3.4 Hiệu lực đệ quy 44 3.5 Đệ quy quy nạp toán học 45 3.6 Bài tập 48 CHƢƠNG 4: MẢNG VÀ DANH SÁCH 50 4.1 Các khái niệm 50 4.2 Cấu trúc lưu trữ mảng 51 4.3 Lưu trữ danh sách tuyến tính 54 4.4 Ngăn xếp (Stack) 55 4.4.1 Định nghĩa 55 4.4.2 Lưu trữ Stack 55 4.4.3 Các giải thuật PUSH, POP 53 4.4.4 Ứng dụng Stack 58 4.4.5 Stack việc cài đặt thủ tục đệ quy 63 4.5 Hàng đợi (Queue) 66 4.5.1 Định nghĩa 66 4.5.2 Lưu trữ Queue 66 4.5.3 Các giải thuật chèn (INSERT), xoá (DELETE) 67 4.6 Bài tập 69 CHƢƠNG 5: DANH SÁCH MÓC NỐI 73 5.1 Danh sách nối đơn 73 5.1.1 Nguyên tắc 73 5.1.2 Một số giải thuật 74 5.2 Danh sách nối vòng 76 5.2.1 Nguyên tắc 76 5.2.2 Một số giải thuật 77 5.3 Danh sách nối kép 78 5.3.1 Nguyên tắc 78 5.3.2 Một số giải thuật 79 5.4 Ví dụ áp dụng 77 5.4.1 Biểu diễn đa thức 81 5.4.2 Giải thuật cộng hai đa thức 82 5.4.3 Biểu diễn tập hợp 84 5.4.3 Các phép toán 84 5.5 Ngăn xếp Hàng đợi móc nối 82 5.6 Cấu trúc đa danh sách 91 5.6.1 Biểu diễn ma trận thưa 91 5.6.2 Một số giải thuật 92 5.7 Danh sách tổng quát 96 5.7.1 Định nghĩa 96 5.7.2 Biểu diễn danh sách tổng quát 96 5.7.3 Một số giải thuật xử lý danh sách tổng quát 97 5.8 Bài tập 101 5.9 Kiểm tra 102 CHƢƠNG : CÂY 103 6.1 Định nghĩa khái niệm 103 6.2 Cây nhị phân 106 6.2.1 Định nghĩa tính chất 106 6.2.2 Biểu diễn nhị phân 108 6.2.3 Phép duyệt nhị phân 110 6.3 Cây nhị phân nối vòng 115 6.3.1 Khái niệm lưu trữ 115 6.3.2 Các giải thuật 117 6.4 Cây tổng quát 115 6.4.1 Biểu diễn tổng quát 120 6.4.2 Giải thuật duyệt tổng quát 122 6.4.3 Áp dụng 123 6.5 Bài tập 127 6.6 Kiểm tra 129 CHƢƠNG : SẮP XẾP 130 7.1 Đặt vấn đề 130 7.2 Một số phương pháp xếp 130 7.2.1 Sắp xếp lựa chọn (selection - Sort) 132 7.2.2 Sắp xếp thêm dần (Insert - Sort) 133 7.2.3 Sắp xếp bọt (Bubble - Sort) 134 7.2.4 Sắp xếp nhanh (Quick- Sort) 135 7.2.5 Sắp xếp vun đống (Heap –Sort) 137 7.2.6 Sắp xếp hoà nhập (Merge – Sort) 141 7.3 Phân tích đánh giá thuật toán 143 7.4 Bài tập 145 CHƢƠNG 8: TÌM KIẾM 147 8.1 Bài tốn tìm kiếm 147 8.2 Tìm kiếm 147 8.3 Tìm kiếm nhị phân 148 8.4 Cây nhị phân tìm kiếm 150 8.4.1 Định nghĩa 150 8.4.2 Các giải thuật 147 8.5 Bài tập – Tổng kết ôn tập 155 TÀI LIỆU THAM KHẢO 182 CHƢƠNG 1: MỞ ĐẦU 1.1 GIẢI THUẬT 1.1.1 Khái niệm giải thuật Giải thuật (Algorithms): dãy câu lệnh (statements) chặt chẽ rõ ràng xác định trình tự thao tác số đối tượng cho sau số hữu hạn bước thực ta đạt kết mong muốn Để minh hoạ cho khái niệm giải thuật ta xét giải thuật giải tốn tìm phần tử lớn dãy hữu hạn số nguyên Giải thuật gồm bước sau: Bước Đặt giá trị cực đại tạm thời số nguyên dãy Bước So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, lớn giá trị cực đại tạm thời, đặt cực đại tạm thời số nguyên Bước Lặp lại bước số nguyên dãy Bước Cực đại tạm thời thu bước số nguyên lớn dãy 1.1.2 Các đặc trƣng giải thuật Giải thuật có đặc trưng sau:  Đầu vào (Input): Giải thuật nhận liệu đầu vào từ tập  Đầu (Output): Với tập liệu đầu vào, giải thuật đưa liệu tương ứng với lời giải tốn  Tính xác: Các bước giải thuật phải xác định cách xác  Tính hữu hạn: Một giải thuật cần phải tạo giá trị đầu mong muốn sau số hữu hạn ( lớn) bước tập đầu vào  Tính hiệu quả: Mỗi bước giải thuật cần phải thực cách xác khoảng thời gian hữu hạn  Tính tổng quát: Thủ tục cần phải áp dụng cho tốn có dạng mong muốn, khơng phải cho tập đặc biệt giá trị đầu vào Ví dụ 1.1: Cho số nguyên a, b, c Mơ tả giải thuật tìm số lớn số cho Giải: Tuy toán đặt đơn giản, mục đích dùng để giải thích khái niệm giải thuật Giải thuật gồm bước sau: Bước 1: Đặt x := a; Bước 2: Nếu b > x đặt x := b; Bước 3: Nếu c > x đặt x := c; Tư tưởng giải thuật duyệt giá trị số giữ lại giá trị lớn vào biến x Kết thúc giải thuật x cho số nguyên lớn số cho 1.2 CẤU TRÖC DỮ LIỆU VÀ CÁC VẤN ĐỀ LIÊN QUAN 1.2.1 Cấu trúc liệu giải thuật Có thể có lúc nói đến việc giải tốn máy tính người ta ý đến giải thuật, nhiên giải thuật phản ánh phép xử lý, đối tượng để xử lý máy tính điện tử liệu (data), chúng biểu diễn thông tin cần thiết cho toán: Các kiện đưa vào (input), kết trung gian, Bản thân phần tử liệu thường có mối quan hệ với nhau: Với mơ tả kiểu liệu trừu tượng có nhiều cách cài đặt khác để hình thành nhiều cấu trúc liệu khác Ngoài ra, lại biết “tổ chức” theo cấu trúc thích hợp việc thực phép xử lý liệu thuận lợi hơn, đạt hiệu cao Với cấu trúc liệu chọn ta có giải thuật xử lý tương ứng Cấu trúc liệu thay đổi, giải thuật thay đổi theo Như vậy, cấu trúc liệu giải thuật có mối quan hệ mật thiết: Khơng thể nói tới giải thuật mà khơng nghĩ tới giải thuật tác động cấu trúc liệu nào, xét tới cấu trúc liệu phải xét đến liệu cần tác động giải thuật để đưa lại kết mong muốn 1.2.2 Cấu trúc liệu ngơn ngữ lập trình Các ngơn ngữ lập trình ngồi việc cung cấp kiểu liệu bản, cịn cung cấp chế hiệu dễ sử dụng cho phép định nghĩa kiểu liệu (kiểu liệu trừu tượng) theo yêu cầu Việc chọn ngôn ngữ lập trình tức chấp nhận cấu trúc tiền định ngôn ngữ phải biết linh hoạt vận dụng chúng để mô cấu trúc liệu cho cho toán cần giải Tuy nhiên, thực tế việc lựa chọn ngôn ngữ xuất phát từ yêu cầu tốn mà cịn phụ thuộc vào nhiều yếu tố khách quan chủ quan người lập trình Thoạt đầu, ứng dụng máy tính điện tử có phạm vi tốn khoa học kỹ thuật ta gặp cấu trúc liệu đơn giản biến, véctơ, ma trận, ứng dụng mở rộng sang lĩnh vực khác mà ta thường gọi toán phi số (non-numerical proplems), với đặc điểm thể chỗ: khối lượng liệu lớn, đa dạng, biến động; phép xử lý thường không phép số học cấu trúc liệu tiền định ngơn ngữ lập trình cung cấp thường không đủ đặc trưng cho mối quan hệ liệu Vì vậy, việc sâu nghiên cứu cấu trúc liệu phức tạp quan tâm giáo trình Bài tốn phi số đơi với cấu trúc liêu xuất phép toán tác động cấu trúc liệu này, phép tốn có tác dụng khác cấu trúc liệu Có phép hữu hiệu cấu trúc lại tỏ không hữu hiệu cấu trúc khác Cách biểu diễn cấu trúc liệu nhớ gọi cấu trúc lưu trữ Đó cách cài đặt cấu trúc máy tính điện tử sở cấu trúc lưu trữ mà ta thực phép xử lý Có thể có nhiều cấu trúc lưu trữ khác cho cấu trúc liệu; có cấu trúc liệu khác mà thể nhớ kiểu cấu trúc lưu trữ Khi đề cập đến cấu trúc lưu trữ ta cần phân biệt cấu trúc lưu trữ tương ứng với nhớ trong- lưu trữ trong, hay ứng với nhớ ngồi- lưu trữ ngồi 1.3 NGƠN NGỮ DIỄN ĐẠT GIẢI THUẬT 1.3.1 Đặt vấn đề Để diễn đạt giải thuật mà ta trình bày giáo trình, ta cần ngơn ngữ diễn đạt Ta lựa chọn ngơn ngữ lập trình C, Pascal, v.v , ta gặp hạn chế sau: - Phải luôn tuân thủ quy tắc chặt chẽ cú pháp ngơn ngữ đó, khiến cho việc trình bày giải thuật cấu trúc liệu có thiên hướng nặng nề, gị bó - Phải phụ thuộc vào cấu trúc liệu tiền định ngơn ngữ, nên có lúc đầy đủ ý nghĩa cấu trúc mà ta muốn biểu đạt - Ngôn ngữ chọn không hẳn người ưa thích muốn sử dụng Vì vậy, ta dùng ngơn ngữ “thơ hơn”, có đủ khả diễn đạt giải thuật cấu trúc đề cập đến (mà ta giới thiệu tiếng Việt), với mức độ linh hoạt định, khơng q gị bó, khơng câu nệ nhiều cú pháp gần gũi với ngôn ngữ chuẩn, để cần thiết dễ dàng chuyển đổi Ta tạm gọi tên: “ngơn ngữ tựa PASCAL” 1.3.2 Quy cách cấu trúc chƣơng trình Mỗi chương trình gắn tên để phân biệt, tên viết chữ in hoa, có thêm dấu gạch nối khoá Program Ví dụ 1.2: Program NHAN_MA_TRAN Độ dài tên khơng hạn chế Sau tên kèm theo lời thuyết minh (ở ta quy ước dùng tiếng Việt) để giới thiệu tóm tắt nhiệm vụ giải thuật số chi tiết cần thiết Phần thuyết minh đặt hai dấu { …… } Chương trình bao gồm nhiều đoạn (bước), đoạn phân biệt số thứ tự, kèm theo lời thuyết minh 1.3.3 Ký tự biểu thức Ký tự dùng giống ngôn ngữ chuẩn, nghĩa gồm: - 26 chữ latinh in hoa in thường - 10 chữ số thập phân - Các dấu phép toán số học +, -, *, /,  (luỹ thừa) - Các dấu phép toán quan hệ , ≤, ≥, ≠ - Giá trị logic: true, false - Dấu phép toán logic: and, or, not - Tên biến: dãy chữ chữ số, bắt đầu chữ - Biến số có dạng: A[i], B[i, j], v.v Còn biểu thức thứ tự ưu tiên phép toán biểu thức theo quy tắc PASCAL hay ngôn ngữ chuẩn khác 1.3.4 Các câu lệnh Các câu lệnh chương trình viết cách dấu ; chúng bao gồm: 1- Câu lệnh gán Có dạng V := E; Với V tên biến, tên hàm; E biểu thức Ở cho phép dùng phép gán chung Ví dụ: A :=B := 0.1; 2- Câu lệnh ghép Có dạng: begin S1; S2; …; Sn; end; Với Si (i = 1, , n) câu lệnh Nó cho phép ghép nhiều câu lệnh lại để coi câu lệnh 3- Câu lệnh điều kiện Có dạng: if B then S; Với B biểu thức logic, S câu lệnh khác Có thể diễn tả sơ đồ true B S false if B then S1 else S2; true B S1 false S2 4- Câu lệnh tuyển Có dạng: Case B1: S1; … Bn: Sn; Else: Sn+1; End case; Với Bi (i = 1, 2, , n) điều kiện, Si (i = 1, 2, , n) câu lệnh Câu lệnh cho phép phân biệt tình xử lý khác điều kiện khác mà dùng tới câu lệnh if- then- else lồng Có thể biểu diễn sơ đồ: B1 true false B2 true S1 false… Bn true S2 S2 false Sn+1  Vài điểm linh động Else khơng có mặt Si (i = 1, 2, , n) thay dãy câu lệnh thể dãy xử lý có điều kiện Bi mà khơng cần phải đặt begin end 5- Câu lệnh lặp  Với số lần lặp biết trước For i := m to n S; Nhằm thực câu lệnh S với i lấy giá trị nguyên từ m tới n ( n >= m) với bước nhảy tăng 1; Hoặc: For i:= n downto m S; Tương tự câu lệnh với bước nhảy giảm  Với số lần lặp trước While B S; true B S false Chừng mà B có giá trị true thực S Hoặc: Repeat S until B; Lặp lại S B có giá trị true (S dãy lệnh) S B true false 6- Câu lệnh chuyển Goto n; (n số hiệu bước chương trình) Thường người ta hạn chế việc sử dụng goto Tuy nhiên, với mục đích diễn đạt cho tự nhiên, chừng mực ta sử dụng 7- Câu lệnh vào, Có dạng: Read (); Write (); Các biến danh sách cách dấu phẩy Dòng ký tự dãy ký tự đặt hai dấu nháy „ „ 8- Câu lệnh kết thúc chương trình End 1.3.4 Chương trình  Chương trình hàm Có dạng: Function () S1; S2; … ; Sn; Return ; Câu lệnh kết thúc chương trình return thay cho end  Chương trình thủ tục Procedure () S1; S2; … ; Sn; Return ; Lời gọi chương trình hàm thể tên hàm danh sách tham số thực sự, nằm biểu thức Còn với chương trình thủ tục lời gọi thể câu lệnh call có dạng: Call () Chú ý: Trong chương trình diễn đạt số giải thuật phần khai báo liệu bỏ qua Nó thay phần mô tả cấu trúc liệu ngôn ngữ tự nhiên, mà ta nêu trước bước vào giải thuật Như vậy, nghĩa chương trình nêu đoạn thể phép xử lý theo giải thuật định, cấu trúc liệu mơ tả trước đó, ngôn ngữ tự nhiên {Duyệt U đưa vào B phần tử không thuộc A} q := U; While q ≠ null Begin If not Thuoc(A, info(q)) then Bo_sung(B, info(q)); q := link(q); End; Return; 9) Tìm tích đề hai tập hợp Tích Đề - hai tập hợp A B tập hợp bao gồm phần tử mà phần tử gồm thành phần (a,b) a thuộc tập A b thuộc tập B Giả sử C tích Đề-các A B cấu trúc phần tử C cần tổ chức gồm trường tp1, tp2, link đó: tp1 trường chứa thơng tin phần tử thuộc A, tp2 trường chứa thông tin phần tử thuộc B, trường link chứa địa nút danh sách C, việc bổ sung phần tử vào C thực tương tự A B Thủ tục sau xác định C tích Đề-các A B Procedure Tich_De_cac( A, B, C) C := null; Q := A; While Q ≠ null Begin P:= B; While P ≠ null Begin Bo_sung(C, info(Q), info(P)); P := link(P); End; Q := link(Q); End; Return; 5.5 NGĂN XẾP VÀ HÀNG ĐỢI MÓC NỐI Như ta biết, stack việc truy nhập thực đầu (đỉnh ) Vì việc cài đặt stack cách dùng danh sách móc nối tự nhiên Chẳng hạn, với danh sách nối đơn trỏ L coi L trỏ trỏ tới đỉnh stack bổ sung nút vào thành nút danh sách; loại bỏ nút khỏi stack loại bỏ nút danh sách trỏ L Trong thủ tục bổ sung với danh sách móc nối ta kiểm tra tượng TRÀN stack kế tiếp, stack khơng bị giới hạn kích thước, phụ thuộc vào giới hạn nhớ toàn phần (chỉ danh sách chỗ trống cạn hết ) Đối với queue loại bỏ đầu bổ sung lại đầu khác Nếu coi danh sách nối đơn queue coi L trỏ tới lối trước việc loại bỏ nút khơng khác với stack, bổ sung nút phải thực vào "đi " nghĩa phải lần tìm đến nút cuối Nếu tổ chức queue móc nối có dạng danh sách nối kép có trỏ L R nói trên, khơng phải tìm Lúc coi lối trước trỏ L, lối sau trỏ R (hoặc ngược lại ) a Giải thuật Push, Pop Stack Procedure Push(S, x) {Giải thuật bổ sung phần tử x vào Stack S cài đặt danh sách nối đơn, nút đầu trỏ S} {Tạo nút mới} p Avail; Return x; end; b Giải thuật Push, Pop Queue Procedure Push(L, R, x) {Giải thuật bổ sung phần tử x vào queue cài đặt danh sách nối kép, nút cực trái nút cực phải trỏ L R} {Tạo nút mới} p AVAIL; Return x; end; 5.6 CẤU TRƯC ĐA DANH SÁCH Một cách tổng qt đa danh sách cấu trúc bao gồm nhiều nút mà nút có nhiều mối nối phần tử đồng thời nhiều danh sách Tất nhiên nút vấn đề quan trọng phải phân biệt mối nối để lần vào danh sách cần thiết mà không nhầm vào danh sách khác ta xét ứng dụng đa danh sách phạm vi hẹp dùng để biểu diễn ma trận thưa 5.6.1 Biểu diễn ma trận thƣa Như biết, với ma trận thưa ta lưu trữ ma trận thơng thường lãng phí nhớ, để tiết kiệm nhớ ta tổ chức lưu trữ theo cấu trúc đa danh sách Theo cấu trúc này, nút danh sách, ứng với phần tử khác khơng ma trận có qui cách UP LEFT V R C Trường LEFT: chứa trỏ, trỏ tới nút (nút có số cột nhỏ hơn) danh sách nối vòng ứng với hàng (mà ta gọi danh sách hàng) Trường UP: chứa trỏ, trỏ tới nút (nút có số hàng nhỏ hơn) danh sách nối vòng ứng với cột (mà ta gọi danh sách cột) Trường V: ghi giá trị khác không phần tử R: ghi số hàng phần tử C: ghi số cột phần tử Ví dụ, với ma trận: 0 2  0  7 đa danh sách biểu diễn có dạng: 0 4 0 0 0 6  0 8 0 0 2 0 4 5 2 0 5.6.2 Một số giải thuật 3) TẠO LẬP MỘT ĐA DANH SÁCH BIỂU DIỄN MA TRẬN THƢA Procedure Create(A) {Thủ tục tạo đa danh sách biểu diễn ma trận thưa A gồm m hàng, n cột, với k phần tử khác không biết} {Khởi tạo danh sách hàng, danh sách cột} for i :=1 to m begin AROW[i]

Ngày đăng: 08/06/2021, 14:11

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

TÀI LIỆU LIÊN QUAN