khÁi niỆm vỀ cẤu trÚc dỮ liỆu & giẢi thuẬt»‘i quan hệ giữa ctdl và...

36
KHÁI NIỆM VỀ CẤU TRÚC DỮ LIỆU & GIẢI THUẬT

Upload: lamdieu

Post on 06-May-2018

220 views

Category:

Documents


2 download

TRANSCRIPT

KHÁI NIỆM VỀ CẤU TRÚC DỮ LIỆU & GIẢI THUẬT

Nội dung• Cấu trúc dữ liệu• Giải thuật• Phương pháp biểu diễn thuật toán• Độ phức tạp của thuật toán• Kiểu cấu trúc (struct)

2

Cấu trúc dữ liệu• Cấu trúc dữ liệu là cách thức liên kết

các kiểu dữ liệu cơ sở khác nhau tạonên các CTDL khác nhau.

• Lưu ý: Lựa chọn một CTDL thích hợp đểtổ chức dữ liệu vào là một khâu rất quantrọng.

3

Kiểu dữ liệu cơ bản

4

• Kiểu số nguyên (int, long)• Kiểu số thực (float, double)• Kiểu ký tự (char)Kiểu dữ liệu có cấu trúc• String• Array• Struct, union, enum• File• Pointer

Các lưu ý khi chọn CTDL• CTDL phải biểu diễn được đầy đủ các

thông tin vào và ra của bài toán.• CTDL phải phù hợp với thao tác của thuật

toán mà ta chọn để giải quyết bài toán.• CTDL phải cài đặt được trên máy tính với

ngôn ngữ lập trình đang sử dụng.

5

Giải thuật• Là một dãy hữu hạn các bước, mỗi bước

mô tả chính xác các phép toán hoặc hànhđộng cần thực hiện, để giải quyết một vấnđề.

6

Các đặc trưng của giải thuật• Tính dừng: Giải thuật phải dừng sau một số hữu

hạn bước.• Tính xác định: mỗi bước của giải thuật phải được

xác định rõ ràng và phải được thực hiện chínhxác, nhất quán.

• Tính phổ dụng: Giải thuật phải "vét' hết cáctrường hợp và áp dụng cho một loạt bài toán cùngloại.

• Tính hiệu quả: Một giải thuật được đánh giá là tốtnếu nó đạt hai tiêu chuẩn sau: Thực hiện nhanh, tốn ít thời gian. Tiêu phí ít tài nguyên của máy, chẳng hạn tốn ít bộ

nhớ.

7

Phương pháp biểu diễn thuật toán• Lưu đồ• Ngôn ngữ tự nhiên• Mã giả• Ngôn ngữ lập trình

8

Lưu đồ• Dùng các hình vẽ (có

qui ước) để diễn đạtthuật toán. Lưu đồ chohình ảnh trực quan vàtổng thể của thuậttoán, nên thường đượcsử dụng.

• Ví dụ: Tìm ước chunglớn nhất của a và b.

9

Begin

Nhập a,b

a<b

a b

a%b!=0

Đ

S

End

a=a%b

b là UCLN

Đ

S

Lưu đồ - ký hiệu• Điểm bắt đầu và kết thúc• Hướng tính toán• Nhập/xuất• Tính toán• Lựa chọn ½• Lựa chọn 1/n• Điểm ráp nối khi lưu đồ lớn

10

297

5

Begin End

Nhập a Xuất c

c=a+b

yes

no

d

a>0

Ngôn ngữ tự nhiên• Thuật toán có thể trình bày dưới dạng

ngôn ngữ tự nhiên theo trình tự các bướcthực hiện trong thuật toán.

Ví dụ: Tìm ước chung lớn nhất của a và b.• B1: Nếu a<b thì hoán đổi giá trị a và b.• B2: Nếu a không chia hết cho b thì a:=a

mod b. Quay lại B1.• B3: b là ước chung lớn nhất. Dừng.

11

Mã giả• Là sự kết hợp ngôn ngữ tự nhiên với ngôn ngữ

lập trình để diễn tả thuật toán.int UCLN (int a, int b){

do {if(a<b)

a b;if(a%b 0)

a=a%b;} while(a%b 0);return b;

}

12

Ngôn ngữ lập trình• Dùng cấu trúc lệnh, dữ liệu của một ngôn ngữ lập trình

nào đó để mô tả.int UCLN (int a, int b){

int c;do {

if (a<b){

c=a;a=b;b=c;}if (a%b!=0) a%=b;

} while (a%b!=0);return b;

}13

Mối quan hệ giữa CTDL và giải thuật• Trong một chương trình máy tính, 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ệnqua 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ậttương ứng, phù hợp.

