Cấu trúc dữ liệu và giải thuật - Chương 1: Tổng quan về CTDL và GT - Ngô Quang Thạch

Tài liệu Cấu trúc dữ liệu và giải thuật - Chương 1: Tổng quan về CTDL và GT - Ngô Quang Thạch: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NGÔ QUANG THẠCH Email: thachnq@gmail.com ĐT: 01273984123 CHƯƠNG 1: Tổng quan về CTDL và GT Khái niệm giải thuật Các kiểu dữ liệu cơ bản Các kiểu dữ liệu trừu tượng Các cấu trúc dữ liệu cơ bản Mối quan hệ giữa CTDL và giải thuật Giải bài toán bằng phần mềm 1 •Xác định bài toán 2 •Tìm cấu trúc dữ liệu biểu diễn bài toán 3 •Tìm thuật toán 4 •Lập trình 5 •Kiểm thử phần mềm 6 •Tối ưu chương trình Giải thuật Giải thuật hay Thuật toán dùng để chỉ phương pháp hay cách thức (method) để giải quyết vấn đề. Thuật toán là một chuỗi hữu hạn các lệnh, mỗi lệnh có một ngữ nghĩa rõ ràng và có thể được thực hiện với một lượng hữu hạn tài nguyên trong một khoảng hữu hạn thời gian. Giải thuật có thể được minh họa bằng ngôn ngữ tự nhiên (natural language), bằng sơ đồ (flow chart) hoặc bằng mã giả (pseudo code)  Các tính chất của giải thuật Hữu hạn (finiteness): giải thuật phải luôn luôn kết thúc sau một số hữu hạn bước. Xác địn...

