Thuậttoán Khái niệm thuật tốn Ngơn ngữ mơ tả thuật tốn Trang 2 2KHÁI NIỆM THUẬT TỐN Thuật tốn giải thuật là một quy tắc để với những dữliệu ban đầu đã cho, tìm được lời giải sau một
Trang 1 Khái niệm thuật toán
Ngôn ngữ mô tả thuật toán
Độ phức tạp thuật toán
Trang 2KHÁI NIỆM THUẬT TOÁN
Thuật toán (giải thuật) là một quy tắc để với những dữ liệu ban đầu đã cho, tìm được lời giải sau một khoảng thời gian hữu hạn
• Tiêu phí ít tài nguyên máy tính (bộ nhớ)
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
Trang 3CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
Thuật toán tìm UCLN của hai số nguyên dương
1 Nhập vào hai số nguyên dương a, b
2 So sánh hai số, chọn số nhỏ nhất gắn cho UCLN
3 Nếu một trong hai số a, b không chia hết cho UCLN thì thực hiện bước 4, ngược lại thì thực hiện bước 5
4 Giảm UCLN một đơn vị và quay lại bước 3
5 In UCLN Kết thúc
? Các đặc trưng của thuật toán trên
Lựa chọn thuật toán nào cho bài toán?
Tiêu chuẩn 1: Thuật toán đơn giản, dễ hiểu, dễ cài đặt
Tiêu chuẩn 2: Thuật toán sử dụng tiết kiệm tài nguyên máy tính (dung lượng không gian nhớ, thời gian)
Trang 4 Ngôn ngữ dùng để mô tả thuật toán
? Tại sao phải dùng ngôn ngữ diễn đạt thuật toán
? Đặc điểm của ngôn ngữ diễn đạt thuật toán
• Ngôn ngữ liệt kê từng bước (Ngôn ngữ tự nhiên)
• Sơ đồ khối (flow chart)
• Ngôn ngữ “giả code” (pseudo−code): Tựa Pascal, tựa C, …
– Các bước trong chương trình nên được đánh số thứ tự
– Có thể bỏ qua phần khai báo dữ liệu, thay vào đó là đặc tả cấu trúc dữ liệu trước khi viết giải thuật
Mô tả thuật toán
• Thuật toán: <Tên thuật toán>
• Vào (Input): <Dữ liệu vào của thuật toán, mô tả rõ kiểu dữ liệu>
• Ra (Output): <Các dữ liệu ra - Kết quả>
Ngôn ngữ liệt kê từng bước
• Thuật toán: Euclid
• Vào: m,n nguyên dương (m > n)
• Ra: gcd là ước chung lớn nhất của m và n
r: số nguyên dương
Bước 1 Nhập vào m, n
Bước 2 Nếu m, n >0 thì chuyển sang bước 3, ngược lại thì thông báo “Dữ liệu
vào không hợp lệ” và kết thúc thuật toán Bước 3 Nếu m > n thì chuyển sang bước 4 Ngược lại, hoán chuyển giá trị của
m, n Bước 4 Nếu n ≠ 0 thì chuyển sang bước 5 Ngược lại, gcd = m, in giá trị của
gcd và kết thúc.
Bước 5 Tính r là phần dư của phép chia m cho n
Trang 5 Sơ đồ khối (Flow Chart )
Thuật toán Euclid
Trang 6 Ngôn ngữ Tựa Pascal
• Khai báo: Program < Tên chương trình>
• Giá trị logic: true, false
• Phép toán logic: and, or, not
Các câu lệnh
– V: biến, E: biểu thức
– Phép gán chung: V1 := V2 := E;
• Câu lệnh điều kiện if B then S1 [else S2];
• Câu lệnh tuyển Case
B1: S1; B2: S2;
….
Bn: Sn; else Sn+1
Trang 7• Câu lệnh lặp
– Số lần lặp biết trước for i := m to n do ….
for i := n down to m do….
– Số lần lặp không biết trước while B do S;
– Thủ tục Procedure: không có kết quả ra
– Sử dụng Var đặt trước tham số cần giữ lại sự thay đổi giá trị sau khi kết thúc thực hiện hàm/thủ tục
– Lời gọi Hàm Tên_hàm(<danh sách tham số thực sự>)
– Lời gọi thủ tục Call <Tên thủ tục>(<danh sách tham số thực sự>)
Trang 8? Đánh giá giải thuật khi chạy chương trình ???
Các yếu tố ảnh hưởng đến thời gian thực hiện thuật toán
• Môi trường phần cứng: tốc độ xử lý, bộ nhớ,…
• Môi trường phần mềm: kiểu lệnh, ngôn ngữ, trình biên dịch
• Kích thước dữ liệu vào
Đánh giá độ phức tạp thời gian T(n) bằng tổng số phép tính cần phải thực hiện.
Trang 9 Độ tăng của hàm
• Cho hai hàm f(x), g(x) xác định từ tập các số nguyên dương hoặc tập
số thực vào tập số thực Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng số
C và k sao cho: |f(x)| ≤ C.|g(x)|, với mọi x > k.
0 1
0 1
0
1 1
a a
a x
x
a x
a a x
a x
a x a x f
n n n
n n
n n
n n n n
+ + +
≤
+ + +
≤
+ + +
• Độ phức tạp O(log(n)) gọi là độ phức tạp logarit
• Độ phức tạp O(n) gọi là độ phức tạp tuyến tính
• Độ phức tạp O(nlogn) gọi là độ phức tạp nlogn
• Độ phức tạp O(nk) gọi là độ phức tạp đa thức
• Độ phức tạp O(bn) , b>1, gọi là độ phức tạp hàm mũ
• Độ phức tạp O(n!) gọi là độ phức tạp giai thừa
Trang 10Begin
K := K + i * j ; End;
Trang 12kỳ dữ liệu vào có kích cỡ xác định.
Độ phức tạp trung bình của A là giá trị trung bình của
số các phép toán cơ bản được thực hiện trong A trên bất kỳ dữ liệu vào có kích thước xác định
Ví dụ hàm Searching ở trên:
• Độ phức tạp trong trường hợp xấu nhất là O(n)
• Độ phức tạp trong trường hợp tốt nhất là:O(1) khi K chính làphần tử đầu tiên của mảng
• Độ phức tạp trung bình là: cỡ n/2 (khoảng ½ các phần tử củamảng được duyệt) Việc tính toán rất phức tạp dựa vào xácsuất K xuất hiện trong A
Thường đánh giá thuật toán theo độ phức tạp thời gian xấu nhất Hiệu quả sử dụng của thuật toán lại thể hiện thông qua độ phức tạp trung bình.
Trang 132 Kiểu dữ liệu, Cấu trúc dữ liệu, Mô hình dữ liệu
Kiểu dữ liệu trong ngôn ngữ bậc cao
• Trong ngôn ngữ bậc cao
• Là sự trừu tượng hóa các thuộc tính bản chất của các đốitượng trong thực tế và phù hợp với cách tổ chức thông tin trênmáy tính
• Kiểu số nguyên, số thực, kí tự,…
• Kiểu dữ liệu T = <V, O>, V là tập các giá trị hợp lệ của T và O
là tập các phép toán trên kiểu T
Trang 14• Là các lưu trữ dữ liệu trên máy tính sao cho việc sử dụng
dữ liệu đó được hiệu quả Đó chính là tổ chức các khái niệm toán học và logic về dữ liệu.
• Kiểu dữ liệu có cấu trúc được kết hợp nên từ các kiểu dữ liệu
cơ sở
• Ví dụ: Kiểu mảng, xâu kí tự, Bản ghi, File,…
Mối liên hệ giữa cấu trúc dữ liệu và Thuật toán
Chương trình = Cấu trúc dữ liệu + Thuật toán
Mô hình dữ liệu
• Là mô hình toán học, có thể biểu diễn được trên máy tính, đểbiểu diễn các đối tượng của bài toán và mối liên hệ giữa cácđối tượng
• Mô hình dữ liệu muốn cài đặt được trên máy tính phải có cách
tổ chức dữ liệu phù hợp
• Ví dụ: Danh sách, Cây, Đồ thị, Quan hệ, …
Các tiêu chuẩn chọn cấu trúc dữ liệu
• Phản ánh đúng thực tế: quan trọng nhất, đảm bảo tính đúngđắn của phương án giải quyết
• Các thao tác phù hợp
• Tiết kiệm tài nguyên hệ thống
Trang 15 Kiểu dữ liệu cơ sở
• Kí tự (char, unsigned char)
• Số nguyên (int, unsigned int, long (int), unsigned long (int))
Kiểu cấu trúc (struct)
9 Kiểm tra kích thước của kiểu dữ liệu: dùng toán tử sizeof(), ví dụ: sizeof(int),…
KIỂU CON TRỎ
Biến con trỏ (Pointer)
• Địa chỉ bộ nhớ của biến được gán cho con trỏ là giá trị củabiến con trỏ
• Biến thông thường chứa một giá trị cụ thể (count = 7)
• Các con trỏ chứa địa chỉ của biến: biến được trỏ chứa giá trị cụthể (tham chiếu gián tiếp)
Con trỏ countPtr trỏ đến biến count, giá trị
count
7
count countPtr
Trang 16mảng, xâu, bộ nhớ
bộ nhớ.
Định nghĩa và khởi tạo biến con trỏ
• * được sử dụng định nghĩa biến pointer
int *myPtr;
• Định nghĩa biến con trỏ, trỏ tới vùng nhớ kiểu int
• Định nghĩa nhiều con trỏ yêu cầu sử dụng * trước mỗi biến con trỏ
int *myPtr1, *myPtr2;
• Có thể định nghĩa con trỏ kiểu dữ liệu bất kỳ
• Khởi tạo con trỏ là 0, NULL (con trỏ rỗng) hoặc một địa chỉ củamột biến cùng kiểu dữ liệu
Trang 17 &Tenbien (trả về địa chỉ của tenbien)
• Phép gán trả về địa chỉ của biến dữ liệu
Sử dụng dấu * để tham chiếu giá trị trong vùng nhớ trỏ bởi con trỏ
• *yptr trả về giá trị của biến y (bởi vì yptr trỏ tới y)
• Dấu * có thể sử dụng trong lệnh gán làm thay đổi giá trị của biến dữ liệu
*yptr = 7; /* thay đổi y bằng 7 */
* và & quan hệ đối ngược nhau
- *p là dữ liệu được chứa trong vùng nhớ có địa chỉ là p
- &x là địa chỉ của biến x
int x; int *xptr; xptr = &x;
Khi đó, *xptr = x; &*xptr = *&xptr
Trang 1813 printf( "The address of a is %p"
14 "\nThe value of aPtr is %p" , &a, aPtr );
15
16 printf( "\n\nThe value of a is %d"
17 "\nThe value of *aPtr is %d" , a, *aPtr );
• Trỏ tới vùng nhớ cố định
• Phải được khởi tạo khi định nghĩa
• int *const myPtr = &x;
– Kiểu int *const – con trỏ hằng trỏ đến vùng nhớ kiểu int
• const int *myPtr = &x;
– Con trỏ thông thường trỏ đến const int
• const int *const Ptr = &x;
– con tr ỏ const trỏ đến một vùng nhớ const int
– x c ó thể thay đổi, nhưng *Ptr th ì không.
Trang 1910 /* ptr is a constant pointer to an integer that can be modified
11 through ptr, but ptr always points to the same memory location */
12 int * const ptr = &x;
13
14 *ptr = 7 ; /* allowed: *ptr is not const */
15 ptr = &y; /* error: ptr is const; cannot assign new address */
Error executing cl.exe.
FIG07_13.exe - 1 error(s), 0 warning(s)
Thay đổi *ptr được phép – x không phải là hằng.
Thay đổi ptr là lỗi – ptr là con trỏ hằng.
10 /* ptr is a constant pointer to a constant integer ptr always
11 points to the same location; the integer at that location
17 *ptr = 7 ; /* error: *ptr is const; cannot assign new value */
18 ptr = &y; /* error: ptr is const; cannot assign new address */
Ví dụ: những tình huống sử dụng con trỏ hằng, được phép và không được phép
Trang 20FIG07_14.c
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value
specifies const object
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value
specifies const object
Error executing cl.exe.
FIG07_12.exe - 2 error(s), 0 warning(s)
Thuật toán
Chương trình
− Các thao tác được điều khiển bởi các lệnh
− Các đối tượng chịu thao tác được mô tả thông qua các Cấu trúc dữ liệu
Bài toán
Trang 21T F
if statement (single selection)
T F
if…else statement (double selection)
T F
đa lựa chọn
(multiple selection)
T F
T F
.
Trang 22 Nguyên lý chủ đạo trong công nghệ phần mềm
Phân rã bài toán thành những bài toán nhỏ hơn để triển khai và đảm bảo tính đúng đắn của chương trình
Nguyên lý cơ bản của lập trình cấu trúc bao gồm:
• Phát triển chương trình từ trên xuống (Top−downdevelopment)
• Thiết kế môđun (Modular design)
Phương pháp đi từ trên xuống:
• Đi từ cái chung đến cái riêng, từ kết luận đến chi tiết, từ tổngthể đến đơn vị
Mô đun hóa:
• Nhóm các câu lệnh lại với nhau tạo ra những môđun có quan
hệ với nhau Nói cách khác: chương trình được phân táchthành các phần chức năng quan hệ logic với nhau
Ưu điểm: Dễ viết ( write ), duyệt lỗi ( debug ), và dễ hiểu chương trình hơn.
Trang 23 Triển khai chương trình trong ngôn ngữ C:
#include < > /* 1 Các hàm thư viện */
/* 4. Khai báo nguyên mẫu các hàm */
function prototype
/* 5 Khai báo các biến toàn cục */
int main (void) /* 6 “Chương trình chính” */
{ Khai báo các biến;
8 int minimum( const int grades[][ EXAMS ], int pupils, int tests );
9 int maximum( const int grades[][ EXAMS ], int pupils, int tests );
10 double average( const int setOfGrades[], int tests );
11 void printArray( const int grades[][ EXAMS ], int pupils, int tests );
Trang 2424 /* output array studentGrades */
25 printf( "The array is:\n" );
26 printArray( studentGrades, STUDENTS, EXAMS );
27
28 /* determine smallest and largest grade values */
29 printf( "\n\nLowest grade: %d\nHighest grade: %d\n" ,
30 minimum( studentGrades, STUDENTS, EXAMS ),
31 maximum( studentGrades, STUDENTS, EXAMS ) );
32
33 /* calculate average grade for each student */
34 for ( student = 0 ; student <= STUDENTS - 1 ; student++ ) {
35 printf( "The average grade for student %d is %.2f\n" ,
36 student, average( studentGrades[ student ], EXAMS ) );
43 /* Find the minimum grade */
44 int minimum( const int grades[][ EXAMS ], int pupils, int tests )
50 /* loop through rows of grades */
51 for ( i = 0 ; i < pupils; i++ ) {
68 /* Find the maximum grade */
69 int maximum( const int grades[][ EXAMS ], int pupils, int tests )
Trang 2575 /* loop through rows of grades */
76 for ( i = 0 ; i < pupils; i++ ) {
77
78 /* loop through columns of grades */ 79 for ( j = 0 ; j < tests; j++ ) { 80
81 if ( grades[ i ][ j ] > highGrade ) { 82 highGrade = grades[ i ][ j ]; 83 } /* end if */ 84
85 } /* end inner for */ 86
87 } /* end outer for */ 88
89 return highGrade; /* return maximum grade */ 90
91 } /* end function maximum */ 92
93 /* Determine the average grade for a particular student */ 94 double average( const int setOfGrades[], int tests )
95 {
96 int i; /* counter */
97 int total = 0 ; /* sum of test grades */
98
99 / * t o t a l a l l g r a d e s f o r o n e s t u d e n t * /
100 f o r ( i = 0 ; i < t e s t s ; i + + ) {
101 t o t a l + = s e t O f G r a d e s [ i ] ;
102 } / * e n d f o r * /
103
104 r e t u r n ( d o u b l e ) t o t a l / t e s t s ; / * a v e r a g e * /
105
106 } / * e n d f u n c t i o n a v e r a g e * /
107
108 / * P r i n t t h e a r r a y * /
109 v o i d p r i n t A r r a y ( c o n s t i n t g r a d e s [ ] [ E X A M S ] , i n t p u p i l s , i n t t e s t s )
110 {
111 i n t i ; / * c o u n t e r * /
112 i n t j ; / * c o u n t e r * /
113
114 / * o u t p u t c o l u m n h e a d s * /
115 p r i n t f ( " [ 0 ] [ 1 ] [ 2 ] [ 3 ] " ) ;
116
117 / * o u t p u t g r a d e s i n t a b u l a r f o r m a t * /
118 f o r ( i = 0 ; i < p u p i l s ; i + + ) {
119
120 / * o u t p u t l a b e l f o r r o w * /
Trang 26The array is:
The average grade for student 0 is 76.00
The average grade for student 1 is 87.50
The average grade for student 2 is 81.75
123 /* output grades for one student */
130 } /* end function printArray */
Quy tắc cấu trúc: Có thể viết bất kỳ chương trình nào chỉ với 3 cấu trúc điều khiển cơ bản:
• Tuần tự (Sequential)
• Lựa chọn (hay Rẽ nhánh) (Selecttion)
• Lặp (Repetition)
Trang 27• Mô tả đối tượng gồm các thuộc tính thuộc hai nhóm:
– Nhóm tính chất thứ nhất: khuôn dạng, sự tổ chức, kiến trúc (ví dụ: tên gọi, kích thước, mầu sắc, …
– Nhóm tính chất thứ 2: sự vận động, sự tương tác với các đối tượng khác (ví dụ: cách tạo lập, hủy bỏ, sự cập nhật (thay đổi kích thước, mầu sắc, ), hình thức tổ hợp với các đối tượng khác
• Trong OOP sử dụng các khái niệm cơ bản: đối tượng(object), lớp (class), tính kế thừa (inheritance), phương thức (methods), and tính đa hình (polymorphism)
Mã nguồn cho lập trình cấu trúc
varC varD functionC { }
Trang 28 Lập trình cấu trúc bắt buộc lập trình viên tiếp cận lập trình bắt đầu từ cách nhìn bài toán ở mức khái niệm, thiết kế chương trình trước khi tiến hành mã hóa (viết code)
Lập trình cấu trúc giúp xóa bỏ mã rối (spaghetti code)
và đảm bảo tính đúng đắn của chương trình.