• Khi cấu trúc dữ liệu thay đổi thường giải thuật cũng phảithay đổi theo để tránh việc xử lý gượng ép, thiếu tựnhiên trên một cấu trúc không phù hợp.

• CTDL tốt sẽ giúp giải thuật xử lý trên đó có thể phát huytác dụng tốt hơn, vừa đáp ứng nhanh vừa tiết kiệm bộnhớ, giải thuật cũng dễ hiễu và đơn giản hơn.

14

Độ phức tạp của thuật toán• Để đánh giá tính hiệu quả của thuật toán,

người ta đưa ra khái niệm độ phức tạpcủa thuật toán.

• Dựa trên độ phức tạp của thuật toán đểbiết được thuật toán là tốt hay chưa tốt, cóthể chạy trên máy tính được hay không.

• Độ phức tạp của thuật toán được tính dựatrên số lượng thao tác mà thuật toán thựchiện.

15

Thời gian thực hiện của thuật toánThời gian thực hiện của giải thuật phụ thuộcvào nhiều yếu tố.• Trước hết phụ thuộc vào độ lớn của dữ liệu

đầu vào.• Ngoài ra T còn phụ thuộc vào: Máy Ngôn ngữ Kỹ xảo của người lập trình,…

• Tuy nhiên các yếu tố này là không đồng đềudo vậy không thể dựa vào chúng khi xác lậpthời gian thực hiện giải thuật T(n), với n làkích thước của bài toán.

16

Thời gian thực hiện của thuật toán• Thời gian thực hiện của mỗi lệnh gán, READ, WRITE 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àylà thời gian thi hành một lệnh nào đó lâu nhất trongchuỗi lệnh.

• Thời gian thực hiện cấu trúc IF là thời gian lớn nhất thựchiện lệnh sau THEN hoặc sau ELSE và thời gian kiểmtra đ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 thời gian thực hiệnthân vòng lặp (trên tất cả các lần lặp). Nếu thời gianthực hiện thân vòng lặp không thay đổi thì thời gian thựchiện vòng lặp là tích của số lần lặp với thời gian thựchiện 1 lần thân vòng lặp. 17

Thời gian thực hiện của thuật toánVí dụ: Tính trung bình cộng của một dãy gồm n sốđọc vào từ bàn phím1. Nhập vào số n2. Cho T = 0; d = 13. Lặp While d <= n do

Begin4. Đọc vào số n5. Cộng thêm vào T6. Tăng đếm lên 1End;

7. Tính TBC = T/n;8. Đưa ra TBC

18

Thời gian thực hiện của thuật toánĐánh giá giải thuật:

• T(n) = 4n + 4• T(n) = 4n + 4 =< 5n với mọi n >= 4• => T(n) = O(n)

19

Các lệnh Số lần thực hiện 1 12 13 N4 N5 N6 N7 18 1

Kiểu cấu trúc (struct)• Định nghĩa cấu trúc• Khởi tạo cấu trúc• Truy xuất từng phần tử của cấu trúc• Gán một cấu trúc• Cấu trúc là tham số của hàm• Con trỏ cấu trúc• Mảng cấu trúc• Cấu trúc lồng nhau• Kiểu enum• Kiểu union

20

Khái niệm cấu trúc• Cấu trúc bao gồm một số phần tử dữ liệu,

mà chúng không cùng kiểu, được nhóm lạivới nhau.

• Cấu trúc có thể chứa nhiều phần tử mongmuốn.

• Một item được gọi là một phần tử, thànhphần hay thuộc tính.

21

Khai báo cấu trúcCách 1:struct StructureName{ Type1 Field1;

Type2 Field2;……….

} ;Cách 2:typedef struct{ Type1 Field1;

Type2 Field2;……….

} StructureName;

22

struct SINHVIEN{ char Hoten[15];

char NgaySinh[20];char DiaChi[40];float diem1, diem2, diem3;

};

typedef struct{ char Hoten[15];

char NgaySinh[20];char DiaChi[40];float diem1, diem2, diem3;

} SINHVIEN;

Khai báo và khởi tạo cấu trúc#include <conio.h>#include <stdio.h>struct SINHVIEN{ char Hoten[15], NgaySinh[20], DiaChi[40];

int diem1, diem2, diem3;};void main(){

SINHVIEN sv = {“Nguyen Van A”, “01/01/2001”, “100 HungVuong, Q10, TPHCM”, 8, 9, 10};

printf(“%s %s %s %d %d %d”, sv.Hoten, sv.NgaySinh, sv.DiaChi,sv.diem1, sv.diem2, sv.diem3);

getch();}

