1. Trang chủ
  2. » Tất cả

Cấu trúc dữ liệu và giải thuật

70 5 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

Tiêu đề Cấu trúc dữ liệu và giải thuật
Tác giả Đỗ Xuân Lôi, Đỗ Thị Mơ
Người hướng dẫn P. PTS. Nguyễn Văn A
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Khoa Học Máy Tính
Thể loại Sách giáo trình
Năm xuất bản N/A
Thành phố Hà Nội
Định dạng
Số trang 70
Dung lượng 711 KB

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

Nội dung

Slide 1 Cấu trúc dữ liệu và giải thuật SỐ TIẾT 60 (45 LÝ THUYẾT + 15 BÀI TẬP) 1 Sách, giáo trình chính Cấu trúc dữ liệu và giải thuật Đỗ Xuân Lôi NXB Khoa học kỹ thuật Bài giảng Cấu trúc dữ liệu v[.]

Trang 1

Cấu trúc dữ liệu và giải thuật

SỐ TIẾT: 60 (45 LÝ THUYẾT + 15 BÀI TẬP)

1 Sách, giáo trình chính:

- Cấu trúc dữ liệu và giải thuật - Đỗ Xuân Lôi - NXB Khoa học kỹ thuật

- Bài giảng Cấu trúc dữ liệu và giải thuật - Đỗ Thị Mơ

2 Sách tham khảo:

a - Cấu trúc dữ liệu + giải thuật = chương trình - Niklaus Wirth

b - Thuật toán - Đỗ Xuân Huy

c - Cấu trúc dữ liệu và giải thuật - Trung tâm Tin học Ngoại ngữ Trí Đức - Nhà xuất bản Thống kê 2003

d - Data Structures and Algorithms - Alfred V Aho, John E Hopcroft, Jeffrey D Ullman - Addison Wesley Publishing Company

Trang 2

3 Thiết kế và phân tích giải thuật

3.1 Thiết kế giải thuật

3.1.1 Mô hình hoá việc giải quyết bài toán

- Khi thiết kế giải thuật ta sử dụng phương pháp mô đun hoá

Trang 3

Với phương pháp mô đun hoá bài toán thì lời giải của bài toán được tổ chức theo cấu trúc cây

(phân cấp) có dạng như sau:

F

A

D C

B

I H

Trang 4

- Cách thiết kế Top - Down hay thiết kế

từ khái quát đến đến chi tiết thể hiện như sau:

xuất phát từ dữ liệu và mục tiêu đề ra,

đề cập đến vấn đề chủ yếu, rồi sau đó

cụ thể một cách chi tiết hơn.

Trang 5

Ví dụ: Xây dựng phần mềm quản lý lương cán bộ trong một

cơ quan

- Xuất phát từ phân tích tổng quát trên thuật giải xử

lý phải giải quyết được 3 vấn đề sau:

1 Đọc tệp: Đọc thông tin từ đĩa từ vào bộ nhớ

2 Xử lý tệp: Xử lý các thông tin để đưa ra kết quả mong muốn

3 Ghi tệp: Lưu trữ thông tin mới nhất vào tệp Thiết kế theo sơ đồ sau:

QUẢN LÍ LƯƠNG

GHI TỆP

XỬ LÝ TỆP ĐỌC TỆP

Trang 6

- Nhiệm vụ “ XỬ LÝ TÊP” được phân chia ra thành 3 nhiệm vụ con:

1 Tìm kiếm bản ghi

2 Cập nhật bản ghi

3 In bản lương

Những nhiệm vụ con lại được chia ra thành các

nhiệm vụ nhỏ hơn theo sơ đồ sau:

XỬ LÝ TỆP

IN BẢNG LƯƠNG CẬP NHẬT BẢN GHI

TÌM BẢN GHI

THÊM XOÁ

SỬA TÌM THEO

TÊN

TÌM THEO

LƯƠNG NĂM LƯƠNG

THÁNG

Trang 7

* Ưu điểm của cách thiết kế Top - Down :

