CHƯƠNG 2
CÁC KIỂU DỮ LIỆU VÀ GIẢI THUẬT TÌM KIẾM
GV Th.S. Thiều Quang Trung
Trường Cao đẳng Kinh tế Đối ngoại
Nội dung
1
2
3
4
5
6
• Định nghĩa kiểu dữ liệu
• Các kiểu dữ liệu cơ bản
• Các kiểu dữ liệu có cấu trúc
• Nhu cầu tìm kiếm dữ liệu
• Giải thuật tìm tuyến tính
• Giải thuật tìm nhị phân
GV Thiều Quang Trung
2
Định nghĩa kiểu dữ liệu
• Kiểu dữ liệu T được xác định bởi một bộ
V,O, với :
– V : tập các giá trị hợp lệ mà một đố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.
GV Thiều Quang Trung
3
Định nghĩa kiểu dữ liệu
• Ví dụ 1: kiểu dữ liệu mẫu tự = Vc,Oc với
– Vc = a-z, A-Z
– Oc= lấy mã ASCII của ký tự, biến đổi ký tự
thường thành ký tự hoa …
• Ví dụ 2: kiểu dữ liệu số nguyên = Vi,Oi với
– Vi = -32768 .. 32767
– Oi = +, -, *, /, %
GV Thiều Quang Trung
4
Định nghĩa kiểu dữ liệu
• Các thuộc tính của một kiểu dữ liệu bao
gồm:
– 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
• Có hai loại kiểu dữ liệu:
– Kiểu dữ liệu cơ bản
– Kiểu dữ liệu có cấu trúc
GV Thiều Quang Trung
5
Các kiểu dữ liệu cơ bản
• Các kiểu dữ liệu cơ bản là các loại dữ liệu đơn
giản không có cấu trúc
• Là các giá trị vô hướng như các số nguyên, số
thực, các ký tự, các giá trị logic …
• Được các ngôn ngữ lập trình cấp cao xây
dựng sẵn như một thành phần của ngôn ngữ
để giảm nhẹ công việc cho người lập trình. Vì
vậy còn gọi là các kiểu dữ liệu định sẵn
GV Thiều Quang Trung
6
Các kiểu dữ liệu cơ bản
• Các kiểu dữ liệu cơ bản bao gồm:
– Kiểu có thứ tự rời rạc: số nguyên, ký tự, logic,
liệt kê, miền con …
– Kiểu không rời rạc: số thực.
• Tùy ngôn ngữ lập trình các kiểu dữ liệu cơ
bản có thể khác nhau
• Kiểu dữ liệu cơ bản trong ngôn ngữ C gồm: số
nguyên, số thực, ký tự, logic
GV Thiều Quang Trung
7
Các kiểu dữ liệu cơ bản trong C
Tên kiểu
K thước
Miền giá trị
Ghi chú
char
1 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
1 byte
0 đến 255
Số nguyên 1 byte
không dấu
int
2 byte
-32738 đến 32767
unsign int
2 byte
0 đến 65335
long
4 byte
- 2.147.483.648 đến
2.147.483.647
unsign long
4 byte
0 đến 4.2 tỷ
float
4 byte
6 số chính xác
double
8 byte
10 số chính xác
long double
10 byte
10 số chính xác
GV Thiều Quang Trung
Có thể gọi tắt là
unsign
Sử dụng số double
chính xác hơn float
8
Các kiểu dữ liệu cơ bản trong C
• Kiểu ký tự “char” có thể dùng theo 2 cách:
– số nguyên 1 byte, hoặc
– ký tự
• Không định nghĩa kiểu logic (boolean), thay thế
bằng:
– Giá trị số nguyên bằng 0 là FALSE
– Giá trị số nguyên khác 0 là TRUE
GV Thiều Quang Trung
9
Các kiểu dữ liệu có cấu trúc
• Kiểu dữ liệu có cấu trúc là kiểu dữ liệu được xây dựng
dựa trên các thành phần của kiểu dữ liệu cơ bản
• Một số kiểu có cấu trúc cơ bản như mảng, chuỗi, …
• Ví dụ: Để mô tả một đối tượng sinh viên thì cần định
nghĩa các thông tin sau :
– Mã sinh viên :
chuỗi ký tự
– Tên sinh viên :
chuỗi ký tự
– Ngày sinh
:
kiểu ngày tháng
– Nơi sinh
:
chuỗi ký tự
– Điểm thi
:
số nguyên
GV Thiều Quang Trung
10
Các kiểu dữ liệu có cấu trúc
• Để thể hiện thông tin về ngày tháng năm sinh cần
phải xây dựng một kiểu bản ghi :
typedef struct
tagDate
char ngay ;
char thang ;
char nam ;
Date ;
GV Thiều Quang Trung
11
Các kiểu dữ liệu có cấu trúc
• Kiểu dữ liệu thể hiện thông tin một sinh viên được
xây dựng như sau:
typedef struct
tagSinhVien
char masv[15] ;
char tensv[15] ;
char noisinh[15] ;
Date namsinh;
int Diemthi ;
SinhVien ;
GV Thiều Quang Trung
12
Các kiểu dữ liệu có cấu trúc
• Giả sử đã có cấu trúc phù hợp để lưu trữ
một sinh viên, nhưng thực tế lại cần quản lý
nhiều sinh viên, lúc đó nảy sinh nhu cầu xây
dựng kiểu dữ liệu mới…
• Mục tiêu của việc nghiên cứu cấu trúc dữ
liệu chính là tìm những phương cách thích
hợp để tổ chức, liên kết dữ liệu, hình thành
các kiểu dữ liệu có cấu trúc từ những kiểu dữ
liệu đã được định nghĩa.
GV Thiều Quang Trung
13
Kiểu chuỗi ký tự
• Chuỗi ký tự là một trong các kiểu dữ liệu có cấu trúc
đơn giản nhất, được các ngôn ngữ lập trình định nghĩa
như một kiểu cơ bản
• Đượ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)
• Giới hạn chiều dài của một chuỗi ký tự trong C tối đa
65335 ký tự, ký tự đầu được đánh số là ký tự thứ 0
GV Thiều Quang Trung
14
Kiểu chuỗi ký tự
• Ta có thể khai báo một chuỗi ký tự theo một số cách
sau đây :
– Khai báo một chuỗi ký tự S có chiều dài tối đa 10
ký tự
char S10 ;
– Khai báo một chuỗi ký tự S có chiều dài bằng
chiều dài của chuỗi “ABC” và giá trị khởi đầu của S
là “ABC”
char S = “ABC”;
– Cách khai báo khác
char *S = “ABC”;
GV Thiều Quang Trung
15
Kiểu chuỗi ký tự
• Các thao tác trên chuỗi ký tự rất đa dạng và phong
phú được cài đặt trong thư viện string.lib của C
• Một số thao tác thông dụng :
–
–
–
–
–
–
–
–
–
strcmp
strcpy
strstr
strtok
itoa
atoi,atof, …
sprintf
gets
puts
: So sánh 2 chuỗi
: Sao chép 2 chuỗi
: Kiểm tra một chuỗi có nằm trong chuỗi kia
: Cắt 1 từ ra khỏi 1 chuỗi
: Đổi 1 số ra chuỗi
: Đổi 1 chuỗi ra số
: Đổi 1 hay 1 số giá trị ra chuỗi
: Nhập 1 chuỗi
: Xuất 1 chuỗi
GV Thiều Quang Trung
16
Kiểu mảng
• Mảng là kiểu dữ liệu trong đó mỗi phần tử của nó là
một tập hợp có thứ tự các giá trị có cùng cấu trúc
được lưu trữ liên tiếp nhau trong bộ nhớ.
• Có hai dạng: mảng một chiều và mảng nhiều chiều.
• Một dãy số chính là hình tượng của mảng một chiều,
ma trận là hình tượng của mảng 2 chiều.
• Mảng 2 chiều có thể coi là là mảng một chiều trong đó
mỗi phần tử của nó là 1 mảng một chiều.
• Mảng 1 chiều được khai báo như sau :
<Kiểu dữ liệu> <Tên biến>[<Số phần tử>];
GV Thiều Quang Trung
17
Kiểu mảng
• Ví dụ mảng một chiều:
– Khai báo một mảng số nguyên có tối đa 100 phần
tử:
int
a [100];
– Khai báo và gán giá trị ban đầu cho một mảng gồm
4 phần tử:
int
a [4] = 1,7,-3,819 ;
– Cách khai báo khác:
int
a [] = 1,7,-3,819 ;
GV Thiều Quang Trung
18
Kiểu mảng
• Mảng 2 chiều được khai báo như sau :
<Kiểu dữ liệu><Tên biến>
[<Số phần tử1>][<Số phần tử2>];
• Ví dụ :
– Khai báo mảng số nguyên có kích thước 3x5 :
int
a [3][5];
– Khai báo và gán giá trị ban đầu cho mảng 2 chiều :
int
a [][] = 1,7,-3,8,19,
4,5, 2,8,9,
21,7,45,-1,4;
GV Thiều Quang Trung
19
Kiểu mẫu tin/bản ghi
• Mẫu tin là kiểu dữ liệu mà trong đó mỗi phần
tử của nó là tập hợp các giá trị có thể khác cấu
trúc.
• Kiểu mẫu tin cho phép mô tả các đối tượng có
cấu trúc phức tạp.
• Khai báo tổng quát của kiểu struct như sau :
typedef struct
<tên kiểu struct>
<kiểu dữ liệu> <tên trường>;
<kiểu dữ liệu> <tên trường>; …
[<Name>] ;
GV Thiều Quang Trung
20
20
Kiểu mẫu tin/bản ghi
• Ví dụ: khai báo kiểu dữ liệu mô tả các thông tin về
một con người
typedef struct tagNguoi
char HoTen [35];
int NamSinh;
char NoiSinh[40];
char GioiTinh; // 0 : Nữ, 1 : Nam
char DiaChi [50];
char Ttgd; // 0 : Ko có gia đình, 1 : Có gia đình
Nguoi ;
GV Thiều Quang Trung
21
Nhu cầu tìm kiếm dữ liệu
GV Thiều Quang Trung
22
Nhu cầu tìm kiếm dữ liệu
• Trong các hệ lưu trữ, quản lý dữ liệu, thao tác
tìm kiếm thường được thực hiện nhiều nhất
• Ví dụ: tra cứu từ điển, tìm sách trong thư
viện, …
• Do hệ thống thông tin lưu trữ khối lượng dữ
liệu lớn => xây dựng phép toán tìm kiếm
nhanh có ý nghĩa rất quan trọng
GV Thiều Quang Trung
23
Nhu cầu tìm kiếm dữ liệu
• Nếu dữ liệu trong hệ thống đã được sắp xếp
=> việc tìm kiếm sẽ thực hiện nhanh hơn
• Ví dụ: các từ trong từ điển đã được sắp xếp
theo vần, …
• Xây dựng một hệ quản lý thông tin: cần quan
tâm giải thuật tìm kiếm và cả giải thuật sắp
xếp dữ liệu
• Mức độ hiệu quả của từng giải thuật phụ
thuộc vào tính chất của cấu trúc dữ liệu
GV Thiều Quang Trung
24
Nhu cầu tìm kiếm dữ liệu
• Để đánh giá thời gian thực hiện dựa vào 2 đại
lượng đặc trưng:
– Số lần so sánh
– Số phép gán
• Hai giải thuật tìm kiếm dữ liệu:
– Tìm Tuyến tính/Tuần tự (Linear/Sequential
Search)
– Tìm Nhị phân (Binary Search)
GV Thiều Quang Trung
25