23

Truy xuất các phần tử của cấu trúc#include <conio.h>#include <stdio.h>struct SINHVIEN{ char Hoten[15], NgaySinh[20], DiaChi[40];

float diem1, diem2, diem3;};void main(){ SINHVIEN sv;

fflush(stdin);printf(“Nhap ho ten:”); gets(sv.Hoten);printf(“Nhap Ngay sinh(dd/mm/yyyy):”); gets(sv.NgaySinh);printf(“Nhap dia chi: ”); gets(sv.DiaChi);float a;printf(“Nhap diem 1: ”); scanf(“%f”, &a); sv.diem1 = a;printf(“Nhap diem 2: ”); scanf(“%f”, &a); sv.diem2 = a;printf(“Nhap diem 3: ”); scanf(“%f”, &a); sv.diem3 = a;printf(“%s %s %s %f %f %f”, sv.Hoten, sv.NgaySinh, sv.DiaChi, sv.diem1, sv.diem2,sv.diem3);getch();

}

24

Truy xuất các phần tử của cấu trúc

• Các thành phần thuộc tính của mỗi biếnđược truy xuất bằng cách sử dụng toán tửdấu chấm “.” theo cú pháp:<tên biến struct>.<Field>

25

Gán cấu trúc

#include <conio.h>#include <stdio.h>struct SINHVIEN{ char Hoten[15], NgaySinh[20], DiaChi[40];

int diem1, diem2, diem3;};void main(){

SINHVIEN sv = {“Nguyen Van A”, “01/01/2001”, “100 HungVuong, Q10, TPHCM”, 8, 9, 10};

SINHVIEN sv1 = sv;printf(“%s %s %s %d %d %d”, sv1.Hoten, sv1.NgaySinh,

sv1.DiaChi, sv1.diem1, sv1.diem2, sv1.diem3);getch();

}

26

sv “Nguyen…”“01/01/2…”“100 Hu…”

89

10

sv1

“Nguyen…”“01/01/2…”“100 Hu…”

89

10

structure2 = structure1;

Cấu trúc là tham số của hàm• Thông tin về sinh viên gồm có HoTen,

diem1, diem2, diem3. Viết một chươngtrình:• Nhập thông tin 1 sinh viên• Xuất thông tin và điểm trung bình của sinh

viên đó.

27

Danh từ:Student struct STUDENT

{};

STUDENT st;Động từ:- Nhập sv; function- Xuất sv; function

Cấu trúc là tham số của hàm

28

#include <conio.h>#include <stdio.h>struct SINHVIEN{ char Hoten[15];

int diem1, diem2, diem3;};void Nhap (SINHVIEN &sv){ fflush(stdin);

printf("Nhap ho ten: "); gets(sv.Hoten);printf("Nhap diem 1, 2, 3: "); scanf("%d, %d, %d ", &sv.diem1, &sv.diem2, &sv.diem3);

}double TrungBinh (SINHVIEN sv){ return (sv.diem1+sv.diem2+sv.diem3)/3.;}void Xuat (SINHVIEN sv){ printf("%s %d %d %d %.1lf", sv.Hoten, sv.diem1, sv.diem2, sv.diem3, TrungBinh(sv));}void main(){ SINHVIEN sv;

Nhap(sv); Xuat(sv);getch();

}

Con trỏ cấu trúc• Có thể truy xuất cấu trúc bằng cách sử dụng con trỏ mà chỉ

đến cấu trúc đó.• Truy xuất đến phần tử của con trỏ cấu trúc bằng toán tử ->

29

#include <conio.h>#include <stdio.h>#include <string.h>struct SINHVIEN{ char Hoten[15];

int diem1, diem2, diem3;};double TrungBinh (SINHVIEN *sv){ return (sv->diem1+sv->diem2+sv->diem3)/3.0;}void Xuat (SINHVIEN *sv){ printf("%s %d %d %d %.1lf", sv->Hoten, sv->diem1, sv->diem2,

sv->diem3, TrungBinh(sv));}void main (){ clrscr(); SINHVIEN *sv = new SINHVIEN;

strcpy(sv->Hoten, “Nguyen Van A”); sv->diem1=5; sv->diem2=7; sv->diem3=9;Xuat(sv); getch();

}

Mảng cấu trúc

30

#include <conio.h>#include <stdio.h>struct SINHVIEN{ char Hoten[15];

