TR ƯỜ NG ĐH CÔNG NGHI P TP... Đánh giá CTDL và GT1... Cấu trúc chương trình C/C++ couta,b,c; cout... Các thao tác trên bi n con trế ỏ1... Các thao tác trên bi n con trế ỏ2.
Trang 1TR ƯỜ NG ĐH CÔNG NGHI P TP HCM Ệ
TT CNTT
C U TRÚC D LI U VÀ GI I THU T Ấ Ữ Ệ Ả Ậ
Giáo viên: Tr n Th Kim Chi ầ ị
DATA STRUCTURES & ALGORITHMS
Trang 2Gi i thi u ớ ệ
M c tiêuụ
N m v ng khái ni m ki u d li u, ki u d li u tr u ắ ữ ệ ể ữ ệ ể ữ ệ ừ
tượng
N m v ng và cài đ t đắ ữ ặ ược các ki u d li u tr u tể ữ ệ ừ ượng c ơ
b n nh danh sách, ngăn x p, hàng đ i, cây, t p h p, b ng ả ư ế ợ ậ ợ ảbăm, đ th b ng m t ngôn ng l p trình căn b n ồ ị ằ ộ ữ ậ ả
V n d ng đậ ụ ược các ki u d li u tr u tể ữ ệ ừ ượng đ gi i quy t ể ả ếbài toán đ n gi n trong th c t ơ ả ự ế
Ngôn ng l p trình minh hoữ ậ ạ
Mã gi (pseudocode)ả
Trang 3Th c ự hành
Trang 4Ki n th c tiên quy t ế ứ ế
Đã h c môn ph ọ ươ ng pháp l p trình ậ
Ki n th c v k thu t l p trình ế ứ ề ỹ ậ ậ
S d ng thành th o ngôn ng C++ ử ụ ạ ữ
Trang 6Tiêu chu n đánh giá ẩ
Trang 7Trao đ i thông tin ổ
Đ a ch mail: ị ỉ
• Kimchi_12041972@yahoo.com
Đ a ch download tài li u: ị ỉ ệ
• http://my.opera.com/LinhChi10/blog/
Trang 8T ng quan ổ
1.1 Khái ni m ệ c u trúc d li u & gi i thu t ấ ữ ệ ả ậ 1.2 Đánh giá c u trúc d li u và gi i thu t ấ ữ ệ ả ậ 1.3 Ôn l i ngôn ng C++ ạ ữ
Trang 9 D li u ữ ệ có th là d li u đ a vào (input data), d li u trung ể ữ ệ ư ữ ệ gian ho c d li u đ a ra (output data) M i d li u có m t ặ ữ ệ ư ỗ ữ ệ ộ
Trang 10 Phù h p v i các thao tác trên đó ợ ớ : 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ý ạ ệ ả ơ ề ố ộ ử
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ó ủ Lo i tài nguyên c n quan tâm là : CPU và b ạ ầ ộ
nh ớ
C u trúc d li u ấ ữ ệ
Trang 11Nh ng c u trúc d li u c ữ ấ ữ ệ ơ
b n ả
Các c u trúc bao g m ấ ồ
…
Trang 127
Trang 14q 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)
Trang 15M i quan h gi a ố ệ ữ
c u trúc d li u và gi i thu t ấ ữ ệ ả ậ
CTDL + Thuật toán = Chương
trình
Trang 16Đánh giá CTDL và GT
1 Các tiêu chu n đánh giá c u trúc d li uẩ ấ ữ ệ
Đ đánh giá m t c u trúc d li u chúng ta thể ộ ấ ữ ệ ường d a vào m t ự ộ
s tiêu chí sau:ố
C u trúc d li u ph i ti t ki m tài nguyên (b nh trong),ấ ữ ệ ả ế ệ ộ ớ
C u trúc d li u ph i ph n nh đúng th c t c a bài toán,ấ ữ ệ ả ả ả ự ế ủ
C u trúc d li u ph i d dàng trong vi c thao tác d li u.ấ ữ ệ ả ễ ệ ữ ệ
Trang 17Đánh giá CTDL và GT
Th i gian th c hi n ch ờ ự ệ ươ ng trình.
Th i gian th c hi n m t ch ờ ự ệ ộ ươ ng trình là m t hàm c a kích th ộ ủ ướ c d ữ
li u vào, ký hi u T(n) trong đó n là kích th ệ ệ ướ c (đ l n) c a d li u ộ ớ ủ ữ ệ vào.
Đ n v c a T(n) không ph i là đ n v đo th i gian bình th ơ ị ủ ả ơ ị ờ ườ ng nh ư
gi , phút giây mà th ờ ườ ng đ ượ c xác đ nh b i s các l nh đ ị ở ố ệ ượ c th c ự
hi n trong m t máy tính lý t ệ ộ ưở ng.
Ví dụ: Khi ta nói th i gian th c hi n c a m t chờ ự ệ ủ ộ ươ ng trình là T(n) =
cn thì có nghĩa là ch ươ ng trình y c n cn ch th th c thi ấ ầ ỉ ị ự
Trang 19Đánh giá CTDL và GT
Khái ni m đ ph c t p c a gi i thu t ệ ộ ứ ạ ủ ả ậ
Đ ph c t p tính toán c a gi i thu t là m t hàm ch n trên c a ộ ứ ạ ủ ả ậ ộ ặ ủhàm th i gian Vì h ng nhân t c trong hàm ch n trên không có ờ ằ ử ặ
ý nghĩa nên ta có th b qua vì v y hàm th hi n đ ph c t p ể ỏ ậ ể ệ ộ ứ ạ
có các d ng thạ ường g p sau: logặ 2n, n, nlog2n, n2, n3, 2n, n!, nn
Ba hàm cu i cùng ta g i là d ng hàm mũ, các hàm khác g i là ố ọ ạ ọhàm đa th c ứ
M t gi i thu t mà th i gian th c hi n có đ ph c t p là m t ộ ả ậ ờ ự ệ ộ ứ ạ ộhàm đa th c thì ch p nh n đứ ấ ậ ượ ức t c là có th cài đ t đ th c ể ặ ể ự
hi n, còn các gi i thu t có đ ph c t p hàm mũ thì ph i tìm ệ ả ậ ộ ứ ạ ảcách c i ti n gi i thu t ả ế ả ậ
Trang 20 Đ đánh giá hi u qu c a m t thu t toán, có th ể ệ ả ủ ộ ậ ể tính s lố ượng các
phép tính ph i th c hi n ả ự ệ c a ủ thu t toán nàyậ :
Phép so sánh
Phép gán
Thông thường s các phép tính đố ược th c hi n ph thu c vào c ự ệ ụ ộ ỡ
c a bài toán, t c là đ l n c a ủ ứ ộ ớ ủ đ u vào ầ
Vì th ế đ ph c t p thu t toán ộ ứ ạ ậ là m t ộ hàm ph thu c đ u vàoụ ộ ầ
Tuy nhiên, không c n bi t chính xác hàm này mà ch c n bi t m t ầ ế ỉ ầ ế ộ
Trang 23Bảng so sánh các độ phức tạp của thuật toán
M t s l p thu t toán ộ ố ớ ậ
23
Trang 2424
Trang 25 Ví d 1-6 ụ : L nh gán x=15 t n m t h ng th i gian hay O(1)ệ ố ộ ằ ờ
L nh đ c d li u scanf(“%d”, x) t n m t h ng th i gian hay ệ ọ ữ ệ ố ộ ằ ờO(1)
V y th i gian th c hi n c hai l nh trên n i ti p nhau là ậ ờ ự ệ ả ệ ố ếO(max(1,1))=O(1)
Trang 27Đánh giá CTDL và GT
Qui t c t ng quát đ phân tích m t ch ắ ổ ể ộ ươ ng trình:
Th i gian th c hi n c a m i l nh gán, Scanf, Printf là O(1)ờ ự ệ ủ ỗ ệ
Th i gian th c hi n c a m t chu i tu n t các l nh đờ ự ệ ủ ộ ỗ ầ ự ệ ược xác
đ nh b ng qui t c c ng Nh v y th i gian này là th i gian thi ị ằ ắ ộ ư ậ ờ ờhành m t l nh nào đó lâu nh t trong chu i l nh.ộ ệ ấ ỗ ệ
Th i gian th c hi n c u trúc IF là th i gian l n nh t th c hi n ờ ự ệ ấ ờ ớ ấ ự ệ
l nh sau IF ho c sau ELSE và th i gian ki m tra đi u ki n ệ ặ ờ ể ề ệ
Thường th i gian ki m tra đi u ki n là O(1).ờ ể ề ệ
Th i gian th c hi n vòng l p là t ng (trên t t c các l n l p) ờ ự ệ ặ ổ ấ ả ầ ặ
th i gian th c hi n thân vòng l p N u th i gian th c hi n thân ờ ự ệ ặ ế ờ ự ệvòng l p không đ i thì th i gian th c hi n vòng l p là tích c a ặ ổ ờ ự ệ ặ ủ
s l n l p v i th i gian th c hi n thân vòng l p.ố ầ ặ ớ ờ ự ệ ặ
Trang 28Đánh giá CTDL và GT
Qui t c t ng quát đ phân tích m t ch ắ ổ ể ộ ươ ng trình:
Ví d ụ : Tính th i gian th c hi n c a đo n chờ ự ệ ủ ạ ương trình
void BubleSort(int a[], int N )
{ int i, j, temp;
{1} for (i = 0 ; i<N-1 ; i++){2} for (j =N-1; j >i ; j ){3} if(a[j]< a[j-1]) // n u sai v trí thì đ i chế ị ổ ỗ{4} { temp = a[j];
{5} a[j] = a[j-1];
{6} a[j-1] = temp;
}} C ba l nh đ i ch {4} {5} {6} t n O(1) th i gian, do đó l nh {3} t n O(1).Vòng l p {2} th c hi n (n-i) l n, m i l n O(1) do đó vòng l p {2} t n O((n-ả ặệ ổ ự ỗ ệ ầ ố ỗ ầ ờ ệặ ốố
i).1)=O(n-i).
Vòng l p {1} l p (n-1) l n v y đ ph c t p c a gi i thu t là: ặ ặ ầ ậ ộ ứ ạ ủ ả ậ
Trang 296. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 30 L nh nh p và xu t d li uệ ậ ấ ữ ệ
Using scanf, prinf (C standard)
Using cin, cout (Cpp)
Ví d : Tìm s l n nh t trong ba s nh p vào t bàn phímụ ố ớ ấ ố ậ ừ
1. Cấu trúc chương trình C/C++
cout<<“Nhap 3 so: “; cin>>a,b,c;
cout <<“max = “<<max;
C++
#include <iostream.h>
C
Trang 326. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 352 Ki u d li u ể ữ ệ
Ki u ký t : ể ự
Có th có các kích th ể ướ c sau:
+ Ki u ký t 1 byte ể ự + Ki u ký t 2 bytes ể ự
Các phép toán: O = {+, -, <, >, <=, >=, =, ORD, CHR, …}
Ki u chu i ký t : ể ỗ ự
Có kích th ướ c tùy thu c vào t ng ngôn ng l p trình ộ ừ ữ ậ
Các phép toán: O = {+, &, <, >, <=, >=, =, Length, Trunc, …}
Ki u lu n lý: ể ậ
Th ườ ng có kích th ướ c 1 byte
Ki u lu n lý th ể ậ ườ ng đ ượ c th c hi n v i các phép toán: O = ự ệ ớ {NOT, AND, OR, XOR, <, >, <=, >=, =, …}
Trang 36float b=5/2; //b=?
36
Chương 1: Ôn tập C/C++
Trang 40switch ( bi u_th c_nguyên ể ứ ) {
case h ng_1 ằ :
các_câu_l nh_1 ệ [ break; ]
case h ng_2 ằ :
các_câu_l nh_2 ệ [ break; ]
Trang 41for ( bt_kh i_t o ở ạ ; bt_ki m_tra ể ; bt_t ng ă ) kh i_l nh ố ệ
while ( bt_ i u_khi n đ ề ể
)
{
câu_l nh_1; ệ câu_l nh_2; ệ
… }
do {
khối_lệnh
}while ( bt_điều_khiển );
41
Các toán t đi u khi n l p ử ề ể ặ
2. Các cú pháp cơ bản
Ch ươ ng 1: Ôn tập C/C++
Trang 4343
Trang 44 C p phát b nh đ ng: ấ ộ ớ ộ
Heap: vùng b nh đ c bi t dành riêng cho các bi n đ ng Đ ộ ớ ặ ệ ế ộ ể
t o m t bi n đ ng m i, h th ng c p phát không gian t heap ạ ộ ế ộ ớ ệ ố ấ ừ
N u không còn b nh , ế ộ ớ new không th c p phát b nh thì nó ể ấ ộ ớ
44
Trang 46 Vi t ch ế ươ ng trình tính di n tích, chu vi hình ch ệ ữ
nh t ậ
Vi t ch ế ươ ng trình tính di n tích, chu vi hình tròn ệ
Vi t ch ế ươ ng trình nh p Masv, Hoten, Đi m toán, ậ ể
lý, hóa In ra Masv, Hoten, Dtb và x p lo i c a sinh ế ạ ủ viên đó
Vi t ch ế ươ ng trình tính t ng c a dãy s t 1 t i n ổ ủ ố ừ ớ
Vi t ch ế ươ ng trinh in ra n s nguyên t ố ố
46
Chương 1: Ôn tập C/C++
Trang 476. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 48 M i bi n có hai thu c tính: ỗ ế ộ
Đ a ch (ị ỉ address) và giá tr (ị value )
Bi n ph i đế ả ược khai báo trước khi s d ngử ụ
Ví d : int y=0;ụ
char kytu;
cout << “Giá tr c a 'y' là: " << y << "\n"; ị ủ
cout << “Đ a ch c a 'y' là: " << &y << "\n\n"; ị ỉ ủ
B nh t i đ a ch 3: giá tr : 45 ộ ớ ạ ị ỉ ị
B nh t i đ a ch 2: giá tr "Dave" ộ ớ ạ ị ỉ ị
Trang 496. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 50 Là m t ki u d li u đ c bi t, có giá tr là m t đ a ch vùng nh ộ ể ữ ệ ặ ệ ị ộ ị ỉ ớ
c a m t đ i tủ ộ ố ượng (bi n, hàm).ế
Cho phép truy xu t m t đ i tấ ộ ố ượng m t cách gián ti p, nghĩa là ộ ếtham chi u 1 đ i tế ố ượng khác thông qua đ a ch c a nó.ị ỉ ủ
Vi c c p phát đ ng cho m ng đệ ấ ộ ả ược th c hi n thông qua con tr ự ệ ỏ
Tùy theo h máy mà ki u d li u con tr có các kích thệ ể ữ ệ ỏ ước khác nhau:
+ H máy PC: 2 bytes ệ + H máy tính l n: 4 bytes ệ ớ
Int i; giá tr c a bi n ị ủ ế Int *p = &i; //p ch a đ a ch c a i ứ ị ỉ ủ
*p = 10 ; //gán i=10
Ví dụ
Trang 51 Khai báo ki u con tr : ể ỏ
ki uc s Tể ơ ở *tênki ucontr ;ể ỏ
Ki u c s : ể ơ ở là ki u đã đ nh nghiã trể ị ước, cũng có th là ki u ể ểcon tr ỏ
Ki u con tr void ể ỏ : là ki u con tr có th ch a đ a ch c a b t ể ỏ ể ứ ị ỉ ủ ấ
kỳ ki u nào Nh ng khi s d ng ph i ép v 1 ki u d li u c ể ư ử ụ ả ề ể ữ ệ ụ
th ể
Khai báo bi n con tr ế ỏ:
M u 1: ẫ tênki ucontr ể ỏ tênbi ncontr ế ỏ;
Trang 52Các thao tác trên bi n con trế ỏ
1. Gán 1 đ a ch cho bi n con tr : ị ỉ ế ỏ
tênbi ncontr = &tênbi nc nl yđ ach ;ế ỏ ế ầ ấ ị ỉ
tênbi ncontr = NULL;ế ỏ
Trang 53Các thao tác trên bi n con trế ỏ
2 Truy xu t n i dung 1 bi n do bi n con tr tr đ n: ấ ộ ế ế ỏ ỏ ế
*tênbi ncontrế ỏ
L u ý: Toán t * và & cùng đ u tiênư ử ộ ư
3 Phép toán s h c trên ki u con tr : ố ọ ể ỏ
Ch có ý nghĩa khi th c hi n trên m ngỉ ự ệ ả
pt + i ==> C ng đ a ch vùng nh l u trong pt v i ộ ị ỉ ớ ư ới*sizeof(T)
Trang 54cout<<" The address of i is "<< ia <<"\n";
cout<<" The value at that location is "<< i <<"\n";
cout<<" The value at that location is "<< *ia <<"\n";
Trang 55int i; //A
int * ia; //B
cout<<"The address of i "<< &i << " value="<<i <<endl;
cout<<"The address of ia " << &ia << " value = " << ia<< endl;
i = 10; //C
ia = &i; //D
cout<<"after assigning value:"<<endl;
cout<<"The address of i "<< &i << " value="<<i <<endl;
cout<<"The address of ia " << &ia << " value = " << ia<< " point to: "<< *ia;
Trang 576. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 59Ch ươ ng 1: Ôn tập C/C++
Trang 605. Mảng ( Array )
Truy c p m ng s d ng con tr :ậ ả ử ụ ỏ
Có th truy c p t ng ph n t c a m ng b ng cách s d ng con ể ậ ừ ầ ử ủ ả ằ ử ụtrỏ
60
Chương 1: Ôn tập C/C++
void print_usingptr( int a[], int n)
{
int *b;
b=a;
cout<<" value in array\n ";
for ( int i=0; i<n; i++)
cout<<" value in array\n ";
for ( int i=0; i<n; i++)
{
cout<<*(a+i)<<" ";
} }
Trang 61 Trường h p khác c a thao tác m t m ng s d ng con trợ ủ ộ ả ử ụ ỏ
M ng gi i h n là m t con tr h ng nghĩa là không th thay ả ớ ạ ộ ỏ ằ ể
đ i giá tr c a nó trong chổ ị ủ ương trình
int a[5]; int *b;
a=b; //error
b=a; //OK
Làm vi c đúng ngay c khi ệ ả dùng a++ ???
Demo
Trang 62delete s ph thu c vào trình biên d ch và lo i d li u đang ẽ ụ ộ ị ạ ữ ệ
s d ng Ta có th nh n đử ụ ể ậ ượ ỗ runtime error ho c k t c l i ặ ế
qu saiả
62
Trang 635. Mảng ( Array )
63
Trang 645. Mảng ( Array )
64
Trang 656. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 66 Có th khai báo m ng con tr (t ể ả ỏ ươ ng t nh m ng s ) ự ư ả ố
Trong m ng con tr , các ph n t m ng l u con tr ả ỏ ầ ử ả ư ỏ
Demo
Trang 676. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 697. Mảng hai chiều ( Twodimensional array )
Duy t m ng hai chi u s d ng con tr : ệ ả ề ử ụ ỏ
Ví d : ụ
float *pa, a[2][3];
pa = (float*)a; // neu khong ep kieu thi C se canh bao
// nhung chuong trinh van chay tot
Khi đó pa tr t i a[0][0] ỏ ớ pa+1 tr t i a[0][1] ỏ ớ pa+2 tr t i a[0][2] ỏ ớ pa+3 tr t i a[1][0] ỏ ớ pa+4 tr t i a[1][1] ỏ ớ pa+5 tr t i a[1][2] ỏ ớ
69
Chương 1: Ôn tập C/C++
Trang 70 Vi t ch ế ươ ng trình nh p đi m toán cho n sinh viên ậ ể
In ra t ng đi m, đi m trung bình và t l đ t và ổ ể ể ỷ ệ ạ không đ t c a môn toán ạ ủ
70
Chương 1: Ôn tập C/C++
Trang 716. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 73Tên_c u_trúc ấ tên_biến;
struct Tên_cấu_trúc tên_biến;
Chương 1: Ôn tập C/C++
Tên_bi n_c u_trúc.Tên_thành _ph n ế ấ ầ
Trang 749. Con trỏ cấu trúc ( Structure pointer )
Gi ng nh các ki u d li u khác, ta có th khai báo ố ư ể ữ ệ ể con tr c u trúc ỏ ấ
Trang 75Ví d : X lý ki u c u trúc s d ng structure pointer ụ ử ể ấ ử ụ
Demo
Trang 76 Vi t ch ế ươ ng trình tính di n tích, chu vi hình ch ệ ữ
nh t (yêu c u khai báo c u trúc hình ch nh t) ậ ầ ấ ữ ậ
Vi t ch ế ươ ng trình tính di n tích, chu vi hình tròn ệ (yêu c u khai báo c u trúc hình tròn) ầ ấ
Vi t ch ế ươ ng trình nh p n sinh viên g m Masv, ậ ồ Hoten, Đi m toán, lý, hóa In ra Masv, Hoten, Dtb và ể
x p lo i c a sinh viên đó ế ạ ủ
76
Chương 1: Ôn tập C/C++
Trang 776. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 81M t s thao tác thông d ng: ộ ố ụ (c n #include <string.h>) ầ
So sánh 2 chu i: ỗ strcmp
Sao chép chu i: ỗ strcpy
Đ dài chu i: ộ ỗ strlen
Ki m tra 1 chu i n m trong chu i kia: ể ỗ ằ ỗ strstr
Trang 82cout << "Length of s1= " << strlen(s1);
cout << "Length of s2= " << strlen(s2);
if (strchr(s1, 'e')) cout << "e is in " << s1;
if (strstr(s2, "hi")) cout << "found hi in " <<s2;
82
Trang 836. M ng con tr ( ả ỏ Pointer array )
7. M ng hai chi u ( ả ề Two-dimensional array )
Trang 84 T p tin (File) có th xem là m t ki u d li u đ c bi t, kích ậ ể ộ ể ữ ệ ặ ệ
thướ ốc t i đa c a t p tin tùy thu c vào không gian đĩa n i l u ủ ậ ộ ơ ư
Có 2 lo i t p tin : ạ ậ
File văn b n ả
File có c u trúc truy nh p ng u nhiên (File nh phân) ấ ậ ẫ ị