pdf49 trang | Chia sẻ: putihuynh11 | Lượt xem: 833 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Cấu trúc dữ liệu và giải thuật - Chương 1: Tổng quan về CTDL và GT - Ngô Quang Thạch, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NGÔ QUANG THẠCH Email: thachnq@gmail.com ĐT: 01273984123 CHƯƠNG 1: Tổng quan về CTDL và GT Khái niệm giải thuật Các kiểu dữ liệu cơ bản Các kiểu dữ liệu trừu tượng Các cấu trúc dữ liệu cơ bản Mối quan hệ giữa CTDL và giải thuật Giải bài toán bằng phần mềm 1 •Xác định bài toán 2 •Tìm cấu trúc dữ liệu biểu diễn bài toán 3 •Tìm thuật toán 4 •Lập trình 5 •Kiểm thử phần mềm 6 •Tối ưu chương trình Giải thuật Giải thuật hay Thuật toán dùng để chỉ phương pháp hay cách thức (method) để giải quyết vấn đề. Thuật toán là một chuỗi hữu hạn các lệnh, mỗi lệnh có một ngữ nghĩa rõ ràng và có thể được thực hiện với một lượng hữu hạn tài nguyên trong một khoảng hữu hạn thời gian. Giải thuật có thể được minh họa bằng ngôn ngữ tự nhiên (natural language), bằng sơ đồ (flow chart) hoặc bằng mã giả (pseudo code)  Các tính chất của giải thuật Hữu hạn (finiteness): giải thuật phải luôn luôn kết thúc sau một số hữu hạn bước. Xác định (definiteness): mỗi bước của giải thuật phải được xác định rõ ràng và phải được thực hiện chính xác, nhất quán. Hiệu quả (effectiveness): các thao tác trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn. – Ngoài ra một giải thuật còn phải có đầu vào (input) và đầu ra (output). Ngôn ngữ tự nhiên Giải thuật giải PT bậc nhất dạng ax + b = 0 như sau: Bước 1: Nhận giá trị của các tham số a, b Bước 2: Xét giá trị của a xem có bằng 0 hay không? Nếu a = 0 thì làm bước 3, nếu a khác không thì làm bước 4. Bước 3: (a bằng 0) Nếu b bằng 0 thì ta kết luận phương trình vô số nghiệm, nếu b khác 0 thì ta kết luận phương trình vô nghiệm. Bước 4: ( a khác 0) Ta kết luận phương trình có nghiệm x = -b/a Flowchart Flow chart thể hiện nét phát thảo cấu trúc căn bản và tính logic của chương trình Các ký hiệu sử dụng trong Flowchart TT KÝ HIỆU DIỄN GIẢI 1 Bắt đầu chương trình, Kết thúc chương trình 2 Luồng xử lý 3 Điều khiển lựa chọn 4 Nhập 5 Xuất 6 Xử lý, tính toán hoặc gán 7 Trả về giá trị (return) 8 Điểm nối liên kết tiếp theo Ví dụ: Nhập vào 3 số nguyên a, b, c và xuất ra màn hình với giá trị bình phương của mỗi số. Bắt đầu a, b, c Kết thúc a=a*a b=b*b c=c*c a, b, c Ví dụ: If else Biểu thức điều kiện ĐúngSai Cấu trúc lặp Thực hiện liên tục 1 lệnh hay tập lệnh với số lần lặp dựa vào điều kiện. Lặp sẽ kết thúc khi điều kiện không thỏa. for / while (Kiểm tra điều kiện trước khi lặp) Điều kiện lặp ĐúngSai Cấu trúc lặp Thực hiện liên tục 1 lệnh hay tập lệnh với số lần lặp dựa vào điều kiện. Lặp sẽ kết thúc khi điều kiện không thỏa. do while (Thực hiện lặp trước khi kiểm tra điều kiện) Điều kiện lặp ĐúngSai Ví dụ Giải và biện luận phương trình: ax+b=0. Bắt đầu a, b Kết thúc Vô nghiệm a=0 b=0 Vô số nghiệmx=-b/a ĐúngSai ĐúngSai Mã giả (pseudocode) Một cách khác để diễn tả giải thuật là sử dụng mã giả pseudocode  Giả lập, thường là dễ hiểu, không chi tiết đến các kỹ thuật lập trình  Ở cấp độ hết sức tổng quát: gần ngôn ngữ tự nhiên  Hoặc rất chi tiết: như dùng ngôn ngữ lập trình Pascal, C, Một đoạn mã giả của phương trình bậc hai if Delta > 0 then begin x1=(-b-sqrt(delta))/(2*a) x2=(-b+sqrt(delta))/(2*a) xuất kết quả : phương trình có hai nghiệm là x1 và x2 end else if delta = 0 then xuất kết quả : phương trình có nghiệm kép là -b/(2*a) else {trường hợp delta < 0 } xuất kết quả : phương trình vô nghiệm Mã giả của bubble sort Giải thuật 1 Giải thuật 2 Algorithm Bubble sort Input: The list A of n elements is given Output: The list A is sorted 1. loop for n time 1.1. for each pair in the list 1.1.1. if it is not in ordered 1.1.1.1. exchange them End Bubble sort Algorithm Bubble sort Input: The list A of n elements is given Output: The list A is sorted 1. for outter in 0..(n-2) 1.1. for inner in 0..(n-2- outter) 1.1.1. if Ainner+1 < Ainner 1.1.1.1. swap Ainner, Ainner+1 End Bubble sort Giải thuật bằng ngôn ngữ lập trình Giải thuật 1: Pascal Giải thuật 2: C++ procedure BubbleSort(var A: list); var i,j: int; begin for i := 1 to n-1 do for j := 1 to (n-1-i) do if A[j+1] < A[j] then begin tmp := A[j]; A[j] := A[j+1]; A[j+1] := tmp; end; end; void BubbleSort(list A) { int i, j; for (i=0; i < n-2; i++) for (j=0; j<(n-2-i); j++) if (A[j+1] < A[j]) { tmp = A[j]; A[j] = A[j+1]; A[j+1] = tmp; } } Định nghĩa kiểu dữ liệu Kiểu dữ liệu T được xác định bởi một bộ với:  V: là tập các giá trị hợp lệ để đối tượng kiểu T có thể lưu trữ  O: là tập các thao tác xử lý để có thể thực hiện trên các đối tượng kiểu T đó Ví dụ  Kiểu số nguyên SN= với  Vi = {-3276832767}  Oi = {+, -, *, /, mod, div} Khái niệm kiểu dữ liệu Máy tính chỉ lưu trữ dữ liệu ở dạng nhị phân => Để mô tả các loại dữ liệu để máy hiểu phải đưa ra khái niệm về mặt hình thức để lưu trữ và được gọi là “Kiểu dữ liệu” Các kiểu dữ liệu cơ sở:  Kiểu số nguyên: 1 byte, 2 bytes, 4 bytes  Kiểu số thực: 4 bytes, 6 bytes, 8 bytes, 10 bytes  Kiểu ký tự: 1 byte, 2 bytes  Kiểu chuỗi ký tự: Có kích thước tùy vào ngôn ngữ lập trình  Kiểu lý luận: 1 byte Các kiểu dữ liệu cơ bản Loại dữ liệu Tên kiểu Số ô nhớ Miền giá trị Kí tự char 1 byte - 128 .. 127 unsigned char 1 byte 0 .. 255 Số nguyên int 2 byte - 32768 .. 32767 unsigned int 2 byte 0 .. 65535 short 2 byte - 32768 .. 32767 long 4 byte - 215 .. 215 – 1 Số thực float 4 byte ± 10 -37 . . ± 10 +38 double 8 byte ± 10 -307 . . ± 10 +308 Các kiểu dữ liệu có cấu trúc Tùy vào từng ngôn ngữ lập trình, thường có các loại sau:  Kiểu chuỗi ký tự  Kiểu mảng  Kiểu bản ghi hay mẫu tin Các kiểu dữ liệu có cấu trúc Kiểu chuỗi ký tự: là kiểu dữ liệu có cấu trúc đơn giản nhất và thường các NNLT đều định nghĩa nó như một kiểu cơ bản. Trong C các hàm xử lý chuỗi được đặt trong thư viện string.lib. VD: char S[10] ;// chuỗi ký tự S có chiều dài tối đa là 10 (kể cả ký tự kết thúc) char S[] = ”ABCDEF” ; char *S = “ABCDEF”; Các kiểu dữ liệu có cấu trúc Kiểu mảng: là kiểu dữ liệu trong đó mỗi phần tử của nó là một tập hợp có thứ tự các giá trị có cùng cấu trúc được lưu trữ liên tiếp nhau trong bộ nhớ. Mảng một chiều : []; Mảng nhiều chiều : [] [<Số phần tử 2>].; Kiểu mảng Mảng 1 chiều Mảng 2 chiều Pt[1] Pt[2] Pt[n] Pt[1][1] Pt[1][2] Pt[1][n] Pt[2][1] Pt[2][2] Pt[2][n] Pt[m][1] Pt[m][2] Pt[m][n] Kiểu mẫu tin Kiểu mẫu tin: Kiểu mẫu tin cũng tương tự như mảng nhưng mỗi phần tử của nó là tập hợp các giá trị có thể khác cấu trúc. Kiểu mẫu tin thường được dùng để mô tả những đối tượng có cấu trúc phức tạp. Ví dụ : struct PERSON { char Hoten[]; int NamSinh; char NoiSinh[]; char GioiTinh; // 0:Nữ, 1: Nam char DiaChi[]; } Các kiểu dữ liệu có cấu trúc Là kiểu tạo ra từ các thành phần cơ sở khác nhau bằng cách kết hợp theo nguyên tắc nào nó  struct. Cú pháp khai báo struct struct tên_cấu_trúc { //mô tả các thành phần }; struct date { int ngay; int thang; int nam; }; Kiểu bản ghi Bảng thông tin cá nhân Họ tên Giới tính Ngày sinh Điện thoại Địa chỉ Nguyễn Thị A Nữ 21/7/1995 0987828601 TP. Quảng Ngãi Nguyễn Văn B Nam 12/9/1995 0987828603 TP. Quảng Ngãi Nguyễn Văn C Nam 02/5/1995 0987828602 TP. Quảng Ngãi Các kiểu dữ liệu khác Kiểu dữ liệu con trỏ (Pointer)  Kiểu con trỏ là kiểu dữ liệu cơ sở dùng lưu địa chỉ của một đối tượng dữ liệu khác.  Biến thuộc kiểu con trỏ Tp là biến mà giá trị của nó là địa chỉ của một vùng nhớ ứng với một biến kiểu T, hoặc là giá trị NULL  Cú pháp định nghĩa dữ liệu kiểu con trỏ typedef * ; Kiểu dữ liệu tập tin (File) Biến kiểu con trỏ Ví dụ 1: Khai báo 2 biến a,b có kiểu int và 2 biến pa, pb là 2 biến con trỏ kiểu int. int a, b, *pa, *pb; Ví dụ 2: Khai báo biến f kiểu float và biến pf là con trỏ float float f, *pf; Các thao tác trên con trỏ  a. Gán địa chỉ của biến cho biến con trỏ  Cú pháp: =& Giải thích: Ta gán địa chỉ của biến Tên biến cho con trỏ Tên biến con trỏ. Ví dụ: Gán địa chỉ của biến a cho con trỏ pa, gán địa chỉ của biến b cho con trỏ pb. pa=&a; pb=&b;  b. Nội dung của ô nhớ con trỏ chỉ tới  Để truy cập đến nội dung của ô nhớ mà con trỏ chỉ tới, ta sử dụng cú pháp: * Cấu trúc dữ liệu Là một cách tổ chức và lưu trữ dữ liệu hợp lý để sử dụng một cách hiệu quả, Tập các thao tác để truy cập các thành phần dữ liệu. Ví dụ:  Mảng (Array)  Danh sách liên kết (Linked List)  Hàng đợi (Queue)  Ngăn xếp (Stack)  Cây (Tree)  Mối quan hệ giữa CTDL và giải thuật • Khi có cấu trúc dữ liệu tốt và giải thuật phù hợp thì xây dựng chương trình chỉ phụ thuộc thời gian. • Một chương trình máy tính chỉ hoàn thiện khi có đầy đủ cấu trúc dữ liệu và giải thuật. CTDL + Thuật toán = Chương trình Các yếu tố khi xây dựng chương trình Xây dựng chương trình cần chú ý đến các yếu tố: Tổ chức biểu diễn các đối tượng thực tế Xây dựng các thao tác xử lý dữ liệu Tổ chức biểu diễn các đối tượng thực tế Các thành phần dữ liệu thực tế đa dạng, phong phú và thường chứa đựng những quan hệ nào đó với nhau, do đó trong mô hình tin học của bài toán, cần phải tổ chức, xây dựng các cấu trúc thích hợp nhất sao cho vừa có thể phản ánh chính xác các dữ liệu thực tế này, vừa có thể dễ dàng dùng máy tính để xử lý. ==> Công việc này được gọi là xây dựng cấu trúc dữ liệu cho bài toán Xây dựng các thao tác xử lý dữ liệu Từ những yêu cầu xử lý thực tế, cần tìm ra các giải thuật tương ứng để xác định trình tự các thao tác máy tính phải thi hành để cho ra kết quả mong muốn, đây là bước xây dựng giải thuật cho bài toán Ví dụ Một chương trình quản lý điểm thi của sinh viên cần lưu trữ các điểm số của sinh viên. Do mỗi sinh viên có điểm số ứng với những môn học khác nhau nên dữ liệu có dạng bảng như sau: Sinh viên Môn 1 Môn 2 Môn 3 Môn 4 SV 1 7 8 9 10 SV 2 5 6 7 8 SV 3 6 7 8 9 Chọn phương án cho bài toán quản lý điểm Phương án: Dùng mảng để giải quyết bài toán  Mảng 1 chiều  Mảng 2 chiều Dùng các phương án khác  Thiết kế cấu trúc, bản ghi  Các tiêu chuẩn đánh giá cấu trúc dữ liệu Phản ánh đúng thực tế của bài toán Phù hợp với các thao tác dữ liệu Tiết kiệm tài nguyên hệ thống (bộ nhớ trong) Các tiêu chuẩn đánh giá cấu trúc dữ liệu Phản ánh đúng thực tế : Đây là tiêu chuẩn quan trọng nhất, quyết định tính đúng đắn của toàn bộ bài toán. Cần xem xét kỹ lưỡng cũng như dự trù các trạng thái biến đổi của dữ liệu trong chu trình sống để có thể chọn cấu trúc dữ liệu lưu trữ thể hiện chính xác đối tượng thực tế. Các tiêu chuẩn đánh giá cấu trúc dữ liệu Ví dụ: Một số tình huống chọn cấu trúc lưu trữ sai : - Chọn một biến số nguyên int để lưu trữ tiền thưởng bán hàng (được tính theo công thức tiền thưởng bán hàng = trị giá hàng * 5%), do vậy sẽ làm tròn mọi giá trị tiền thưởng gây thiệt hại cho nhân viên bán hàng. =>Trường hợp này phải sử dụng biến số thực để phản ánh đúng kết quả của công thức tính thực tế. - Trong trường trung học, mỗi lớp có thể nhận tối đa 28 học sinh. Lớp hiện có 20 học sinh, mỗi tháng mỗi học sinh đóng học phí $10. Chọn một biến số nguyên unsigned char ( khả năng lưu trữ 0 - 255) để lưu trữ tổng học phí của lớp học trong tháng, nếu xảy ra trường hợp có thêm 6 học sinh được nhận vào lớp thì giá trị tổng học phí thu được là $260, vượt khỏi khả năng lưu trữ của biến đã chọn, gây ra tình trạng tràn, sai lệch. Các tiêu chuẩn đánh giá cấu trúc dữ liệu Phù hợp với các thao tác trên đó: Tiêu chuẩn này giúp tăng tính hiệu quả của đề án: việc phát triển các thuật toán đơn giản, tự nhiên hơn; chương trình đạt hiệu quả cao hơn về tốc độ xử lý. Các tiêu chuẩn đánh giá cấu trúc dữ liệu Ví dụ: Một tình huống chọn cấu trúc lưu trữ không phù hợp:  Cần xây dựng một chương trình soạn thảo văn bản, các thao tác xử lý thường xảy ra là chèn, xoá sửa các ký tự trên văn bản.  Trong thời gian xử lý văn bản, nếu chọn cấu trúc lưu trữ văn bản trực tiếp lên tập tin thì sẽ gây khó khăn khi xây dựng các giải thuật cập nhật văn bản và làm chậm tốc độ xử lý của chương trình vì phải làm việc trên bộ nhớ ngoài.  Trường hợp này nên tìm một cấu trúc dữ liệu có thể tổ chức ở bộ nhớ trong để lưu trữ văn bản suốt thời gian soạn thảo.  LƯU Ý : Đối với mỗi ứng dụng , cần chú ý đến thao tác nào được sử dụng nhiều nhất để lựa chọn cấu trúc dữ liệu cho thích hợp. Các tiêu chuẩn đánh giá cấu trúc dữ liệu Tiết kiệm tài nguyên hệ thống: Cấu trúc dữ liệu chỉ nên sử dụng tài nguyên hệ thống vừa đủ để đảm nhiệm được chức năng của nó. Thông thường có 2 loại tài nguyên cần lưu tâm nhất : CPU và bộ nhớ. Nếu tổ chức sử dụng đề án cần có những xử lý nhanh thì khi chọn cấu trúc dữ liệu yếu tố tiết kiệm thời gian xử lý phải đặt nặng hơn tiêu chuẩn sử dụng tối ưu bộ nhớ, và ngược lại. Các tiêu chuẩn đánh giá cấu trúc dữ liệu Ví dụ: Một số tình huống chọn cấu trúc lưu trữ lãng phí: - Sử dụng biến int (2 bytes) để lưu trữ một giá trị cho biết tháng hiện hành . Biết rằng tháng chỉ có thể nhận các giá trị từ 1-12, nên chỉ cần sử dụng kiểu char (1 byte) là đủ. - Để lưu trữ danh sách học viên trong một lớp, sử dụng mảng 50 phần tử (giới hạn số học viên trong lớp tối đa là 50). Nếu số lượng học viên thật sự ít hơn 50, thì gây lãng phí. Trường hợp này cần có một cấu trúc dữ liệu linh động hơn mảng- ví dụ danh sách liên kết Một số câu lệnh cơ bản trong C Tự đọc tài liệu tham khảo Bài tập 1: Vẽ biểu đồ luồng tiến trình cho việc tính sau: Tính tổng: S = 1 + 2 + 3 +...+ n , với n>0 Bài tập 2: Vẽ biểu đồ luồng tiến trình cho việc tính sau: ܵ ݊ = ଵ ଶ + ଷ ସ + ହ ଺ + + ଶ௡ାଵ ଶ௡ାଶ , với n>0 Bài tập 3 Tìm cấu trúc dữ liệu lưu trữ 2 số nguyên lớn a, b Số nguyên lớn ở đây là số có thể có đến vài nghìn chữ số Ví dụ: a=999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999 b=888888888888888888888888888888888888888888 888888888888888888888888888888888888888888888 888888888888888888888888888888888888888888888 Bài tập 4 Tiết Thứ 2 Thứ 3 Thứ 4 Thứ 5 Thứ 6 Thứ 7 CN Tiết 1 Tiết 2 Tiết 3 Tiết 4 Tiết 5 Tiết 6 Tiết 7 Tiết 8 Tiết 9 Tiết 10 Tìm phương án tổ chức cấu trúc dữ liệu cho thời khoá biểu của sinh viên:

Các file đính kèm theo tài liệu này:

  • pdfcau_truc_du_lieu_va_giai_thuat_c1_9444_1994172.pdf
Tài liệu liên quan