- Giải quyết bài toán có định hướng, tránh

sa đà vào chi tiết phụ.

- Làm nền tảng cho lập trình có cấu trúc.

- Bài toán do nhiều người cùng làm, tách bài toán thành nhiều bài toán con tạo cho các nhóm làm việc độc lập không ảnh

hưởng đến nhóm khác.

- Chương trình dễ dàng trong chỉnh lý và sửa chữa.

Trang 8

3.1.2 Phương pháp tinh chỉnh từng bước

- Phương pháp tinh chỉnh tưng bước thể hiện như sau:

Thoạt đầu chương trình thể hiện giải thuật

phản ánh ý chính của công việc cần làm

gọi là các bước tinh chỉnh Càng ở các

lệnh của chương trình.

Trang 9

- Quá trình thiết kế giải thuật diễn ra như

Trang 10

Ví dụ 1: Lập trình sắp xếp một dãy n số nguyên khác nhau theo thứ tự

tăng dần.

* Có thể phác thảo giải thuật theo ngôn ngữ tự nhiên như sau:

- Từ dãy các số nguyên chưa được sắp xếp chọn ra số nhỏ nhất, đổi chỗ

cho số đầu dãy.

- Cứ lặp lại quá trình đó cho đến khi dãy chưa được sắp trở thành rỗng.

* Dùng ngôn ngữ giả Pascal :

1 Bước tinh chỉnh đầu tiên là:

For i:=1 To n-1 Do Begin

- Xét từ ai đến an để tìm số nhỏ nhất aj

- Đổi chỗ giữa ai và aj End

2 Bước tinh chỉnh 2.1.: Tìm số nhỏ nhất

j:=i For k:= j+1 To n Do

If ak < aj Then j:=k

3 Bước tinh chỉnh 2.2: Đổi chỗ

x:=ai ; ai:=aj ; aj=x;

Trang 11

* Sau khi chỉnh lại ta có thủ tục sắp xếp như sau :

If a[k] < a[j] Then j :=k

Trang 12

3.2 Phân tích giải thuật

3.2.1 Đạt vấn đề

* Khi xây dựng giải thuật và chương trình tương ứng có các nhu cầu sau:

chương trình trên bộ dữ liệu, so sánh kết quả với kết quả đã biết.

Các công cụ toán học chứng minh

tính đúng đắn của giải thuật.

Trang 13

- Tính đơn giản : Dễ hiểu, dễ lập trình,

dễ chỉnh lý.

hiện giải thuật là tiêu chuẩn đánh giá hiệu lực của giải thuật.

3.2.2 Phân tích thời gian thực hiện giải thuật

* Với một bài toán có nhiều giải thuật chọn giải thuật dẫn đến kết quả nhanh nhất là vấn đề đòi hỏi của thực tế.

Trang 14

* Thời gian thực hiện T phụ thuộc vào các yếu

tố:

kích thước của dữ liệu vào, thì thời gian

ngôn ngữ viết chương trình, chương trình

hiện Nhưng những yếu tố này không đồng

thể đưa chúng vào xác lập T(n).

giải thuật.

Trang 15

3.2.3 Độ phức tạp tính toán của giải thuật

* Nếu thời gian thực hiện một giải thuật là

độ phức tạp tính toán của giải thuật này có cấp n2, và được kí hiệu là:

T(n)= O(n2)

* Tổng quát: Hàm f(n) có độ phức tạp tính toán cấp g(n) nếu hàm f(n) bị chặn bởi

C g(n) , với C là hằng số

Kí hiệu là f(n) = O(g(n))

Trang 16

Ví dụ 1: f(n) = O(n 3 ) có nghĩa độ phức tạp tính toán cấp n3

Ví dụ 2: f(n) = O(2 n ) có nghĩa độ phức tạp tính toán cấp 2 n

* Các hàm thể hiện độ phức tập tính toán của giải thuật có các dạng sau:

