You are on page 1of 7

u trúc d li u và gi i thu t

Ch ng 1.

ng quan v c u trúc d li u và gi i thu t

1.1. Vai trò c a c u trúc d li u trong m t án tin h c

Th c hi n gi i m t bài toá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 các i t ng ó. Vì th , xây d ng bài toán tin h c ph n ánh c bài toán th c t c n chú tr ng n hai v n :

v T ch c bi u di n các i t ng th c t :

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, do ó trong bài toán tin h c c n ph i t ch c, xây d ng các c u trúc d li u 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 này, v a có th d dàng dùng máy tính x lý. Công vi c này g i là xây d ng c u trúc d li u cho bài toán.

v Xây d ng các thao tác x lý d li u:

T nh ng yêu c u x lý trong 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à c xây d ng gi i thu t cho bài toán.

Tuy nhiên khi gi i quy t m t bài toán trên máy tính, chúng ta th ng có khuynh ng ch chú tr ng n vi c xây d ng gi i thu t mà quyên i t m quan tr ng c a vi c t ch c d li u trong bài toán. Gi i thu t ph n ánh các phép x lý, còn i t ng x lý c a gi i thu t l i là d li u. Chính d li u ch a ng các thông tin c n thi t th c hi n gi i thu t. xác nh c gi i thu t phù h p c n ta c n ph i bi t nó tác ng n lo i d li u nào và khi l a ch n 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 lên d li u ó. Nh v y trong m t bài toán tin h c, c u trúc d li u và gi i thu t có m i quan h ch t ch v i nhau, c th hi n qua công th c:

C u trúc d li u + Gi i thu t = Ch ng trình

V i m t c u trúc d li u ã ch n, s có nh ng gi i thu t t ng ng, phù h p. Khi c u trúc d li u thay i th ng gi i thu t c ng ph i thay i theo tránh vi c x ng ép, thi u t nhiên trên m t c u trúc không phù h p. H n n a, m t c u trúc d li u

t t s giúp gi i thu t x lý trên ó có th phát huy tác d ng t t h n, v a nhanh v a ti t

ki m v t t , gi i thu t c ng

n gi n và d hi u h n.

1.2. Các tiêu chu n ánh giá c u trúc d li u

Do t m quan tr ng c a c u trúc d li u trong vi c gi i các bài toán trên máy tính, nên nh t thi t ph i chú tr ng n vi c l a ch n m t ph ng án t ch c d li u thích h p. M t c u trúc d li u t t ph i tho mãn các tiêu chu n sau:

1.2.1. Ph n ánh úng th c t

ây là tiêu chu n quan tr ng nh t, quy t nh tính úng n c a toàn b bài toán. 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 ho t ng có th l a 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 .

u trúc d li u và gi i thu t

Ví d : M t s tình hu ng ch n c u trúc l u tr sai

- Ch n bi n s nguyên integer 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 khi làm tròn m i giá tr ti n th ng s 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 .

- Trong tr ng trung h c, m i l p có th nh n t i a 25 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í 15.000 ng. Ch n m t bi n s nguyên (kh n ng -32768 32767) l u tr t ng s h c phí c a l p h c trong tháng, n u x y ra tr ng h p có thêm 5 h c sinh n a vào l p thì giá tr

n ng l u tr c a bi n ã ch n,

t ng h c phí thu

c là 375000 ng, v t kh

gây ra tình tr ng tràn, sai l ch.

1.2.2. Phù h p v i các thao tác trên ó

Tiêu chu n này giúp t ng hi u qu c a bài toá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ý.

1.2.3. 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 v a m nhi m c ch c n ng c a nó. Thông th ng có hai lo i tài nguyên c n l u ý nh t: CPU và b nh . Tiêu chu n này nên cân nh c tu vào tình hu ng c th khi th c hi n bài toán. N u t ch c s d ng bài toán c n có nh ng x lý nhanh thì khi ch n c u trúc d li u y u t ti t ki m th i gian x lý ph i t n ng h n tiêu chu n s d ng t i a b nh , và ng c l i.

Ví d : M t s tình hu ng ch n c u trúc l u tr lãng phí

