1. Trang chủ
  2. » Công Nghệ Thông Tin

SLIDE: CẤU TRÚC DỮ LIỆU

228 1,5K 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 228
Dung lượng 1,41 MB

Nội dung

Slide bài giảng: CẤU TRÚC DỮ LIỆU có 5 chương: Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT. Chương 2: KỸ THUẬT TÌM KIẾM (SEARCHING). Chương 3: KỸ THUẬT SẮP XẾP. Chương 4: DANH SÁCH (LIST). Chương 5: CÂY (TRE

Trang 1

MÔN: CẤU TRÚC DỮ LIỆU

BÀI GIẢNG

Trang 2

Chương 1:

TỔNG QUAN VỀ CẤU TRÚC

DỮ LIỆU VÀ GIẢI THUẬT

Trang 3

NỘI DUNG CHƯƠNG 1

1.1 Tầm quan trọng của cấu trúc dữ liệu trong một đề án tin học.

1.2 Các tiêu chuẩn đánh giá cấu trúc dữ liệu.

1.3 Các kiểu dữ liệu

Khái niệm kiểu dữ liệu

Các kiểu dữ liệu cơ sở

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

Kiểu dữ liệu con trỏ

Kiểu tập tin

Trang 4

1.1 Tầm quan trọng của CTDL & giải

thuật •Thực hiện một đề á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 dữ liệu và các yêu cầu xử lý trên dữ liệu đó để xây dựng một mô hình tin học phản ánh được bài toán thực tế cần chú trọng đến hai vấn đề:

Tổ chức biểu diễn các đối tượng thực tế: Mô hình tin học của bài toán, cần phải tổ chức sao cho

xây dựng cấu trúc dữ liệu.

Xây dựng các thao tác xử lý dữ liệu : Từ những yêu cầu 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à bước xây dựng giải thuật cho bài toán.

Trang 5

1.1 Tầm quan trọng của CTDL & giải thuật

* Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Cấu trúc dữ liệu + Giải thuật = Chương trình

Khi có cấu trúc dữ liệu tốt và giải thuật phù hợp thì xây dựng chương trình chỉ phụ thuộc thời gian.

Một chương trình máy tính chỉ hoàn thiện khi có đầy đủ cấu trúc dữ liệu và giải thuật.

Trang 6

1.2 Các tiêu chuẩn đánh giá CTDL

Một cấu trúc dữ liệu tốt phải thỏa mãn:

Phản ánh đúng thực tế: 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 sống để có thể chọn CTDL lưu trữ thể hiện chính xác đối tượng thực tế.

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ớ.

Trang 7

1.2 Các tiêu chuẩn đánh giá CTDL

Đánh giá độ phức tạp của thuật toán

Là công việc ước lượng thời gian thực hiện của thuật toán để so sánh tương đối các thuật toán với nhau

Trong thực tế, thời gian thực hiện còn phụ thuộc cấu hình máy, dữ liệu đưa vào, …

Để ước lượng thời gian thực hiện thuật toán xem xét 2 trường hợp

Với Tmin và Tmax thời gian thực hiện trung bình của thuật toán Tavg

Trang 8

1.3 Các kiểu dữ liệu

Máy tính chỉ có thể lưu trữ dữ liệu ở dạng nhị phân

Nếu muốn phản ánh được dữ liệu đa dạng, thì 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 nhị phân thô sơ.

Nhằm đưa ra những khái niệm logic về hình thức lưu trữ khác nhau đựoc gọi là kiêu dữ liệu

Trang 9

1.3 Các kiểu dữ liệu

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

Ví dụ : Giả sử có 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ự, đổi ký tự thành ký tự hoa}

Dữ liệu lưu trữ chiếm số bytes trong bộ nhớ gọi là kích thước của kiểu dữ liệu

Trang 10

1.3 Các kiểu dữ liệu

Các thuộc tính của một kiểu dữ liệu

Tên kiểu dữ liệu

Miền giá trị của dữ liệu

Kích thước dữ liệu

Tập các toán tử tác động lên kiểu dữ liệu

Trang 12

1.3 Các kiểu dữ liệu

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

Kiểu chuỗi ký tự: là 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 dịnh nghĩa nó như một kiểu

cơ bản