int diem1, diem2, diem3;};void Xuat (SINHVIEN sv){ printf("%-15s %3d %3d %3d ", sv.Hoten, sv.diem1, sv.diem2, sv.diem3);}void main (){ SINHVIEN sv[3] = {{ “Nguyen Van A”, 5, 7, 9},

{ “Tran Thi No”, 7, 9, 10}, { “Bui Van Hien”, 5, 9, 4}};

Xuat(sv[0]); Xuat(sv[1]); Xuat(sv[2]);getch();

}

Cấu trúc lồng nhau• Cấu trúc là một phần tử của cấu trúc khác.• Ví dụ:

31

#include <conio.h>#include <stdio.h>#include <string.h>struct Ngay{

int d, m, y;};struct SINHVIEN{ char Hoten[15];

Ngay Ngaysinh;};void Xuat(SINHVIEN sv){ printf("%-15s %02d/%02d/%d ", sv.Hoten, sv.Ngaysinh.d,

sv.Ngaysinh.m, sv.Ngaysinh.y);}void main(){ SINHVIEN sv;

strcpy(sv.Hoten, "Nguyen Van A");sv.Ngaysinh.d =1; sv.Ngaysinh.m =1; sv.Ngaysinh.y =2001;Xuat(sv); getch();

}

Kiểu enum• Cho phép dùng danh hiệu để đặt tên các giá trị

nguyên một cách gợi nhớ.• Các trị nguyên trong enum được bắt đầu từ 0, trừ khi

xác định rõ trị khác.• Các trị nguyên kế tiếp có giá trị bằng trị nguyên trước

đó cộng thêm 1 đơn vị.• Khai báo:

enum <tên kiểu enum> {Danh sách các trị nguyên};• Ví dụ:

enum Seasons {Spring, Summer, Autumn, Winter};Khi đó, Spring có trị = 0, Summer = 1, Autumn = 2,Winter = 3.

32

Kiểu union• Một biến kiểu union cũng bao gồm nhiều thành phần

giống như một biến cấu trúc.• Các trường thuộc tính trong biến cấu trúc được cấp phát

vùng nhớ khác nhau.• Các trường của biến union được cấp phát chung vùng

nhớ.• Độ dài của biến union bằng độ dài của thành phần dài

nhất trong biến.• Khai báo: Tương tự khai báo struct.• Ví dụ:

typedef union {int n;char ch;

} X;

33

Bài tập1. Định nghĩa cấu trúc phân số. Viết chương trình thực

hiện các phép toán cộng, trừ, nhân, chia 2 phân số, rútgọn phân số, so sánh 2 phân số.

2. Định nghĩa cấu trúc dãy. Thực hiện một số xử lý trêndãy: nhập, xuất dãy, thêm, xóa 1 phần tử, tìm kiếm 1phần tử.

3. Định nghĩa cấu trúc danh sách sinh viên, mỗi sinh viêncó các thông tin: mã SV, họ tên, năm sinh, điểm trungbình. Viết chương trình thực hiện các thao tác:

- Nhập, xuất danh sách sinh viên.- Xuất danh sách sinh viên có ĐTB>=5.- Sắp xếp danh sách sinh viên giảm dần theo điểm.- Tìm kiếm sinh viên theo mã số, theo tên.

34

Bài tập4. Định nghĩa cấu trúc một thời điểm. Viết chương trình

tính thời điểm 1 giây trước, 1 giây sau, khoảng cáchgiữa 2 thời điểm.

5. Định nghĩa cấu trúc ma trận. Viết chương trình thực hiệncác thao tác sau:

- Nhập ma trận.- Xuất ma trận.- Tìm phần tử nhỏ nhất, lớn nhất trong ma trận.- Tính tổng các phần tử trong ma trận.- Tính tổng từng dòng trong ma trận.- Tính tổng, hiệu, tích 2 ma trận.

35

Bài tập6. Định nghĩa cấu trúc ma trận vuông. Viết chương trình thực hiện

các thao tác sau:- Nhập ma trận vuông.- Xuất ma trận vuông.- Tìm phần tử nhỏ nhất, lớn nhất trong ma trận.- Tính tổng các phần tử trong ma trận.- Cho biết dòng nào có tổng lớn nhất, in giá trị tổng.- Tính tổng, hiệu, tích 2 ma trận.7. Thông tin của một máy tính bao gồm: Loại máy, nơi sản xuất,

thời gian bảo hành. Viết chương trình tạo một mảng danh sáchcác máy tính của một cửa hàng, thực hiện các thao tác sau:

- Nhập danh sách máy tính có thông tin như trên.- Thống kê xem có bao nhiêu máy có thời gian bảo hành là 1

năm.- In ra danh sách các máy tính có xuất xứ từ Mỹ.

36