- S d ng bi n integer (2 bytes) l u tr m t giá tr cho bi t tháng hi n hành. Trong tình hu ng này ta ch c n s d ng bi n ki u byte là .

- l u tr danh sách h c viên trong m t l p, s d ng m ng 60 ph n t (gi i h n s h c viên trong l p t i a là 60). N u s l ng h c viên th t s ít h n 60, thì gây lãng phí b nh . H n n a, s h c viên có th thay i theo t ng k , t ng n m. Trong tr ng h p này ta c n có m t c u trúc d li u linh ng h n m ng nh danh sách liên k t…

1.3. Ki u d li u và c u trúc d li u

nh phân thô s . N u mu n ph n ánh

c d li u th c t a d ng và phong phú, c n ph i xây d ng nh ng phép ánh x , nh ng qui t c t ch c ph c t p che lên t ng d li u thô, nh m a ra nh ng khái ni m logic v hình th c l u tr khác nhau th ng c g i là ki u d li u. Nh ã phân tích ph n u, gi a hình th c l u tr và các thao tác x lý trên ó có quan h m t thi t v i nhau. T ó có th a ra m t nh ngh a cho ki u d li u nh sau:

Máy tính th c s ch có th l u tr d ng

1.3.1. nh ngh a ki u d li u

Ki u d li u T c xác nh b i b <V,O>, v i :

- V: t p các giá tr h p l i t ng ki u T có th l u tr ;

- O : t p các thao tác x lý có th thi hành trên i t ng ki u T.

Ví d :

u trúc d li u và gi i thu t

Ki u d li u ký t = <V c , O c > v i:

- V c = {a - z, A - Z}

- O c = {l y mã ASCII c a ký t , bi n i ký t th ng thành ký t hoa, }

Ki u d li u s nguyên = <V i , O i >

- V c = {-32768 32767}

- Oc = {+, -, *, /, %, các phép so sánh}

Nh v y, mu n s d ng m t ki u d li u c n n m v ng c n i dung d li u c phép l u tr và các x lý tác ng trên ó.

1.3.2. Các thu c tính c a m t ki u d li u

M t ki u d li u bao g m các thu c tính sau :

- Tên ki u d li u;

- Mi n giá tr ;

- Kích th c l u tr ;

- T p các toán t tác ng lên ki u d li u.

1.3.3. Các ki u d li u c b n

Thông th ng trong m t h ki u c a

li u

c g i là ki u d li u n hay ki u d li u phân t (atomic), các ki u d li u n bao g m :

ngôn ng l p trình s có m t s ki u d

- Ki u r i r c: s nguyên, ký t , logic, li t kê, mi n con.

- Ki u liên t c: s th c.

Tu t ng ngôn ng l p trình, các ki u d li u nh ngh a s n này có th khác nhau ôi chút. Ch ng h n, v i ngôn ng C, các ki u d li u này ch g m s nguyên, s th c, ký t . Và theo quan i m c a C, ki u ký t th c ch t c ng là ki u s nguyên v m t l u tr , ch khác v cách s d ng. Ngoài ra, giá tr logic úng (TRUE) và giá tr logic sai (FALSE) c bi u di n trong ngôn ng C nh là các giá tr nguyên khác 0 và b ng 0. Trong khi ó Pascal nh ngh a t t c các ki u d li u ã li t kê trên và phân bi t chung m t cách ch t ch : Ki u integer; Ki u real; Ki u boolean; Ki u char; Ki u li t kê; Ki u n con.

Các ki u d li u nh s n trong C g m các ki u sau:

Tên ki u

Kích th c

 

Mi n giá tr

Ghi chú

char

01

byte

-128 n 127

Có th dùng nh s nguyên 1 byte có d u ho c ki u ký

 

t

unsign char

01

byte

0

n 255

S nguyên 1 byte không d u

int

02

byte

-32738 n 32767

 

unsign int

02

byte

0

n 65335

Có th g i t t là unsign

long

04

byte

-2 32 n 2 31 -1

 

u trúc d li u và gi i thu t

unsign long

04

byte

0

n 2 32 -1

 

float

04

byte

3.4E-38 n 3.4E38

Gi i

h n

ch

tr

tuy t

 

