1.1 Tầm quan trọng của CTDL & giải thuật * Mối quan hệ giữa cấu trúc dữ liệu và giải thuật Theo Niklaus Wirth: Giải thuật + Cấu trúc dữ liệu = Chương trình.. Điều này hàm ý rằng cấu trú
Trang 1Môn: CẤU TRÚC DỮ LIỆU VÀ
GiẢI THUẬT
Trang 2NỘI DUNG MÔN HỌC
Chương 0: GIỚI THIỆU CHUNG
Chương 1: DANH SÁCH (LIST)
Chương 2: STACK-QUEUE
Chương 3: ĐỆ QUY
Chương 4: KỸ THUẬT TÌM KIẾM (SEARCHING)
Chương 5: KỸ THUẬT SẮP XẾP (SORTING)
Chương 6: CÂY (TREE)
ÔN TẬP - KIỂM TRA (REVIEW – TEST)
Trang 3TÀI LIỆU THAM KHẢO
[1] Bài giảng & Bài thực hành CTDL - Trường ĐHCN.
[2] Giáo trình Cấu trúc dữ liệu 1, Trần Hạnh Nhi – Dương Anh Đức, Trường DHKHTN – DHQG TP.HCM.
[3] Cấu trúc dữ liệu, Nguyễn Trung Trực, Trường DHBK – DHQG TP.HCM.
[4] Data structures and Program Design in C++
Trang 5NỘI DUNG CHƯƠNG 0
1.1 Tầm quan trọng của cấu trúc dữ liệu
1.2 Thiết kế giải thuật
1.3 Phân tích giải thuật
1.4 Phân tích thời gian thực hiện giải thuật
1.5 Các tiêu chuẩn đánh giá cấu trúc dữ liệu
1.6 Các kiểu dữ liệu
Trang 61.1 Tầm quan trọng của CTDL & giải thuật
* Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Theo Niklaus Wirth:
Giải thuật + Cấu trúc dữ liệu = Chương trình.
Điều này hàm ý rằng cấu trúc dữ liệu và giải thuật có mối quan hệ mật thiết với nhau trong một chương trình Do đó việc nghiên cứu các cấu trúc dữ liệu sau này đi đôi với việc xác lập các giải thuật xử lý trên các cấu trúc ấy.
Trang 71.2 THIẾT KẾ GIẢI THUẬT
Chia các bài toán lớn thành các bài toán nhỏ (module) Và dĩ nhiên một module có thể chia nhỏ thành các module con khác nữa, bấy giờ việc tổ chức lời giải sẽ được thể hiện theo một cấu trúc phân cấp.
A
D
Trang 81.2 THIẾT KẾ GIẢI THUẬT
Ví dụ: Chương trình quản lý đầu sách của một thư viện nhằm phục vụ độc giả tra cứu
sách Cụ thể, giả sử ta đã có một file dữ liệu gồm các bản ghi về các thông tin liên quan đến một đầu sách như: tên sách, mã số, tác giả, nhà xuất bản, năm xuất bản, giá tiền, Yêu cầu:
- Cập nhật dữ liệu.
- Tìm kiếm.
- In ấn.
Trang 91.2 THIẾT KẾ GIẢI THUẬT
Hệ chương trình quản lý sách
Cập nhật dữ liệu Tìm kiếm In ấn
Bổ sung thêm sách Sửa thông tin
file dữ liệu
Xoá dữ liệu
Xem với mọi bản ghi
Tra cứu
Thẻ sách
Thống kê
Theo mã Theo
ngày nhập
Trang 101.3 Phân tích giải thuật:
Tính đúng đắn.
Tính đơn giản (dễ hiểu, dễ quản lý, dễ lập).
Tính tối ưu (hiệu quả) về mặt thời gian cũng như không gian nhớ.
Trang 111.4 Phân tích thời gian thực hiện giải thuật:
Độ phức tạp tính toán của giải thuật:
(C: hằng), thì ta nói rằng: Độ phức tạp tính toán của giải thuật này có cấp là n2 và ta ký hiệu T(n) =
O(n2).
giải thuật có cấp là g(n).
Trang 121.4 Phân tích thời gian thực hiện giải thuật:
Xác định độ phức tạp của giải thuật:
Việc xác định độ phức tạp tính toán của một giải thuật nói chung là phức tạp Tuy nhiên, trong thực tế độ phức tạp của một giải thuật có thể được xác định từ độ phức tạp từng phần của giải thuật Cụ thể, ta có một số quy tắc sau:
Trang 13
-1.4 Phân tích thời gian thực hiện giải thuật:
Xác định độ phức tạp của giải thuật:
Nếu g1(n) ≤ g2(n), ∀n ≥ n0 thì O(g1(n) + g2(n)) = O(g2(n))
Ví dụ: O(n + log2n) = O(n)
Trang 141.4 Phân tích thời gian thực hiện giải thuật:
Xác định độ phức tạp của giải thuật:
- Quy tắc nhân:
Nếu độ phức tạp của P1 là O(g1(n)), độ phức tạp của P2 là O(g2(n)) thì độ phức tạp tính toán của P1 lồng P2 là O(g1(n).g2(n)).
Trang 151.4 Phân tích thời gian thực hiện giải thuật:
Lưu ý:
Câu lệnh gán, cout, cin, If có thời gian thực hiện bằng hằng số C = O(1).
Câu lệnh lặp trong vòng g(n) lần thì sẽ có thời gian thực hiện là O(g(n)).
O(Cg(n)) = O(g(n)) (C: hằng)
Ví dụ:
1) Câu lệnh: For( i=1; i<=n ;i++) { O(n) }
P:=P*i; { O(1) }
có thời gian thực hiện là: O(n*1) = O(n).
2) For( i=1; i<=n ;i++)
For( j=1; j<=n ;j++)
x:=x+1;
có thời gian thực hiện là: O(n*n*1) = O(n2).
Trang 161.5 Các tiêu chuẩn đánh giá CTDL
Đánh giá độ phức tạp của thuật toán
Là công việc ước lượng thời gian thực hiện của thuật toán để so sánh tương đối các thuật toán với nhau
Trong thực tế, thời gian thực hiện còn phụ thuộc cấu hình máy, dữ liệu đưa vào, …
Để ước lượng thời gian thực hiện thuật toán xem xét 2 trường hợp
Với Tmin và Tmax thời gian thực hiện trung bình của thuật toán Tavg
Trang 171.6 Các kiểu dữ liệu
Các thuộc tính của một kiểu dữ liệu
Tên kiểu dữ liệu
Miền giá trị của dữ liệu
Kích thước dữ liệu
Tập các toán tử tác động lên kiểu dữ liệu
Trang 191.6 Các kiểu dữ liệu (tt)
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 ngôn ngữ lập trình đều dị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”;
Trang 201.6 Các kiểu dữ liệu (tt)
Các kiểu dữ liệu có cấu trúc (tt)
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ớ.
Trang 211.6 Các kiểu dữ liệu (tt)
Các kiểu dữ liệu có cấu trúc (tt)
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.
Trang 221.6 Các kiểu dữ liệu (tt)
Kiểu dữ liệu con trỏ
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
Trang 231.6 Các kiểu dữ liệu (tt)
Kiểu dữ liệu con trỏ (tt)
Cú pháp định nghĩa dữ liệu kiểu con trỏ
typedef <kiểu cơ sở> * <kiểu con trỏ>;
Các thao tác cơ bản trên kiểu con trỏ:
Khi một biến con trỏ ‘p’ lưu trữ địa chỉ của đối tượng x ta nói “p trỏ đến x”
Gán địa chỉ của một vùng nhớ con trỏ p:
p = <địa chỉ>;
p = <địa chỉ> + <giá trị nguyên>
Truy xuất (xem) nội dung của đối tượng p trỏ đến (*p)
Trang 241.6 Các kiểu dữ liệu (tt)
Kiểu dữ liệu tập tin
Tập tin là kiểu dữ liệu đặc biệt, kích thước tối đa của tập tin phụ thuộc không gian đĩa
Việc đọc, ghi dữ liệu trên tập tin là mất thời gian, không an toàn dữ liệu
Thông thường chuyển dữ liệu trong tập tin (một phần hay toàn bộ) vào bộ nhớ trong để
xử lý.