Giới thiệu đề cương môn học• Tóm tắt nội dung học phần: – Cung cấp các kiến thức cơ bản về cấu trúc dữ liệu và giải thuật như cách tổ chức biểu diễn các đối tượng dữ liệu từ thế giới th
Trang 1C HƯƠNG I
T ỔNG Q UAN C ẤU TRÚC D Ữ L IỆU
GV Th.S Thiều Quang Trung Trường Cao đẳng Kinh tế Đối ngoại
Trang 2• Giới thiệu đề cương môn học
Trang 3Giới thiệu đề cương môn học
• Học phần: Cấu trúc dữ liệu và giải thuật
• Số tín chỉ: 3
• Phân bổ thời gian:
– Giảng lý thuyết: 30 tiết
– Thực hành: 15 tiết
– Tự học : 60 tiết
• Công cụ thực hành lập trình: Dev C++
Trang 4Giới thiệu đề cương môn học
• Tóm tắt nội dung học phần:
– Cung cấp các kiến thức cơ bản về cấu trúc dữ liệu và giải thuật như cách tổ chức biểu diễn các đối tượng
dữ liệu từ thế giới thật, cách xây dựng các thao tác
xử lý dữ liệu tương ứng với cấu trúc dữ liệu biểu
diễn, cách đánh giá lựa chọn giải thuật xử lý dữ liệu phù hợp với cấu trúc dữ liệu biểu diễn.
– Các kiến thức này làm nền tảng cho sinh viên học
tiếp các học phần lập trình từ căn bản đến nâng cao,
cở sở để thiết kế xây dựng các phần mềm tin học khi làm đồ án, đề tài hay làm việc sau khi ra trường.
Trang 5Giới thiệu đề cương môn học
• Tài liệu: slides bài giảng và bài tập do giảng viên biên soạn, link: https://sites.google.com/site/thieutrung/
• Tài liệu tham khảo:
– [1] Niklaus Wirth, Data Structures and Algorithms,
Trang 6Giới thiệu đề cương môn học
Tiêu chuẩn đánh giá sinh viên:
• Điểm trung bình bộ phận: trọng số 40%
– 02 bài kiểm tra hệ số 2:
• 01 bài kiểm tra tự luận 1 tiết
• 01 bài kiểm tra thực hành 1 tiết
• Điểm thi kết thúc học phần: trọng số 60%
– Hình thức thi: thực hành
Trang 7Nội dung học
Chương 1: Giới thiệu đề cương môn học và Tổng quan về
cấu trúc dữ liệu và giải thuật
Chương 2: Các kiểu dữ liệu cơ bản và giải thuật tìm kiếm
Chương 3: Các giải thuật sắp xếp dữ liệu
Chương 4: Danh sách liên kết
Chương 5: Ngăn xếp, Hàng đợi, Đệ quy
Giới thiệu đề cương môn học
Trang 8Các khái niệm cơ bản
• Một chương trình máy tính (computer program) là tập các câu lệnh để điều khiển một máy tính sinh ra một kết quả cụ thể
• Viết các chương trình máy tính gọi là lập trình máy tính (computer programming)
• Ngôn ngữ để tạo các chương trình máy tính gọi là ngôn ngữ lập trình
• Software là một chương trình hay tập hợp các
chương trình
Trang 9Các khái niệm cơ bản
• Một số ngôn ngữ lập trình
– FORTRAN (1957), COBOL, BASIC (1960)
– PASCAL (1971), C (1980): Structure programming
– C++, Java (1985): Object-oriented programming
– Javascript, PHP (1995): Scripting programming
– Python (1990), Golang (2007)
• Cú pháp (syntax)
– Cú pháp của một ngôn ngữ lập trình là tập các luật để viết các câu lệnh chính xác
Trang 10Giải thuật là gì ?
• Giải thuật/thuật toán (Algorithm): là một
dãy hữu hạn các chỉ thị có thể thi hành để đạt mục tiêu đề ra nào đó.
Trang 11Biễu diễn giải thuật
• Dạng ngôn ngữ tự nhiên
• Dạng lưu đồ/sơ đồ khối (Flow chart)
• Dạng mã giả (Pseudocode)
• Ngôn ngữ lập trình
Trang 12Biễu diễn giải thuật bằng ngôn ngữ tự
– Dài dòng, không cấu trúc
– Đôi lúc khó hiểu, không diễn đạt được thuật
toán
Trang 13Biễu diễn giải thuật bằng lưu đồ
• Lưu đồ là hệ thống các nút, cung hình dạng khác
nhau thể hiện các chức năng khác nhau
Trang 14Ví dụ biễu diễn giải thuật bằng lưu đồ
Trang 15Biễu diễn giải thuật bằng mã giả
Trang 16Biễu diễn giải thuật bằng mã giả
• Một số quy ước:
– Các biểu thức toán học
– Lệnh gán: “=” (A←B)
– So sánh: “==”, “!=”
– Khai báo hàm (thuật toán)
Thuật toán <tên TT> (<tham số>)
Input: <dữ liệu vào>
Output: <dữ liệu ra>
<Các câu lệnh>
End
Trang 17Biễu diễn giải thuật bằng mã giả
Một
Trả giá trị về: return [giá trị]
–
Trang 18Biễu diễn giải thuật bằng mã giả
• Ví dụ: tìm phần tử lớn nhất trong mảng một chiều.
Trang 19Biễu diễn giải thuật bằng ngôn ngữ lập trình
Trang 20So sánh giải thuật bằng mã giả và NNLT
Ví dụ: mã giả của bubble sort
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
Trang 21Giải thuật 1: Pascal Giải thuật 2: C++
procedure BubbleSort(var A: list);
var i,j: int;
tmp := A[j]; A[j] := A[j+1];
void BubbleSort ( int a[], int n) {
int i, j;
for (i = 0 ; i<n-1 ; i++)
for (j =n-1; j>i ; j )
if (a[j]< a[j-1])
So sánh giải thuật bằng mã giả và NNLT
Ví dụ: giải thuật bubble sort bằng 2 NNLT
Trang 22Độ phức tạp của giải thuật
Trang 23Phương pháp thực nghiệm
• Cài thuật toán rồi chọn các bộ dữ liệu thử nghiệm.
• Thống kê các thông số nhận được khi chạy các bộ dữ liệu
• Ưu điểm: Dễ thực hiện.
• Nhược điểm:
– Chịu sự hạn chế của ngôn ngữ lập trình.
– Ảnh hưởng bởi trình độ của người lập trình.
– Chọn được các bộ dữ liệu thử đặc trưng cho tất cả tập các dữ liệu vào của thuật toán: khó khăn và tốn nhiều
Trang 24Phương pháp xấp xỉ toán học
Đánh
cận qua các khái niệm O().
Trang 25Vai trò của cấu trúc dữ liệu ?
• Thực hiện một đề án tin học là chuyển bài toán thực
tế thành bài toán có thể giải quyết trên máy tính
• Một bài toán thực tế bất kỳ đều bao gồm các đối
tượng dữ liệu và các yêu cầu xử lý trên những đối
Trang 26• 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 => 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ế, 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.
Tổ chức biểu diễn các đối tượng thực tế
Trang 27• 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.
• Giải thuật và cấu trúc dữ liệu có mối quan hệ chặt chẽ với nhau, được thể hiện qua công thức:
Xây dựng các thao tác xử lý dữ liệu
Trang 28• Để xác định được giải thuật phù hợp cần phải biết
nó tác động đến loại dữ liệu nào ?
• Ví dụ để làm nhuyễn các hạt đậu, người ta dùng
cách xay chứ không băm bằng dao, vì đậu sẽ văng
ra ngoài.
• Khi chọn lựa cấu trúc dữ liệu cũng cần phải hiểu
rõ những thao tác nào tác động đến nó ?
• Ví dụ để biểu diễn các điểm số của sinh viên người
ta dùng số thực thay vì chuỗi ký tự vì còn phải
thực hiện thao tác tính trung bình từ những điểm
số đó.
Tại sao chú trọng cả 2 vấn đề ?
Trang 29Ví dụ về lưu trữ dữ liệu kiểu mảng
• 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 4 sv:
Sinh viên Môn 1 Môn 2 Môn 3
Trang 30Ví dụ về lưu trữ dữ liệu kiểu mảng
• Có 02 phương án tổ chức lưu trữ dữ liệu sinh viên:
– Phương án 1: sử dụng mảng một chiều:
Có tất cả 4(sv) x 3(môn) = 12 điểm số cần lưu
trữ, do đó khai báo mảng diem như sau:
int diem [12] = {8, 6, 4,
9, 5, 3,
6, 7, 2,
5, 6, 5 };
Trang 31Ví dụ về lưu trữ dữ liệu kiểu mảng
• Khi đó trong mảng diem các phần tử sẽ được
lưu trữ như sau:
Trang 32Ví dụ về lưu trữ dữ liệu kiểu mảng
• Để truy xuất điểm số môn j của sinh viên i (là phần tử tại dòng i, cột j trong bảng) phải sử dụng công thức xác định chỉ số tương ứng
trong mảng diem:
bảngđiểm(dòng i, cột j) => diem[((i-1)*số cột) +j]
Trang 33Ví dụ về lưu trữ dữ liệu kiểu mảng
• Thao tác xử lý được cài đặt cho mảng 1 chiều như sau:
Trang 34Ví dụ về lưu trữ dữ liệu kiểu mảng
▪ Phương án 2: Sử dụng mảng hai chiều
Khai báo mảng 2 chiều diem có kích thước 3 cột * 4
Trang 35• Khi đó trong mảng diem các phần tử sẽ được
lưu trữ như sau:
Ví dụ về lưu trữ dữ liệu kiểu mảng
cột 0 cột 1 cột 2 Dòng 0 diem[0][0]=8 diem[0][1]=6 diem[0][2]=4
Dòng 1 diem[1][0]=9 diem[1][1]=5 diem[1][2]=3
Dòng 2 diem[2][0]=6 diem[2][1]=7 diem[2][2]=2
Trang 36Ví dụ về lưu trữ dữ liệu kiểu mảng
• Để truy xuất điểm số môn j của sinh viên i, là phần tử tại dòng i, cột j trong bảng, cũng
chính là phần tử nằm ở vị trí dòng i cột j
trong mảng:
bảngđiểm(dòng i, cột j) => diem[i] [j]
Trang 37Ví dụ về lưu trữ dữ liệu kiểu mảng
• Thao tác xử lý được cài đặt cho mảng 2 chiều như sau:
void indiem()
{ int somon = 3, sosv = 4;
for (int i=0; i<sosv; i++)
for(int j=0; j<somon; j++)
printf(“Điểm môn %d của SV %d là: %d”, j, i, diem[i][j]);
Trang 38Ví dụ về lưu trữ dữ liệu kiểu mảng
Trang 39Các tiêu chuẩn của giải thuật
• Xác định rõ dữ liệu đầu vào
• Xác định rõ kết quả đầu ra
• Tính xác định: cùng một dữ liệu đầu vào thì
cùng đưa đến một kết quả đầu ra
• Tính khả thi: đơn giản, làm được, thời gian
hữu hạn
• Tính dừng: sau một số bước hữu hạn thực
Trang 40• Phản ánh đúng thực tế => 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ế
• Phù hợp với các thao tác trên đó => giúp tăng
tính hiệu quả của giải thuật, tốc độ xử lý tốt hơn
• 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 (CPU và bộ
nhớ) vừa đủ để đảm nhiệm được chức năng của
nó
Các tiêu chuẩn của cấu trúc dữ liệu
Trang 41• Ví dụ 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%)
– Sai, vì số nguyên 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 float để
phản ánh đúng kết quả của công thức tính thực tế
Các tiêu chuẩn của cấu trúc dữ liệu
Trang 42• Ví dụ 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ố 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, như
kiểu xâu liên kết
Các tiêu chuẩn của cấu trúc dữ liệu
Trang 43Sự cần thiết của giải thuật
• Tại sao sử dụng máy tính để xử lý dữ liệu?
– Nhanh hơn, nhiều hơn.
– Giải quyết những bài toán mà con người không thể hoàn thành được.
• Làm sao đạt được những mục tiêu đó?
– Nhờ vào sự tiến bộ của kỹ thuật: tăng cấu hình máy => chi phí cao
– Nhờ vào các thuật toán hiệu quả: thông minh và chi phí thấp