i.Các giá tr <3.4E-38 c coi = 0. Tuy nhiên ki u float ch có 7 ch s có ngh a.

double

08

byte

1.7E-308 n 1.7E308

 

long double

10

byte

3.4E-4932 n 1.1E4932

 

1.3.4. Các ki u d li u có c u trúc

Khi gi i quy t các bài toán ph c t p, ta ch s d ng các d li u các d li u n là không , ta ph i c n n các c u trúc d li u. M t c u trúc d li u bao g m m t t p h p nào ó các d li u phân t , các thành ph n này liên k t v i nhau b i m t ph ng

pháp nào ó. a s các ngôn ng l p trình u cài t s n m t s ki u có c u trúc c b n

cung c p c ch cho l p trình viên t nh ngh a

nh m ng, chu i, t p tin, b n ghi ki u d li u m i.

v Ki u chu i ký t (String): là m t trong các 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 nh ngh a nó nh m t ki u c b n. Do tính thông d ng c a ki u chu i ký t các ngôn ng l p trình luôn cung c p s n m t b các hàm th vi n các x lý trên ki u d li u này. c bi t trong C th vi n các hàm x lý chu i ký t r t a d ng và phong phú. Các hàm này c t trong th vi n string.lib c a C.

Chu i ký t trong C c c u trúc nh m t chu i liên ti p các ký t k t thúc b ng ký t có mã ASCII b ng 0 (NULL character). Nh v y, gi i h n chi u dài c a m t chu i ký t trong C là 1 Segment (t i a ch a 65335 ký t ), ký t u tiên c ánh s là ký t th 0.

Ngôn ng Pascal: <ten_chuoi>: String (<kich_thuoc>);

Ví d : hoten: String; mssv: String(8);

Ngôn ng C: char <ten_chu i>[< kich_thuoc >]; hay char *<ten_chu i>;

Ví d : char a[10], b[] = “ABC”, *c= “ABC”;

Các thao tác trên chu i ký t r t a d ng. Sau ây là m t s thao tác thông d ng:

- So sánh 2 chu i: strcmp

- Sao chép 2 chu i: strcpy

- Ki m tra 1 chu i n m trong chu i kia: strstr

- C t 1 t ra kh i 1 chu i: strtok

- i 1 s ra chu i: itoa

- i 1 chu i ra s : atoi, atof,

- i 1 hay 1 s giá tr ra chu i: sprintf

- Nh p m t chu i: gets Xu t m t chu i: puts

u trúc d li u và gi i thu t

v Ki u m ng (array): là m t t p h p nhi u ph n t có cùng m t ki u giá tr và chung m t tên. M i ph n t m ng bi u di n c m t giá tr . Các ph n t c a m ng c truy xu t thông qua ch s .

Ngôn ng Pascal: <ten_mang>: array[ds_cacchieu] of <kieu_dulieu>;

Ví d : a: array[1

10]

of integer; b: array[1

3,1

2]

of integer;

Ngôn ng C: <kieu_dulieu> <ten_mang>[<ds_cacchieu>];

Ví d : int a[10], b[3][2];

Ta c ng có th v a khai báo v a gán giá tr kh i ng cho m t m ng nh sau:

int a[5] = (1, 7, -3, 8, 19);

Trong tr ng h p này C cho phép ta khai báo m t cách ti n l i h n:

int a[] = (1, 7, -3, 8, 19);

int b[ ][ ]={{1, 7, -3, 8, 19}, {4, 5, 2, 8, 9}, {21, -7, 45, -3, 4}};

(m ng a s có kích th c là 3x5).

v Ki u b n ghi, m u tin (record, struct): là ki u c dùng l u tr m t i t ng có nhi u thành ph n, các thành ph n có th thu c các ki u d li u khác nhau.

Ngôn ng Pascal: <ten_bangghi>: record

<ten_thanhphan>: <kieu_dulieu>;

……

<ten_thanhphan>: <kieu_dulieu>;

end;

Ví d : sinhvien: record

hoten: string[30];

namsinh: integer;

diachi: string;

toan, ly, hoa, tong: real;

end;

Ngôn ng C: struct <ten_bangghi>