Trong C các hàm xử lý chuỗi được đặt trong thư viện string.lib.

VD: char S[10] ;// chuỗi ký tự S có chiều dài tối đa là 10 (kể cả ký tự kết thúc)

char S[] = ”ABCDEF” ;

char *S = “ABCDEF”;

Trang 13

1.3 Các kiểu dữ liệu

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

Kiểu 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ớ.

Trang 14

1.3 Các kiểu dữ liệu

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

Kiểu mẫu tin: Kiểu mẫu tin cũng tương tự như mảng nhưng 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 thường được dùng để mô tả những đối tượng có cấu trúc phức tạp.

Trang 15

1.3 Các kiểu dữ liệu

Kiểu dữ liệu con trỏ

Cho trước kiểu T = <V,O> Kiểu con trỏ ký hiệu Tp chỉ đến các phần tử có kiểu T được định nghĩa như sau:

Tp = <Vp, Op> Trong đó:

Tp = {{các địa chỉ có thể lưu trữ những đối tượng kiểu T}, NULL}

Op = {các thao tác định địa chỉ của một đối tượng kiểu T khi biết con trỏ chỉ đến đối tượng đó}

Kiểu con trỏ là kiểu dữ liệu cơ sở dùng lưu địa chỉ của một đối tượng dữ liệu khác.

Biến thuộc kiểu con trỏ Tp là biến mà giá trị của nó là địa chỉ của một vùng nhớ ứng với một biến kiểu T, hoặc là giá trị NULL

Trang 16

1.3 Các kiểu dữ liệu

Kiểu dữ liệu con trỏ (tt)

Kích thước biến con trỏ tùy thuộc vào quy ước số byte trong từng mô hình bộ nhớ và từng ngôn ngữ lập trình cụ thể.

Biến con trỏ trong C++ có kích thước 2 hoặc 4 bytes tùy vào con trỏ NEAR hay FAR

Cú pháp định nghĩa dữ liệu kiểu con trỏ

typedef <kiểu cơ sở> * <kiểu con trỏ>;

Các thao tác cơ bản trên kiểu con trỏ:

Khi một biến con trỏ ‘p’ lưu trữ địa chỉ của đối tượng x ta nói “p trỏ đến x”

Gán địa chỉ của một vùng nhớ con trỏ p:

p = <địa chỉ>;

p = <địa chỉ> + <giá trị nguyên>

Truy xuất (xem) nội dung của đối tượng p trỏ đến (*p)

Trang 17

1.3 Các kiểu dữ liệu

Kiểu dữ liệu tập tin

Tập tin là kiểu dữ liệu đặc biệt, kích thước tối đa của tập tin phụ thuộc không gian đĩa

Việc đọc, ghi dữ liệu trên tập tin là mất thời gian, không an toàn dữ liệu

Thông thường chuyển dữ liệu trong tập tin (một phần hay toàn bộ) vào bộ nhớ trong để xử lý.

Trang 18

Bài tập

Xem lại việc sử dụng con trỏ trong C++

Xem lại các thao tác với tập tin

Xem lai việc sử dụng kiểu dữ liệu mẫu tin

Bài tập trong giáo trình chương 1

Trang 19

KỸ THUẬT TÌM KIẾM

(SEARCHING)

Trang 20

NỘI DUNG CHƯƠNG 2

2.1 Khái quát về tìm kiếm

2.2 Các giải thuật tìm kiếm nội (Tìm kiếm trên mảng)

Tìm tuyến tính (Linear Search)

Tìm nhị phân (Binary Search)

2.3 Các giải thuật tìm kiếm ngoại (Tìm kiếm trên tập tin)

Tìm tuyến tính (F Linear Search)

Tìm nhị phân (Binary Search)

Trang 21

2.1 Khái quát về tìm kiếm

Trong các hệ lưu trữ và quản lý dữ liệu, thao tác tìm kiếm được thực hiện nhiều nhất để khai thác thông tin một các dễ dàng.

Số lượng thông tin trong một hệ thống thông tin là đáng kể nên việc xây dựng các giải thuật tìm kiếm nhanh sẽ có ý nghĩa quan trọng

Nếu tìm kiếm trong một hệ thống đã tổ chức thì việc tìm kiếm dễ dàng hơn.