n n , n!, 2 n , n 3 , n 2 , nlog 2n , n, log 2n Các hàm đó đã được sắp theo thứ tự ưu tiên giá trị

giảm dần, có nghĩa là với giá trị của n hàm n n là lớn nhất, log 2n là nhỏ nhất Các hàm này có dạng đồ thị như sau:

Trang 18

3.2.4 Xác định độ phức tạp tính toán

a) Quy tắc cộng

Giả sử T1(n) và T2(n) là thời gian thực hiện 2 đoạn chương trình P1 và P2 mà

T1(n)= O(f(n)) T2(n)=O(g(n)), thì thời gian

thực hiện P1 rồi đến P2 tiếp theo sẽ là:

T1(n) + T2(n) = O(max(f(n),g(n)))

độ phức tạp tính toán lần lượt là

O(n3), O(n), O(nlog2n).

Vậy thời gian thực hiện 3 bước là:

T1(n) + T2(n) + T3(n)=O ( max(n3, n, nlog2n) = O(n3)

Trang 20

Ví dụ 2 : Câu lệnh x+1 có thời gian thực

Trang 21

c) Qui tắc 3: Bỏ hằng số

số.

Ví dụ 5 : O(n2/ 3) = O(n2)

• Chú ý 1 : Khi đánh giá thời gian thực hiện

phép toán tích cực

• Phép toán tích cực là phép toán mà thời

thực hiện các phép toán khác.

Trang 22

Ví dụ 6 : e x = 1+ x/1! + x 2 /2! + + x n /n! với x và n cho trước.

Trong giải thuật 1 phép toán tích cực ở đây là p:=p*x/j Ta thấy nó

được thực hiện với số lần là: 1+2+3+ + n = n(n+1)/2

Vậy thời gian thực hiện giải thuật là: T(n) = O(n 2 )

Trang 23

* Chú ý 2: có những trường hợp thời gian

thực hiện giải thuật không chỉ phụ thuộc vào kích thước của dữ liệu vào mà còn

Ta có T(n) trong trường hợp thuận lợi nhất T(n) trong trường hợp trung bình

T(n) trong trường hợp xấu nhất.

Nếu T(n) trong trường hợp trung bình khó

tính người ta đánh giá giải thuật bằng

T(n) trong trường hợp xấu nhất.

Trang 24

Ví dụ 7 : Thuật toán tìm kiếm

Cho véc tơ a có n phần tử a1, a2, , an

Tìm trong a phần tử đầu tiên có giá trị = x cho trước.

Giải thuật như sau:

Found := False; i:=1;

While (i<=n) and Not Found Do

If a[i] =x then Begin

Found:=True; k:=i; Write(k); end else i:=i+1;

End.

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

T(n) trong trường hợp tốt T(n)=O(1)

T(n) trong trường hợp xấu T(n)=O(n)

Vậy suy ra T(n)=O(n)

Trang 25

Bài tâp:

1 Cho dãy số a có n phần tử a1, a2, , an

Hãy viết giải thuật sắp xếp dãy số trên theo thứ tự tăng dần bằng phương pháp chọn trực tiếp, đánh giá độ phức tạp tính toán của giải thuật

2 Cho dãy số a có n phần tử a1, a2, , an

Hãy viết giải thuật tìm trong a phần tử đầu tiên có giá trị > x cho trước, đánh giá độ phức tạp tính toán của giải thuật

Trang 26

Chương 4: Danh sách móc nối ( danh sách liên kết: Linked list )

Việc sử dụng con trỏ hoặc mối nối để tổ chức danh sách tuyến tính ta gọi là danh sách móc nối

1 Danh sách nối đơn (Singly linked list)

1.1 Quy tắc tổ chức danh sách nối đơn

* Mỗi phần tử của danh sách được lưu trữ trong một phần tử nhớ mà ta gọi là nút(node) Mỗi nút bao gồm một số từ máy kế tiếp Một nút có thể nằm ở bất kỳ chỗ nào trong bộ nhớ Trong mỗi nút ngoài thông tin ứng với phần tử, còn có chứa địa chỉ của phần tử đứng sau nó trong danh sách