{ <kieu_dulieu> <ten_thanhphan>;

……

};

Ví d : struct hocvien

{

char ho[30];

char ten[7];

<kieu_dulieu> <ten_thanhphan>;

float toan, ly, hoa , dtb;

u trúc d li u và gi i thu t

char xeploai[10];

}

;

v Ki u con tr (Pointer): là m t ki u d li u dùng ch a a ch c a m t bi n ho c m t hàm nào ó. Con tr th ng c dùng :

+ Tr v nhi u tr t hàm qua c ch truy n theo tham s theo a ch trong

hàm (tham s hình

th c bi n).

+ T o các c u trúc d li u ph c t p nh danh sách liên k t và cây nh phân.

+ Truy n m ng và chu i gi a các hàm khá thu n l i.

Ngôn ng Pascal: <ten_contro> = ^<kieu_dulieu>;

Ví d :

Pointer = ^Node ;

Node = record

infor : Item ;

next : Pointer;

end ;

Ngôn ng C: <kieu_dulieu> *<ten_contro>;

Ví d : int *songuyen, char *chuoi;

v Ki u file (t p tin): là ki u d li u cho phép th c hi n các thao tác (m , óng, xóa, ghi ký t , xóa ký t ,…) trên các t p tin (v n b n, nh phân).

Ngôn ng C: <ten_taptin>: file of <kieu_dulieu>;

Ví d : fileReal: file of real;

Ngôn ng C: FILE *<ten_taptin>;

Ví d : FILE *fptr;

Bài t p

1.Tìm thêm m t s ví d minh ho m i quan h gi a c u trúc d li u và gi i thu t.

2. Cho bi t m t s ki u d li u c nh ngh a s n trong m t ngôn ng l p trình các b n

th ng s d ng. Cho bi t m t s ki u d li u ti n nh này có áp ng m i yêu c u v t ch c d li u không ?

3. t ngôn ng l p trình có nên cho phép ng i s d ng t nh ngh a thêm các ki u d

li u có c u trúc? Gi i thích và cho ví d .

4. Gi s có m t b ng gi tàu cho bi t thông tin v các chuy n tàu khác nhau c a m ng

ng s t. Hãy bi u di n các d li u này b ng m t c u trúc d li u thích h p (file, array, struct

) sao cho d dàng truy xu t gi kh i hành, gi n c a m t chuy n tàu b t k t i m t nhà ga t k .

5. Gi s quy t c t ch c qu n lý nhân viên c a m t công ty nh sau :

Thông tin v m t nhân viên bao g m lý l ch và b ng ch m công :

- Lý l ch nhân viên :

+ Mã nhân viên : chu i 8 ký t

u trúc d li u và gi i thu t

+ Tên nhân viên : chu i 20 ký t

+ Tình tr ng gia ình : 1 ký t ( M = Married, S = Single)

+ con : s nguyên $ 20

+ Trình v n hoá : chu i 2 ký t (C1 = c p 1 ; C2 = c p 2 ; C3 = c p 3; H = i c; CH = cao h c)

+ ng c n b n : s $ 1000000 - Ch m công nhân viên :

+ ngày ngh có phép trong tháng : s $ 28

+ ngày ngh không phép trong tháng : s $ 28

+ ngày làm thêm trong tháng : s $ 28

+ t q a công vi c : chu i 2 ký t (T = T t; TB = t ;K = Kém)

+ ng th c l nh trong tháng : s $ 2000000 Quy t c tính l ng :

ng th c l nh = L ng c n b n + Ph tr i

Trong ó n u:

- s con > 2: Ph tr i = +5% L ng c n b n

- trình v n hoá = CH: Ph tr i = +10%L ng c n b n

- làm thêm: Ph tr i=+4%L ng c n b n/ngày

- ngh không phép: Ph tr i= -5%L ng c n b n/ngày

Ch c n ng yêu c u :

- C p nh t lý l ch, b ng ch m công cho nhân viên (thêm, xoá, s a)

- Xem b ng l ng hàng tháng

- Tìm thông tin c a m t nhân viên

ch c c u trúc d li u thích h p bi u di n các thông tin trên, và cài t ch ng trình theo các ch c n ng ã mô t .