Các giải thuật tìm kiếm được xây dựng nhằm mục tiêu hỗ trợ ứng dụng có hiệu quả hơn

Các giải thuật phụ thuộc vào vào cấu trúc dữ liệu mà nó tác động đến Dữ liệu được lưu trữ trên bộ nhớ chính và bộ nhớ phụ.

Trang 22

2.1 Khái quát về tìm kiếm

Giả sử mỗi phần tử được xem xét có một thành phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành phần còn lại là thông tin (Info), như vậy mỗi phần tử có cấu trúc như sau:

typedef struct DataElement

Trang 23

2.2 Các giải thuật tìm kiếm nội

Bài toán đặt ra: Giả sử có một mảng M gồm N phần tử Cần xác định có hay không phần tử có giá trị bằng X trong mảng M?? Nếu có phần tử X thì phần tử bằng phần tử X là phần tử thứ mấy trong mảng X?

Các giải thuật tìm kiếm nội đưa ra 2 cách tìm kiếm

Tìm kiếm tuần tự hay (Sequential Search) còn gọi tìm kiếm tuyến tính (Linear Search)

Tìm kiếm nhị phân (Binary Search)

Trang 24

2.2 Các giải thuật tìm kiếm nội

Tìm tuyến tính (Linear Seach)

Ngược lại: Lặp lại B2

B3: Nếu k <= N Thì Tìm thấy phần tử có giá trịX ở vị trí k

B4: Nếu không (k<=N): Thì không tìm thấy phần tử có giá trị X

B5: Kết thúc

Trang 25

2.2 Các giải thuật tìm kiếm nội

Tìm tuyến tính (tt)

Cài đặt thuật toán:

int LinearSearch (T M[], int N, T X)

Trang 26

2.2 Các giải thuật tìm kiếm nội

Tìm tuyến tính (tt)

Phân tích, đánh giá thuật toán:

Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)

Trang 27

2.2 Các giải thuật tìm kiếm nội

Tìm tuyến tính (tt)

Cải tiến thuật toán:

Mỗi bước lặp với thuật toán trên cần thực hiện 2 phép so sánh ý tưởng giảm bớt phép so sánh bằng cách thêm vào mảng một phần tử cầm canh (sentinel/stand by) có giá trị bằng X để nhận diện ra sự hết mảng khi duyệt.

B1: k = 1

B2: M[N+1] = X

B3: Nếu M[k] X

Thì k++

Ngược lại: Lặp lại B3

B4: Nếu k < N Thì Tìm thấy phần tử có giá trịX ở vị trí k

B5: Nguợc lại: Thì không tìm thấy phần tử có giá trị X

B6: Kết thúc

Trang 28

2.2 Các giải thuật tìm kiếm nội

Tìm tuyến tính (tt)

Cài đặt thuật toán cải tiến:

int LinearSearchCaiTien (T M[], int N, T X)

Trang 29

2.2 Các giải thuật tìm kiếm nội (tt)

Tìm tuyến tính (tt)

Phân tích, đánh giá thuật toán cải tiến:

Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)

Trang 30

2.2 Các giải thuật tìm kiếm nội

Ví dụ: Tìm tuyến tính

Trang 31

2.2 Các giải thuật tìm kiếm nội

Tìm nhị phân (Binary Seach)

Tìm nhị phân đơn giản và thuận tiện trong trường hợp số phần tử của chuỗi lớn có thứ tự (tăng hay giảm dần) có nghĩa là phần tử trước nhỏ (lớn) hơn phần tử sau.

Nếu trường hợp X nhỏ hơn phần tử đứng giữa thì X chỉ có thể tìm trong nửa đầu của dãy, ngược lại tìm trong nửa sau của dãy.

Ý tưởng:

Phạm vi tìm kiếm là từ phần tử đầu tiên của dãy (First = 1) cho đến phần tử cuối cùng (Last = N)

So sánh giá trị X với giá trị phần tử ở giữa của dãy M là M[Mid]

Nếu X = M[Mid] Tìm thấy

Nếu X < M[Mid] rút ngắn phạm vi tìm kiếm và Last = Mid –1

Nếu X > M[Mid] rút ngắn phạm vi tìm kiếm và First = Mid +1

Lặp lại quá trình cho đến khi tìm thấy phần tử có giá trị = X

Trang 32

2.2 Các giải thuật tìm kiếm nội

B5: Nếu (X = M[Mid])

Tìm thấy tại vị trí Mid Ngược lại: Thực hiện B6 B6: Nếu (X<M[Mid]) Tìm đệ quy từ First đến Last = Mid -1

B7: Nếu (X>M[Mid]) Tìm đệ quy từ First = Mid +1 đến Last

B8: Kết thúc

Trang 33

2.2 Các giải thuật tìm kiếm nội

Tìm nhị phân (tt)

Cài đặt Thuật toán đệ quy (Recursion Algorithm)

int RecursiveBinarySearch (T M[], int First, int Last, T X)

{ if (First > Last) return (-1);

int Mid = (First + Last)/2;

Trang 34

2.2 Các giải thuật tìm kiếm nội

Tìm nhị phân (tt)

Phân tích, đánh giá thuật toán đệ quy:

Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)

Trang 35

2.2 Các giải thuật tìm kiếm nội

B5: Nếu (X = M[Mid])

Tìm thấy tại vị trí Mid Ngược lại: Thực hiện B6 B6: Nếu (X<M[Mid])

Last = Mid –1 và Lặp lại B3 B7: Nếu (X>M[Mid]) First = Mid + 1 và lặp lại B3

B8: Kết thúc

Trang 36

2.2 Các giải thuật tìm kiếm nội

Tìm nhị phân (tt)

Cài đặt Thuật toán không đệ quy (Non-Recursion Algorithm)

int NRBinarySearch (T M[], int N, T X)

{ int First = 0;

int Last = N-1;

while (First <= Last)

{ int Mid = (First + Last)/2;

if (X == M[Mid]) return Mid;

if (X < M[Mid])

Last = Mid –1 ; else

First = Mid + 1;

}

return (-1);

}

Trang 37

2.2 Các giải thuật tìm kiếm nội

Tìm nhị phân (tt)

Phân tích, đánh giá thuật toán không đệ quy:

Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)

Trang 38

2.3 Các giải thuật tìm kiếm ngoại

Các giải thuật tìm kiếm ngoại là giải thuật tìm kiếm trên tập tin lưu trữ trên đĩa.

Giả sử có tập tin F lưu trữ N phần tử Tìm xem có hay không phần tử có giá trị X được lưu trong F Nếu có phần tử có giá trị

X nằm ở vị trí nào trong tập tin F?

Xét 2 giải thuật tìm kiếm ngoại:

Trang 39

2.3 Các giải thuật tìm kiếm ngoại

Tìm tuyến tính Với Ý tưởng: Lần lượt đọc các phần trong tập tin X và so sánh với giá trị X

Thuật toán:

B1: k = 0

B2: Trở về đầu tập tin (rewind(F))

B3: Đọc 1 phần tử trong tập tin (read(F, a))

B4: k = k + sizeof(T)

B5: Kiểm tra Nếu a ≠ X và chưa hết tập tin (!eof(F))

Lặp lại B3 B6: IF Nếu a = X

Tìm thấy phần tử có giá trị X tại vị trí k bytes tính từ đầu F B7: ELSE

Không tìm thấy phần tử có giá trị X trong tập tin F

B8: Kết thúc

Trang 40

2.3 Các giải thuật tìm kiếm ngoại

Tìm tuyến tính (tt) Cài đặt Thuật toán:

long FLinearSearch (char * FileName, T X)

{ FILE * Fp;

Fp = fopen(FileName, “rb”);

if (Fp == NULL) return (-1);

long k = 0; T a; int SOT = sizeof(T);

while (!feof(Fp)) { if (fread(&a, SOT, 1, Fp) == 0) break;

k = k+ SOT;

if (a == X) break;

} fclose (Fp);

if (a == X) return (k - SOT);

return (-1);

}

Trang 41

2.3 Các giải thuật tìm kiếm ngoại

Tìm tuyến tính (tt) Phân tích Thuật toán:

Trường hợp tốt nhất (phần tử đầu tiên trong tập tin có giá trị = X)

Trang 42

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (Index Search)

Vì lý do kích thước tập tin có thể lớn (có thể do các phần tử chứa trong tập tin lớn) Thao tác đọc tập tin trên dữ liệu là lâu & không bảo đảm an toàn dữ liệu.