* Quy cách của mỗi nút :

- Trường INFOR chứa thông tin của phần tử

- Trường LINK chứa địa chỉ nút tiếp theo ( địa chỉ móc nối)

* Riêng nút cuối cùng không có nút đứng sau nên không có địa chỉ như các nút khác, ta gọi là mối nối không và kí hiệu là NULL

Trang 27

* Để truy nhập vàp mọi nút trong danh sách thì phải truy nhập được vào nút đầu tiên, do đó cần phải có con trỏ L trỏ tới nút đầu tiên

L

* Nếu danh sách rỗng thì qui ước L = NULL

* Để tổ chức một danh sách móc nối thì khả năng sau đây càn phải có:

1 Tồn tại phương tiện chia bộ nhớ ra thành các nútvà ở mỗi nút có thể truy nhập vào từng trường

2 Tồn tại cơ chế để xác định được một nút đang được sử dụng (bận) hoặc

: Kí hiệu mối nối không

Trang 28

1.2 Một số phép toán với danh sách nối đơn

* Ta kí hiệu với một nút có địa chỉ là p ( được trỏ bởi p) thì INFOR(p) chỉ trường INFOR của nút ấy, LINK(p) chỉ trường LINK của nút ấy

Trang 29

a Bổ sung một nút mới vào danh sách móc nối

Cho con trỏ Love trỏ tới nút đầu cuẩ danh sách móc nối, M là con trỏ trỏ tới một nút đang có trong danh sách

Thủ tục bổ sung vào sau nút trỏ bởi M một nút mới mà trường INFOR của nó

có giá trị lấy từ ô có địa chỉ là X Thủ tục gồm các bước sau :

Trang 30

b Thủ tục loại một nút ra khỏi danh sách

Cho danh sách móc nối đơn trỏ bởi Love, loại một nút trỏ bởi M ra khỏi danh sách đó

Procedure DELETE(L,M)

1 { Trường hựp danh sách rỗng}

If L=NULL then begin

Write(‘ danh sách rỗng ‘) Return

Trang 31

Câu hỏi thảo luận và bài tâp

1 Thế nào là cấu trúc ngăn xếp Cho ví dụ

2 Thế nào là Cấu trúc hàng đợi Cho ví dụ

3 Thế nào là danh sách móc nối Ưu điểm của danh sách móc nối

4 Trình bày qui ước biểu diễn danh sách móc nối đơn

5 Xét danh sách thuê bao điện thoại Mỗi thuê bao coi như một bản ghi có 3 trường: HT (họ tên), DC (địa chỉ ), SDT (số điện thoại)

a Viết các thủ tục: Tạo danh sách kiểu cấu trúc ngăn xếp, thực hiện các phép bổ sung và loại bỏ phần tử

b Viết các thủ tục: Tạo danh sách kiểu cấu trúc hàng đợi, thực hiện các phép bổ sung và loại bỏ phần tử

Trang 32

3 Danh sách nối kép (Double linked list)

LPTR : Con trỏ trỏ tới nút đứng trước

RPTR : Con trỏ trỏ tới nút đứng sau

INFOR : Trường thông tin

R

L

* LPTR của nút cực trái và RPTR của nút cực phải là NULL

* Để truy nhập vào danh sách cả 2 chiều ta phải dùng 2 con trỏ: Con trỏ L trỏ vào nút cực trái, con trỏ R trỏ vào nút cực phải

* Khi danh sách rỗng thì L=R=NULL

Trang 33

3.2 Các phép toan trên danh sách nối kép

a Chèn một nút vào danh sách nối kép

Trang 34

3 { M trỏ tới nút cực trái }

If M=L then begin

LPTR(new):= NULL RPTR(new):= M

LPTR(M):= new L:=new

Return end

Trang 35

4 { Bổ sung vào giữa trước M } LPTR(new):=LPTR(M)

RPTR(new):=M

