1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài giảng cấu trúc dữ liệu và giải thuật chương 2 ths thiều quang trung

41 54 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 41
Dung lượng 909,14 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đị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ể

Trang 1

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

Trang 2

• Định nghĩa kiểu dữ liệu

Trang 3

Định nghĩa kiểu dữ liệu

• Kiểu dữ liệu T được xác định bởi một bộ

Trang 4

Định nghĩa kiểu dữ liệu

• Ví dụ 1: kiểu dữ liệu mẫu tự = Vc,Oc với

Trang 5

Đị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

Trang 6

• 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

Các kiểu dữ liệu cơ bản

Trang 7

• 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ơ

Trang 8

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 Có thể gọi tắt là

unsign long 4 byte - 2.147.483.648 đến

2.147.483.647 unsign long 4 byte 0 đến 4.2 tỷ

Các kiểu dữ liệu cơ bản trong C

Trang 9

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

Trang 10

• 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

Các kiểu dữ liệu có cấu trúc

Trang 11

• Để 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 ;

Các kiểu dữ liệu có cấu trúc

Trang 12

• 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 ;

Các kiểu dữ liệu có cấu trúc

Trang 13

• 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

Các kiểu dữ liệu có cấu trúc

Trang 14

• 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

Kiểu chuỗi ký tự

Trang 15

• 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 S10 ;

– 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

Trang 16

• 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 :

Kiểu chuỗi ký tự

Trang 17

• 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ử>];

Kiểu mảng

Trang 19

• Mảng 2 chiều được khai báo như sau :

<Kiểu dữ liệu><Tên biến>

Trang 20

• 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>; …Kiểu mẫu tin/bản ghi

Trang 21

• 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 Ttgd; // 0 : Ko có gia đình, 1 : Có gia đình

Kiểu mẫu tin/bản ghi

Trang 22

Nhu cầu tìm kiếm dữ liệu

Trang 23

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ư

Trang 24

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ụ

Trang 25

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)

Trang 26

▪ Ý tưởng :

Thuật toán tiến hành so sánh khóa cần tìm

là X với lần lượt các phần tử thứ nhất, thứ

hai, … của mảng A cho đến khi gặp được

phần tử chứa khóa, hoặc đã tìm hết mảng

mà không thấy X

Tìm kiếm tuyến tính

Trang 27

Tìm kiếm tuyến tính

▪ Giải thuật vét cạn (Exhaustive):

Bước 1 : i = 0; //bắt đầu phần tử đầu tiên của dãy

Bước 2 : So sánh a[i] với X, có 2 khả năng :

a[i] = X : Tìm thấy => Dừng a[i]  X : Sang bước 3.

Bước 3 : i = i+1 ; //xét tiếp phần tử kế trong mảng

Nếu i >= N : Hết mảng, không tìm thấy => Dừng Ngược lại : Lặp lại Bước 2.

Trang 30

Cài đặt giải thuật, cách 1:

int LinearSearch(int a[], int n, int x)

{

int i=0;

while(i<n && a[i]!=x) i++;

if (i<n)return i; //a[i] là phần tử có khoá x

Tìm kiếm tuyến tính

Trang 31

Cài đặt giải thuật, cách 2:

int LinearSearch (int a[], int n, int x)

Trang 32

Tìm kiếm tuyến tính

Nhận xét:

• Trường hợp khóa X nằm ở 2 biên của mảng A

=> rất hiếm khi xuất hiện

• Số phép so sánh trung bình = 2(1+2+ … + n)/n

= n+1

=> Số phép so sánh tăng/giảm tuyến tính

theo số phần tử

Trang 33

Ý tưởng:

• Đối với những dãy số đã có thứ tự thì các

phần tử trong dãy có quan hệ:

a i-1  a i  a i+1

– Nếu X > a i thì X chỉ có thể xuất hiện trong đoạn

[a i+1 , a N ]

– Ngược lại, X chỉ có thể xuất hiện trong đoạn

[a 1 , a i-1 ] của dãy

Tìm kiếm nhị phân

Trang 34

Tìm kiếm nhị phân

• Ý tưởng của giải thuật tìm nhị phân là tìm

các giới hạn phạm vi của dãy sau mỗi lần so sánh X với một phần tử trong dãy:

– Tại mỗi bước tiến hành so sánh X với phần tử

nằm ở vị trí giữa của dãy;

– Dựa vào kết quả so sánh này để quyết định giới hạn dãy tìm kiếm ở bước kế tiếp là nửa trên

hay nửa dưới của dãy.

Trang 36

Ví dụ: Cho dãy số a gồm 8 phần tử, nếu giá trị cần tìm là 8, giải thuật được tiến hành như sau :

Trang 37

Tìm kiếm nhị phân

Cài đặt:

int BinarySearch(int a[],int n,int x )

{

int left = 0, right = n-1, mid;

while (left <= right)

{

mid = (left + right)/2;

if (x == a[mid]) return mid;

if (x<a[mid]) right = mid -1;

else left = mid +1;

}

Trang 38

Tìm kiếm nhị phân

Nhận xét :

• Mỗi lần lặp thì chiều dài của mảng con giảm

khoảng ½ so với mảng trước đó.

Trang 40

Tìm kiếm nhị phân

So sánh trường hợp xấu nhất của 2 thuật toán

Ngày đăng: 07/02/2020, 18:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm