CẤU TRÚC DỮ LIỆU VÀ GIẢI
THUẬT
NỘI DUNG
CHƯƠNG 1: Tổng quan về CTDL và giải thuật
CHƯƠNG 2: đệ quy và giải thuật đệ quy
CHƯƠNG 3: Danh sách
CHƯƠNG 4: Các phương pháp sắp xếp cơ bản
CHƯƠNG 5: Tìm kiếm
Hình thức đánh giá
Z = 0.4X + 0.6Y
X: kiểm tra định kì, đánh giá thơng qua bài kiểm tra (lý thuyết hoặc thực hành)
Y: kiểm tra kết thúc học phần, gồm bài thi lý thuyết (45-60p) và thực hành (60-120p)
Y = ½ điểm lý thuyết + điểm thực hành
Chương 1: tổng quan về CTDL và GT
Mối quan hệ giữa CTDL và giải thuật
Các tiêu chuẩn đánh giá CTDL
Các kiểu dữ liệu cơ bản
Các kiểu dữ liệu có cấu trúc
Kiểu con trỏ
Đánh giá độ phức tạp giải thuật
Chương 1: tổng quan về CTDL và giải thuật
1.1 Mối quan hệ giữa CTDL và giải thuật
Bài toán Tin học
Giải các bài toán thực tế
Gồm các đối tượng dữ liệu và các yêu cầu xử lý trên các đối tượng đó
Tổ chức biểu diễn các đối tượng thực tế
Giải quyết Bài tốn Tin
học?
Xây dựng trình tự các thao tác xử lý
trên các đối tượng dữ liệu đó
Chương 1: tổng quan về CTDL và giải thuật
1.1 Mối quan hệ giữa CTDL và giải thuật
Công thức
Cấu trúc dữ liệu + Giải thuật = Chương trình
Hai yếu tố tạo nên một chương trình máy tính: Cấu trúc dữ liệu và Giải thuật
Đối tượng xử lý của giải thuật chính là dữ liệu
Với một cấu trúc dữ liệu sẽ có những giải thuật tương ứng
Khi cấu trúc dữ liệu thay đổi thường giải thuật cũng thay đổi theo
Một cấu trúc dữ liệu tốt có thể giúp giải thuật thực hiện tốt hơn, nhanh hơn, tiết kiệm tài nguyên,
ngoài ra giải thuật cũng đơn giản và dễ hiểu hơn
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Phản ánh đúng thực tế
Phù hợp với các thao tác trên đó
Tiết kiệm tài nguyên hệ thống
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Phản ánh đúng thực tế
Tiêu chuẩn quan trọng nhất, quyết định tính đúng đắn của tồn bộ bài toán
Lựa chọn CTDL biểu diễn được dữ liệu của bài toán
Cần xem xét tới các trạng thái biến đổi của dữ liệu, yêu cầu của chương trình để lựa chọn được CTDL phù hợp
Ví dụ: một số tình 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ế
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Phản ánh đúng thực tế
Tiêu chuẩn quan trọng nhất, quyết định tính đúng đắn của tồn bộ bài táon
Lựa chọn CTDL biểu diễn được dữ liệu của bài toán
Cần xem xét tới các trạng thái biến đổi của dữ liệu, yêu cầu của chương trình để lựa chọn được CTDL phù hợp
Ví dụ: một số tình chọn cấu trúc lưu trữ sai
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.
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Phù hợp với các thao tác trên đó
Đố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
Tăng tính hiệu quả của dự án: việc phát triển các thuật toán đơn giản, chương trình đạt hiệu quả cao về tốc độ xử
lý
Ví dụ:
•
Cần viết một chương trình để xử lý các thao tác trên dãy số, ví dụ: nhập vào một dãy số, tính tổng các
phần tử, tìm giá trị lớn nhất, thêm, xóa phần tử…
•
Nếu lưu trữ các phần tử của dãy số trong 1 biến → tiết kiệm bộ nhớ nhưng không lưu trữ được giá trị
các phần tử đã nhập
•
Lưu trữ các phần tử của dãy số trong mảng → cài đặt các thuật toán mảng dễ dàng, việc thêm phần tử
có thể dẫn đến việc vượt quá kích thước của mảng
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Tiết kiệm tài nguyên hệ thống
CTDL 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ó
Tiêu chuẩn này nên cân nhắc tùy vào tình huống cụ thể: nếu chương trình cần có những xử lý nhanh thì khi chọn
CTDL yếu tố tiết kiệm thời gian xử lý được ưu tiên hơn so với sử dụng tối ưu bộ nhớ
Ví dụ 1: 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à đủ.
Chương 1: tổng quan về CTDL và giải thuật
1.2. Các tiêu chuẩn đánh giá CTDL
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Tiết kiệm tài nguyên hệ thống
CTDL 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ó
Tiêu chuẩn này nên cân nhắc tùy vào tình huống cụ thể: nếu chương trình cần có những xử lý nhanh thì khi chọn
CTDL yếu tố tiết kiệm thời gian xử lý được ưu tiên hơn so với sử dụng tối ưu bộ nhớ
Ví dụ 2: một số tình huống chọn cấu trúc lưu trữ lãng phí
Để 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 – danh sách liên kết – sẽ được bàn đến trong các chương sau
Chương 1: tổng quan về CTDL và giải thuật
1.3. Các kiểu dữ liệu cơ bản
Kiểu dữ liệu
Thể hiện bởi:
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
Chương 1: tổng quan về CTDL và giải thuật
1.3. Các kiểu dữ liệu cơ bản
Các kiểu dữ liệu cơ sở
Kiểu số nguyên
Kiểu số thực
Kiểu kí tự
Kiểu logic
Chương 1: tổng quan về CTDL và giải thuật
1.4. Các kiểu dữ liệu có cấu trúc
Kiểu chuỗi kí tự
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 định nghĩa nó như một kiểu cơ bản
Thực chất là một mảng (dãy) các kí tự ghép thành chuỗi
Ví dụ:
char S[10];
char S[] = “ABCDEF”
char *S = “ABCDEF”
Các bài tốn cơ bản: đếm từ, chuẩn hóa chuỗi…
Chương 1: tổng quan về CTDL và giải thuật
1.4. Các kiểu dữ liệu có cấu trúc
Kiểu mảng
Kiểu dữ liệu gồm tập các phần tử có cùng tên và kiểu dữ liệu, được lưu trữ liên tiếp trong bộ nhớ
Truy cập qua chỉ số
Ví dụ:
int a[10];
a[1] = 100;
Các loại mảng: mảng 1 chiều, mảng nhiều chiều
Các bài toán cơ bản: thêm, xóa phần tử mảng, tìm giá trị, tính tổng…
Chương 1: tổng quan về CTDL và giải thuật
1.4. Các kiểu dữ liệu có cấu trúc
Kiểu bản ghi (struct)
Kiểu dữ liệu mà mỗi phần tử của nó là tập hơp các giá trị có thể có kiểu dữ liệu khác nhau
Thường dùng để mơ tả những đối tượng có cấu trúc phức tạp, gồm nhiều loại thông tin như sinh viên, nhân sự…
Ví dụ:
struct PERSON
{
char Hoten[];
int NamSinh;
char NoiSinh[];
char GioiTinh; // 0:Nữ, 1: Nam
char DiaChi[];
}
Chương 1: tổng quan về CTDL và giải thuật
1.5. Kiểu con trỏ
Kiểu dữ liệu 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ỏ T là biến có
giá trị là địa chỉ của một vùng nhớ chứa giá trị của một biến kiểu T,
hoặc giá trị null
Ví dụ:
int a = 5;
int *pa = &a;
→ *pa = 5, pa = địa chỉ của biến a trong bộ nhớ
Chương 1: tổng quan về CTDL và giải thuật
1.6. Độ phức tạp của giải thuật
Một bài tốn có thể có nhiều giải thuật
Giải thuật nào là giải thuật nên lựa chọn?
Tiêu chuẩn nào để lựa chọn giải thuật?
•
C1:
m=a;
if (m
Ví dụ:
Bài tồn tìm giá trị lớn nhất trong 3 số
if (m
•
C2:
if (a>b)
if (a>c) m=a;
else m=c;
else
if (b>c) m=b;
else m=c;
Chương 1: tổng quan về CTDL và giải thuật
1.6. Độ phức tạp của giải thuật
Một bài tốn có thể có nhiều giải thuật
Giải thuật nào là giải thuật nên lựa chọn?
Tiêu chuẩn nào để lựa chọn giải thuật?
•
C1:
int gt(int n)
int i, S=1;
Ví dụ:
for(i=1;i<=n;i++)
S=S*i;
Bài tốn tính giai thừa của n
return S;
•
C2:
int gt(int n)
if (n<2) return 1;
return gt=n*gt(n-1)
Chương 1: tổng quan về CTDL và giải thuật
1.6. Độ phức tạp của giải thuật
Tiêu chí đánh giá
Tính đúng đắn của giải thuật
Tính đơn giản của giải thuật
Yêu cầu về khơng gian
u cầu về thời gian
•
•
Khi chương trình chạy 1 lần hoặc một vài lần thì giải thuật chỉ cần dễ hiểu, dễ cài đặt, gỡ lỗi
Khi chương trình chạy nhiều lần, giải thuật cần sử dụng hiệu quả tài nguyên máy tính, đặc biệt chạy càng nhanh
càng tốt tính hiệu quả của thuật tốn
Chương 1: tổng quan về CTDL và giải thuật
1.6. Độ phức tạp của giải thuật
Cách đánh giá
Độ phức tạp khơng
•
Dung lượng bộ nhớ mà
thuật tốn địi hỏi
gian
Người ta chỉ quan tâm
đến độ phức tạp thời
gian
Độ phức tạp thời
gian
•
Thời gian thực hiện thuật
toán
Chương 1: tổng quan về CTDL và giải thuật
1.6. Độ phức tạp của giải thuật
Thời gian thực hiện giải thuật
Phụ thuộc vào
Dữ liệu vào
Tốc độ thực hiện các phép tốn của máy tính
Trình biên dịch
Đánh giá thực nghiệm
Viết chương trình rồi cho chạy trên máy tính
Khơng so sánh được các giải thuật với nhau
Tìm cách đánh giá thời gian chạy khơng phụ thuộc vào ngơn ngữ, chương trình dịch, tốc độ máy