LPTR(M):=new

RPTR(LPTR(new)):=new

Return

Trang 36

b Loại bỏ một nút ra khỏi danh sách nối kép

Trang 37

1 { Trường hợp danh sách rỗng }

If R=NULL then begin

Write(‘ danh sach rong ‘) Return

Trang 38

M=L: Begin { Nút cực trái bị loại } L:=RPTR(L)

Trang 39

Câu hỏi thảo luận và bài tập

1 Thế nào là danh sách nối vòng Nêu ưu nhược điểm của nó.

2 Để khắc phục hạn chế của danh sách nối vòng người ta làm thế nào.

3 Thế nào là danh sách nối kép? Qui ước biểu diễn một nút của danh sách nối kép.

4 Nêu ưu nhược điểm của danh sách nối kép.

5 Cài đặt Stack bằng danh sach nối đơn như thế nào Cần chú ý gì khi thực hiện các phép bổ sung, loại bỏ phần tử.

6 Cài đặt Queue bằng danh sach nối đơn như thế nào Cần chú ý gì khi thực hiện các phép bổ sung, loại bỏ phần tử.

7 Xét danh sách điểm học sinh Mỗi học sinh coi như một bản ghi có 3 trường:

HT (họ tên), SBD (số báo danh), DIEM (điểm)

a Viết các thủ tục: Tạo danh sách nối kép, thực hiện các phép bổ sung và loại

bỏ phần tử.

b Viết các thủ tục: Tạo danh sách nối vòng, thực hiện các phép bổ sung và loại

bỏ phần tử.

Trang 40

Ví dụ 1: Một mạng gồm các máy tính và các kênh điện thoại nối các máy tính này là một đồ thị

Ví dụ 2: Một mạng gồm các thành phố, thị xã và các

đường bộ nối các thành phố, thị xã là một đồ thị.

1.2 Định nghĩa đồ thị vô hướng

Đồ thị vô hướng G=(V,E) bao gồm V là tập các đỉnh và

E là tập các cặp đỉnh không có thứ tự gọi là các cung.

Trang 42

* Nếu (v1, v2) là một cung trong tập E(G) thì v1 và v2 gọi là lân

cận của nhau

Ví dụ trên 1,2 là lân cân, 1,3 là lân cận

* Một đường đi từ đỉnh u đến đỉnh v trong đồ thị là một dãy các

đỉnh

u=x0, x1, , xn-1, xn=v mà dãy các cạnh (x0, x1), (x1, x2), ,

(xn-1, xn) là các cung thuộc E(G)

* Số lượng cung trên đường đi gọi là độ dài của đường đi

Ví dụ đường đi từ 1 đến 4 có độ dài là 2

* Đường đi đơn: Là đường đi mà mọi đỉnh trên đó, trừ đỉnh đầu và đỉnh cuối đều khác nhau

* Một chu trình là một đường đi đơn mà đỉnh đầu và đỉnh cuối

trùng nhau

Ví dụ: 1→ 3 → 5→ 4→1

Trang 43

* Trong đồ thị G hai đỉnh u và v gọi là liên thông nếu có một đường đi từ u đến

v

Ví dụ: 1, 4 là liên thông 1, 5 là liên thông

* Đồ thị G gọi là liên thông nếu với mọi cặp đỉnh phân biệt vi, vj trong V(G) đều

có một đường đi từ vi với vj

Ví dụ: Đồ thị sau là đồ thị vô hướng liên thông

1

2 3

4 5

Trang 44

Ví dụ: Đồ thị sau là đồ thị vô hướng không liên thông

Trang 45

Ví dụ: Đồ thị sau là đồ thị có hướng không liên thông

Trang 46

* Đồ thị vô hướng G=(V,E), bậc của đỉnh v là số cung liền thuộc với đỉnh đó

2.1 Biểu diễn bằng ma trận lân cận ( ma trận kề )