Để giúp an toàn dữ liệu, một tập tin thường được đi kèm theo tập tin chỉ mục (Index File) làm nhiệm vụ điều khiển thứ tự truy xuất

dữ liệu trên tập tin theo một khóa chỉ mục (Index Key).

Tập tin chỉ mục sẽ chứa các phần tử gồm 2 thành phần tương ứng với cấu trúc DL:

typedef struct IdxElement

Trang 43

2.3 Các giải thuật tìm kiếm ngoại

Trang 44

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt)

Thuật toán

B1: Trở về đầu tập tin chỉ mục IDX(rewind(IDX))

B2: Đọc 1 phần tử trong tập tin (read(IDX, ai))

B3: Kiểm tra Nếu ai.IdxKey < X và chưa hết tập tin (!eof(IDX))

Trang 45

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt)

Cài đặt Thuật toán:

long IndexSearch (char * IdxFileName, T X)

{ FILE * IDXFp;

IDXFp = fopen(IdxFileName, “rb”);

if (IDXFp == NULL) return (-1);

IdxType ai; int SOIE = sizeof(IdxType);

while (!feof(IDXFp)) { if (fread(&ai, SOIE, 1, IDXFp) == 0)

break;

if (ai >= X) break;

} fclose (IDXFp);

if (ai.IdxKey == X) return (ai.Pos);

return (-1);

}

Trang 46

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt) Phân tích Thuật toán:

Trường hợp tốt nhất (phần tử đầu tiên trong tập tin chỉ mục có giá trị = X)

Trang 47

Bài tập

Cài đặt các thuật toán trong lý thuyết

Bài tập trong giáo trình chương 2

Bài tập thực hành tuần 2, 3

Trang 48

KỸ THUẬT SẮP XẾP

Trang 49

NỘI DUNG CHƯƠNG 3

1. Khái quát về sắp xếp

2. Các phương pháp sắp xếp (Sắp xếp trên dãy)

Sắp xếp bằng phương pháp đổi chỗ (Exchange)

Trang 50

1 Khái quát về sắp xếp

Sắp xếp là thao tác cần thiết thường được thực hiện trong quá trình lưu trữ và quản lý dữ liệu.

Thứ tự dữ liệu có thể tăng hay giảm, tăng hay giảm thuật toán sắp xếp là tương tự.

Hai nhóm giải thuật sắp xếp

Các giải thuật sắp xếp thứ tự nội (sx thứ tự trên mảng)

Các giải thuật sắp xếp thứ tự ngoại (sx thứ tự trên tập tin)

Xem như mỗi phần tử dữ liệu được xem xét có một thành phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành phần

còn lại là thông tin (Info), như vậy mỗi phần tử có cấu trúc như sau:

typedef struct DataElement

Trang 51

2 Sắp xếp trên dãy/mảng

2.1 Sắp xếp bằng phương pháp đổi chỗ (Exchange)

a Thuật toán sắp xếp nổi bọt (Bubble Sort)

b Thuật toán sắp xếp dựa trên phân hoạch (Partitioning Sort) (thuật toán sx nhanh Quick Sort)

2.2 Sắp xếp bằng phương pháp chọn (Selection Sort)

Chọn trực tiếp (Straight Selection Sort)

2.3 Sắp xếp bằng phương pháp chèn (Insertion Sort)

Chèn trực tiếp (Straight Insertion Sort)

2.4 Sắp xếp bằng phương pháp trộn (Merge Sort)

a Trộn trực tiếp (Straight Merge Sort)

b Trộn tự nhiên (Natural Merge Sort)

Trang 52

2 Sắp xếp trên dãy/mảng

2.1 a Thuật toán sắp xếp nổi bọt (Bubble Sort)

Ý tưởng:

Đi từ cuối mảng đến đầu mảng, nếu phần tử ở dưới < phần tử đứng trên nó thì sẽ được “đưa lên trên”.

Sau mỗi lần đi duyệt dãy, 1 phần tử sẽ được đưa lên đúng chỗ của nó Đối với mảng M có N phần tử thì sau N-1 lần đi

duyệt dãy dãy M có thứ tự tăng.

Ngày đăng: 09/04/2015, 20:39

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w