Xét đồ thị G(V,E), V gồm n đỉnh (n>=1), giả sử các đỉnh được đánh số thứ tự theo một quy định nào đó Ma trận lân cận A biểu diễn G là một ma trận vuông kích thước nxn Các phần tử của ma trận có giá trị 0 hoặc 1

Ai j = 1 khi tồn tại cung (vi, vj ) trong E

Ai j = 0 khi không tồn tại cung (vi, vj ) trong E

* Nếu đồ thị vô hướng thì ma trận A đối xứng qua đường chéo chính

Trang 47

Ví dụ 1: Đồ thị vô hương sau

Trang 49

* Với đồ thị có trọng số ma trận lân cận thay giá trị 1 bằng trọng số tương ứng của cung đó

2.2 Biểu diễn bằng danh sách lân cận ( danh sách kề )

Trong cách biểu diễn này n hàng của ma trận thay bằng n danh sách móc nối Mỗi đỉnh của G có một danh sách tương ứng Các nút trong danh sách i biểu diễn các đỉnh lân cận của nút i

Mỗi nút trong danh sách có chứa 2 trường :

VERTEX: Là thông tin của đỉnh lân cận đỉnh i

LINK : Là địa chỉ nút tiếp theo

VERTEX LINK

Trang 50

Ví dụ 1 ở trên được biểu diễn bằng danh sách lân cận kề sau:

Trang 51

Ví dụ 2 ở trên được biểu diễn bằng danh sách lân cận kề sau:

Trang 52

3 Phép duyệt đồ thị

* Xét đồ thị vô hướng G(V,E) và một đỉnh vV Ta cần thăm tất cả các đỉnh của G mà có thể “ với tới” từ đỉnh v ( nghĩa là đồ thị liên thông).

Có 2 cách duyệt đồ thị:

- Phép tìm kiếm theo chiều sâu ( Depth first search )

- Phép tìm kiếm theo chiều rộng (Breadth first search )

3.1 Phép tìm kiếm theo chiều sâu ( Depth first search )

Xét đồ thị vô hướng Phép tìm kiếm theo chiều sâu thể hiện như sau:

- Đỉnh xuất phát v được thăm.

- Tiếp theo đó ta thăm đỉnh w là đỉnh chưa được thăm và là lân cận của

v Phép tìm kiếm theo chiều sâu xuất phát từ w lại được thực hiện Trong trường hợp đỉnh u đã được thăm mà mọi đỉnh lân cận của nó đã

được thăm rồi thì ta quay lại đỉnh cuối cùng vừa được thăm ( mà đỉnh này còn đỉnh w là lân cận của nó chưa được thăm) và phép tìm kiếm theo chiều sâu xuất phát từ w lại được thực hiện.

Trang 53

Ví dụ 1: Cho đồ thị vô hướng sau:

*

+

x

/ +

*

+

x

/ +

Trang 54

Phép duyệt theo chiều sâu đi theo trình tự sau:

v1  v2  v4  v8  v5  v8  v6  v3  v7

* Thủ tục phép duyệt theo chiều sâu như sau:

Cho một đồ thị G(V,E) vô hướng có n đỉnh và véc tơ Visited(n) gồm n phần

tử, ban đầu véc tơ này có giá trị =0 Thuật giải này thực hiện thăm mọi đỉnh

“ với tới được “ từ đỉnh v.

Procedure DFS(v)

1 Visited(v):=1 { đánh dấu v được thăm }

2 FOR mỗi đỉnh w lân cận với v DO

If Visited(w)=0 then CALL DFS(w);

3 Return

* Đánh giá thuật toán:

+ Trường hợp biểu diễn đồ thị dùng danh sách móc nối: G có e cung, mỗi nút với tới 1 lần, nên thời gian tìm kiếm là O(e).

+ Trường hợp biểu diễn đồ thị dùng ma trận lân cận : thì thời gian xác định mọi điểm lân cận của v là O(n) Có n đỉnh nên thời gian tìm kiếm là O(n 2 ).

Ngày đăng: 26/02/2023, 15:06

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

w