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

Giáo trình môn Cấu trúc dữ liệu

96 12 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 96
Dung lượng 0,95 MB

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

Nội dung

Chương 3, 4 trình bày về các cấu trúc dữ liệu được sử dụng rất thông dụng như mảng và danh sách liên kết, ngăn xếp và hàng đợi, cây.. Đó là các cấu trúc dữ liệu cũng rất gần gũi với c[r]

Trang 1

TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT

THÀNH PHỐ HỒ CHÍ MINH



GIÁO TRÌNH MÔN HỌC: CẤU TRÚC DỮ LIỆU NGÀNH: HỆ THỐNG THÔNG TIN, THIẾT KẾ TRANG WEB, CÔNG

Trang 2

TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT

THÀNH PHỐ HỒ CHÍ MINH



GIÁO TRÌNH MÔN HỌC: CẤU TRÚC DỮ LIỆU NGÀNH: HỆ THỐNG THÔNG TIN, THIẾT KẾ TRANG WEB, CÔNG

NGHỆ THÔNG TIN (ỨNG DỤNG PHẦN MỀM)

TRÌNH ĐỘ: CAO ĐẲNG

THÔNG TIN CHỦ NHIỆM ĐỀ TÀI

Họ tên: Võ Đào Thị Hồng Tuyết

Học vị: Thạc Sỹ

Đơn vị: Khoa Công Nghệ Thông Tin

Email: vodaothihongtuyet@hotec.edu.vn

BỘ MÔN CHỦ NHIỆM ĐỀ TÀI

HIỆU TRƯỞNG DUYỆT

Thành phố Hồ Chí Minh, năm 2020

Trang 4

Cấu trúc dữ liệu một trong những môn học cơ bản của sinh viên ngành Công Nghệ Thông Tin Hiểu và vận dụng các cấu trúc dữ liệu và các giải thuật là cơ sở để sinh viên tiếp cận với việc thiết kế và xây dựng phần mềm cũng như sử dụng các công

cụ lập trình hiện đại

Cấu trúc dữ liệu có thể được xem như là 1 phương pháp lưu trữ dữ liệu trong máy tính nhằm sử dụng một cách có hiệu quả các dữ liệu này Và để sử dụng các dữ liệu một cách hiệu quả thì cần phải có các thuật toán áp dụng trên các dữ liệu đó Do vậy, cấu trúc dữ liệu và giải thuật là 2 yếu tố không thể tách rời và có những liên quan chặt chẽ với nhau Việc lựa chọn một cấu trúc dữ liệu có thể sẽ ảnh hưởng lớn tới việc lựa chọn áp dụng giải thuật nào

Bài giảng “Cấu Trúc Dữ Liệu” bao gồm 4 chương, trình bày về các cấu trúc dữ liệu và các giải thuật cơ bản nhất trong tin học

Chương 1 trình bày về phân tích và thiết kế thuật toán Đầu tiên là cách phân tích 1 vấn đề, từ thực tiễn cho tới chương trình, cách thiết kế một giải pháp cho vấn đề theo cách giải quyết bằng máy tính Trình bày về đệ qui, một khái niệm rất cơ bản trong toán học Việc sử dụng đệ qui có thể xây dựng được những chương trình giải quyết được các vấn đề rất phức tạp chỉ bằng một số ít câu lệnh, đặc biệt là các vấn đề mang bản chất đệ qui

Chương 2 trình bày về các thuật toán sắp xếp và tìm kiếm Các thuật toán này cùng với các kỹ thuật được sử dụng trong đó được coi là các kỹ thuật cơ sở cho lập trình máy tính Các thuật toán được xem xét bao gồm các lớp thuật toán đơn giản và cả các thuật toán cài đặt phức tạp nhưng có thời gian thực hiện tối ưu

Chương 3, 4 trình bày về các cấu trúc dữ liệu được sử dụng rất thông dụng như mảng và danh sách liên kết, ngăn xếp và hàng đợi, cây Đó là các cấu trúc dữ liệu cũng rất gần gũi với các cấu trúc trong thực tiễn

Cuối mỗi phần đều có các câu hỏi và bài tập để sinh viên ôn luyện và tự kiểm tra kiến thức của mình Cuối tài liệu có các phụ lục hướng dẫn trả lời câu hỏi, mã nguồn tham khảo và tài liệu tham khảo

Về nguyên tắc, các cấu trúc dữ liệu và các giải thuật có thể được biểu diễn và cài đặt bằng bất cứ ngôn ngữ lập trình hiện đại nào Tuy nhiên, để có được các phân tích sâu sắc hơn và có kết quả thực tế hơn, tác giả đã sử dụng ngôn ngữ lập trình C để minh hoạ cho các cấu trúc dữ liệu và thuật toán Do vậy, ngoài các kiến thức cơ bản về tin học, sinh viên cần có kiến thức về ngôn ngữ lập trình C

Cuối cùng, mặc dù đã hết sức cố gắng nhưng chắc chắn không tránh khỏi các thiếu sót Tác giả rất mong nhận được sự góp ý của đồng nghiệp và sinh viên để tài liệu được hoàn thiện hơn

Trang 5

CHƯƠNG 1: THIẾT KẾ GIẢI THUẬT - THUẬT GIẢI ĐỆ QUI 1

1.1 Giải thuật và ngôn ngữ diễn đạt giải thuật 1 1.2 Các bước cơ bản để giải quyết tập bài toán 2

1.1 Đổi chỗ trực tiếp (Interchange Sort) 11

2.3 Cài đặt ngăn xếp bằng danh sách liên kết 45

Trang 6

2.2 Phép duyệt

Trang 7

Tên môn học: CẤU TRÚC DỮ LIỆU

- Tính chất: Là môn học đào tạo nghề bắt buộc

II Mục tiêu môn học:

- Về kiến thức:

+ Trình bày được các bước phân tích, đánh giá độ phức tạp của thuật toán + Trình bày được các cấu trúc kiểu dữ liệu trừu tượng, các thao tác tương tứng trên các kiểu dữ liệu

+ Trình bày được các thuật toán tìm kiếm, sắp xếp

Trang 8

1 Nội dung tổng quát và phân bổ thời gian:

Bài tập, thực hành

Kiểm Tra

1

Chương 1: Thiết kế giải

thuật - Thuật giải đệ qui

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

1.1 Giải thuật và ngôn ngữ

diễn đạt giải thuật

1.2 Các bước cơ bản để giải

quyết tập bài toán

2 Thuật giải đệ quy

2.1 Khái niệm về đệ qui

2.2.Thiết kế giải thuật đệ qui

Trang 9

Bài tập, thực hành

Kiểm Tra kiếm

1.Danh sách liên kết đơn

2.Danh sách kiểu ngăn xếp

Nội dung chi tiết:

Chương 1: Thiết kế giải thuật - Thuật giải đệ qui

Thời gian: 8 giờ Mục tiêu: Trình bày được các bước cơ bản để giải quyết bài tập, và dần hình thành việc

thiết kế giải thuật để giải quyết theo yêu cầu Trình bày được khái niệm về giải thuật đệ quy, trình bày được các bước xây dựng thuật giải đệ quy Qua đó đề xuất hướng áp dụng

thuật giải đệ quy cho bài toán cụ thể

Nội dung:

Trang 10

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

1.1.Giải thuật và ngôn ngữ diễn đạt giải thuật

1.2.Các bước cơ bản để giải quyết tập bài toán

2 Thuật giải đệ quy

2.1.Khái niệm về đệ qui

2.2.Thiết kế giải thuật đệ qui

2.3.Áp dụng thuật giải đệ qui

Chương 2: Các thuật giải sắp xếp và tìm kiếm

Thời gian: 16 giờ Mục tiêu: Tình bày được các giải thuật sắp xếp và tìm kiếm Phân biệt được các thuật

toán sắp xếp và tìm kiếm Sinh viên có khả năng cài đặt được các thuật toán sắp xếp và tìm kiếm

Nội dung:

1 Một số phương pháp sắp xếp đơn giản

1.1 Đổi chỗ trực tiếp (Interchange Sort)

1.2 Nổi bọt (Bubble Sort)

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

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

1.5 Phân hoạch (Quick Sort)

Chương 3: Các cấu trúc dữ liệu

Thời gian: 24 giờ Mục tiêu: Trình bày được các cấu trúc dữ liệu cơ bản như ngăn xếp, hàng đợi, danh sách

liên kết Trình bày được các thao tác cơ bản trên cấu trúc dữ liệu Vận dụng cấu trúc dữ

liệu vào một bài toán cụ thể

Trang 11

Nội dung:

1 Danh sách liên kết đơn

2 Danh sách kiểu ngăn xếp (Stack)

3 Danh sách kiểu hàng đợi (Queue)

IV Điều kiện thực hiện môn học:

1 Phòng học chuyên môn hóa/nhà xưởng: phòng máy

2 Trang thiết bị máy móc: máy chiếu, màn chiếu, hệ thống âm thanh

3 Học liệu, dụng cụ, nguyên vật liệu: bảng

4 Các điều kiện khác: không

V Nội dung và phương pháp, đánh giá:

1 Nội dung:

- Chương 1: Phân tích, thiết kế giải thuật

- Chương 2: Thuật giải đệ qui

- Chương 2: Các thuật giải sắp xếp và tìm kiếm

- Chương 3: Các cấu trúc dữ liệu

- Chương 4: Cây

Trang 12

tứng trên các kiểu dữ liệu

+ Trình bày được các thuật toán tìm kiếm, sắp xếp

+ Sinh viên có khả năng lựa chọn thuật toán cũng như cấu trúc dữ liệu phù

hợp cho từng bài toán

2 Phương pháp:

kiểm tra

Thời gian thi

VI Hướng dẫn thực hiện môn học:

1 Phạm vi áp dụng môn học: Áp dụng cho khóa học trình độ cao đẳng

2 Hướng dẫn về phương pháp giảng dạy, học tập môn học:

- Đối với giáo viên, giảng viên:

+ Giáo viên có thể vận dụng phương pháp thuyết trình, giảng giải kết hợp phương pháp gợi mở, phát vấn để người học nghề có thể tham gia tích cực vào bài giảng

+ Phương tiện, dụng cụ giảng dạy: Ngoài phương tiện giảng dạy truyền thống giáo viên còn có thể sử dụng Máy chiếu Projector, Laptop, sơ đồ, tranh ảnh minh hoạ giúp làm rõ và sinh động nội dung bài học

+ Trong điều kiện có thể kết hợp giảng dạy lý thuyết và thực hành trong cùng một phòng học chuyên môn hoá có máy tính được nối mạng LAN và mạng Internet, có sử dụng các phương tiện dạy học bằng ngôn ngữ lập trình

- Đối với người học:

Trang 13

giáo viên

+ Hoàn thành đầy đủ các bài thực hành và tham dự các buổi kiểm tra trên lớp

+ Kết thúc khóa học, người học sẽ làm một bài kiểm tra để xác định việc

họ có hoàn thành chương trình học hay không

+ Học sinh tham gia đầy đủ các buổi lên lớp (không nghỉ quá 30% thời lượng học)

3 Những trọng tâm cần chú ý:

- Trình độ giáo viên: ít nhất phải có bằng cử nhân hoặc bằng cấp tương

đương tính theo kinh nghiệm dạy học trước đó Có chứng chỉ dạy nghề

- Nguồn lực đào tạo: Những nguồn lực sau đây được khuyến khích sử dụng

để bổ trợ những phương pháp giảng dạy đề xuất

+ Cuốn hướng dẫn dành cho giáo viên: được biên soạn và trình bày trong các khóa tập huấn đào tạo giáo viên

+ Cơ sở vật chất, trang thiết bị giảng dạy: Lớp học có đầy đủ máy vi tính cho học sinh thực tập

+ Sách, giáo trình và tài liệu tham khảo

+ Kế hoạch giảng dạy và giáo án chi tiết của giáo viên đóng vai trò tài liệu chính được sử dụng trong quá trình giảng dạy

- Phương pháp đào tạo: Giáo viên kết hợp nhiều chiến lược giảng dạy để

giúp tất cả người học thuộc mọi đối tượng có những tiến bộ nhất định nào đó

4 Tài liệu tham khảo:

TT Tên tác giả Tên sách – giáo

Đại Học Kinh Tế Quốc Dân 2018

2 Robert Sedgewick Algorithms

Bản dịch tiếng Việt, NXB Khoa học và Kỹ thuật,

1994

Trang 14

CHƯƠNG 1: THIẾT KẾ GIẢI THUẬT - THUẬT GIẢI ĐỆ QUI

Mục tiêu: Trình bày được các bước cơ bản để giải quyết bài tập và dần hình

thành việc thiết kế giải thuật để giải quyết theo yêu cầu Trình bày được khái niệm về giải thuật đệ quy, trình bày được các bước xây dựng thuật giải đệ quy Qua đó đề xuất hướng áp dụng thuật giải đệ quy cho bài toán cụ thể

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

1.1 Giải thuật và ngôn ngữ diễn đạt giải thuật

1.1.1 Giải thuật

Là một dãy các thao tác xác định trên một đối tượng, sao cho sau khi thực hiện một số hữu hạn các bước thì đạt được mục tiêu Theo R.A.Kowalski thì bản chất của giải thuật:

Giải thuật = Logic + Điều khiển Logic: Đây là phần khá quan trọng, nó trả lời câu hỏi "giải thuật làm gì, giải

quyết vấn đề gì?", những yếu tố trong bài toán có quan hệ với nhau như thế nào v.v…

Ở đây bao gồm những kiến thức chuyên môn mà bạn phải biết để có thể tiến hành giải bài toán Ví dụ: để giải một bài toán tính diện tích hình cầu, mà bạn không còn nhớ công thức tính hình cầu thì bạn không thể viết chương trình cho máy để giải bài toán này được

Điều khiển: Thành phần này trả lời câu hỏi: giải thuật phải làm như thế nào?

Chính là cách thức tiến hành áp dụng thành phần logic để giải quyết vấn đề

1.1.2 Ngôn ngữ diễn đạt giải thuật

Sau khi đã xây dựng được mô hình toán học cho vấn đề cần giải quyết, tiếp theo, ta có thể hình thành một thuật toán cho mô hình đó Phiên bản đầu tiên của thuật toán thường được diễn tả dưới dạng các phát biểu tương đối tổng quát, và sau đó sẽ được tinh chỉnh dần từng bước thành chuỗi các lệnh cụ thể, rõ ràng hơn

Mối liên hệ giữa Cấu trúc dữ liệu và 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 các đối tượng dữ liệu và các yêu cầu xử lý trên những đối tượng đó Vì thế, để 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ế :

Các thành phần dữ liệu thực tế đa dạng, phong phú và thường chứa đựng những quan hệ nào đó với nhau, do đó trong mô hình tin học của bài toán, cần phải tổ chức , xây dựng các cấu trúc thích hợp nhất sao cho vừa có thể phản ánh chính xác các

Trang 15

dữ liệu thực tế này, vừa có thể dễ dàng dùng máy tính để xử lý Công việc này được gọi là xây dựng cấu trúc dữ liệu (Data structure) cho bài toán

Xây dựng các thao tác xử lý dữ liệu:

Từ những yêu cầu xử lý 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 (Algorithm) cho bài toán

Trong một đề án tin học, 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ện qua công thức :

Cấu trúc dữ liệu + Giải thuật = Chương trình 1.2 Các bước cơ bản để giải quyết tập bài toán

Chương trình (Program)

Là một tập hợp các mô tả, các phát biểu, nằm trong một hệ thống qui ước về ý nghĩa và thứ tự thực hiện, nhằm điều khiển máy tính làm việc Theo Niklaus Wirth thì:

Chương trình = Thuật toán + Cấu trúc dữ liệu

Các thuật toán và chương trình đều có cấu trúc dựa trên 3 cấu trúc điều khiển

cơ bản:

Tuần tự (Sequential): Các bước thực hiện tuần tự một cách chính xác từ trên

xuống, mỗi bước chỉ thực hiện đúng một lần

Chọn lọc (Selection): Chọn 1 trong 2 hay nhiều thao tác để thực hiện

Lặp lại (Repetition): Một hay nhiều bước được thực hiện lặp lại một số lần

Ngôn ngữ lập trình (Programming language)

Ngôn ngữ lập trình là hệ thống các ký hiệu tuân theo các qui ước về ngữ pháp

và ngữ nghĩa, dùng để xây dựng thành các chương trình cho máy tính

Một chương trình được viết bằng một ngôn ngữ lập trình cụ thể (ví dụ Pascal, C…) gọi là chương trình nguồn, chương trình dịch làm nhiệm vụ dịch chương trình nguồn thành chương trình thực thi được trên máy tính

Các bước lập trình:

Bước 1: Phân tích vấn đề và xác định các đặc điểm (xác định I-P-O)

Bước 2: Lập ra giải pháp (đưa ra thuật giải)

Bước 3: Cài đặt (viết chương trình)

Bước 4: Chạy thử chương trình (dịch chương trình)

Trang 16

Bước 5: Kiểm chứng và hoàn thiện chương trình (thử nghiệm bằng nhiều số liệu

và đánh giá)

Kỹ thuật lập trình

I-P-O Cycle (Input-Pprocess-Output Cycle) (Quy trình nhập-xử lý-xuất)

Quy trình xử lý cơ bản của máy tính gồm I-P-O

Ví dụ 1: Xác định Input, Process, Output của việc làm 1 ly nước chanh nóng

Input : ly, đường, chanh, nước nóng, muỗng

Process : - cho hỗn hợp đường, chanh, nước nóng vào ly

- dùng muỗng khuấy đều

Output : ly chanh nóng đã sẵn sàng để dùng

Ví dụ 2: Xác định Input, Process, Output của chương trình tính tiền lương

công nhân tháng 10/2002 biết rằng lương = lương căn bản * ngày công

Input : lương căn bản, ngày công

Process : nhân lương căn bản với ngày công

Process : Nếu a > b thì Output = a lớn nhất

Ngược lại Output = b lớn nhất

Với mỗi vấn đề cần giải quyết, ta có thể tìm ra nhiều thuật toán khác nhau Có những thuật toán thiết kế đơn giản, dễ hiểu, dễ lập trình và sửa lỗi, tuy nhiên thời gian

Process Output Input

Hình 1 1 Quy trình xử lý cơ bản của máy tính

Trang 17

thực hiện lớn và tiêu tốn nhiều tài nguyên máy tính Ngược lại, có những thuật toán thiết kế và lập trình rất phức tạp, nhưng cho thời gian chạy nhanh hơn, sử dụng tài nguyên máy tính hiệu quả hơn Khi đó, câu hỏi đặt ra là ta nên lựa chọn giải thuật nào

để thực hiện?

Đối với những chương trình chỉ được thực hiện một vài lần thì thời gian chạy không phải là tiêu chí quan trọng nhất Đối với bài toán kiểu này, thời gian để lập trình viên xây dựng và hoàn thiện thuật toán đáng giá hơn thời gian chạy của chương trình và như vậy những giải thuật đơn giản về mặt thiết kế và xây dựng nên được lựa chọn

Đối với những chương trình được thực hiện nhiều lần thì thời gian chạy của chương trình đáng giá hơn rất nhiều so với thời gian được sử dụng để thiết kế và xây dựng nó Khi đó, lựa chọn một giải thuật có thời gian chạy nhanh hơn (cho dù việc thiết kế và xây dựng phức tạp hơn) là một lựa chọn cần thiết Trong thực tế, trong giai đoạn đầu của việc giải quyết vấn đề, một giải thuật đơn giản thường được thực hiện trước như là 1 nguyên mẫu (prototype), sau đó nó sẽ được phân tích, đánh giá, và cải tiến thành các phiên bản tốt hơn

2 Thuật giải đệ quy

2.1.Khái niệm về đệ qui

Khái niệm: Vấn đề đệ quy là vấn đề được định nghĩa bằng chính nó

Trang 18

2 điều kiện quan trọng:

- Tồn tại bước đệ quy

- Điều kiện dừng

2.2.Thiết kế giải thuật đệ qui

2.2.1.Hệ thức truy hồi

Khái niệm: Hệ thức truy hồi của 1 dãy An là công thức biểu diễn phần tử An thông

qua 1 hoặc nhiều số hạng trước của dãy

Hình 1 3 Mô tả hệ thức truy hồi

Ví dụ 1: Vi trùng cứ 1 giờ lại nhân đôi Vậy sau 5 giờ sẽ có mấy con vi trùng nếu ban đầu có 2 con?

Đệ quy tuyến tính với V(h)=2*V(h-1) và điều kiện dừng V(0) = 2

Ví dụ 2: Gửi ngân hàng 1000 USD, lãi suất 12%/năm Số tiền có được sau 30 năm là bao nhiêu?

Đệ quy tuyến tính với T(n)=1.12*T(n-1) và điều kiện dừng V(0) = 1000

2.2.2.Chia để trị (divide & conquer)

Khái niệm:

- Chia bài toán thành nhiều bài toán con

Trang 19

- Giải quyết từng bài toán con

- Tổng hợp kết quả từng bài toán con để ra lời giải

Thuật toán mô tả chia để trị:

{

if (P đủ nhỏ)

Xử lý P else { Chia P  P1, P2, …, Pn for (int i=1;i<=n;i++) Trị(Pi);

Tổng hợp kết quả }

• Nếu x < A[mid]  tìm trong đoạn [l, mid – 1]

• Ngược lại  tìm trong đoạn [mid + 1, r]

Trang 20

và XLYL+XNYN = (XL-XN)(YN-YL)+XLYL+XNYN

Nhân 3 số nhỏ hơn (độ dài ½) đến khi có thể nhân được ngay

2.2.3.Lần ngược (Backtracking)

Khái niệm

- Tại bước có nhiều lựa chọn, ta chọn thử 1 bước để đi tiếp

- Nếu không thành công thì “lần ngược” chọn bước khác

- Nếu đã thành công thì ghi nhận lời giải này đồng thời “lần ngược” để truy tìm lời giải mới

- Thích hợp giải các bài toán kinh điển như bài toán 8 hậu và bài toán mã

đi tuần

Hình 1 4 Mô tả lần ngược (Backtracking) 2.3.Áp dụng thuật giải đệ qui

Một số bài toán kinh điển

Hình 1 5 Một số bài toán kinh điển 2.3.1 Tháp Hà Nội

Mô tả bài toán: Có 3 cột A, B và C và cột A hiện có N đĩa Tìm cách chuyển N đĩa

từ cột A sang cột C sao cho:

- Một lần chuyển 1 đĩa

- Đĩa lớn hơn phải nằm dưới

- Có thể sử dụng các cột A, B, C làm cột trung gian

Trang 21

Hình 1 6 Bài toán tháp Hà Nội 2.3.2 Tám hậu

Mô tả bài toán: Cho bàn cờ vua kích thước 8x8 Hãy đặt 8 hoàng hậu lên bàn cờ này sao cho không có hoàng hậu nào “ăn” nhau:

Trang 22

DANH MỤC HÌNH ẢNH CHƯƠNG 1

Hình 1 1 Quy trình xử lý cơ bản của máy tính 3 Hình 1 2 Mô tả các bước tính tổng S(n)=1+2+3+…+n với S(10) và S(11) 4 Hình 1 3 Mô tả hệ thức truy hồi 5 Hình 1 4 Mô tả lần ngược (Backtracking) 7 Hình 1 5 Một số bài toán kinh điển 7 Hình 1 6 Bài toán tháp Hà Nội 8 Hình 1 7 Bài toán tám hậu 8

Trang 23

CÂU HỎI VÀ BÀI TẬP

1 Hãy trình bày một số ví dụ về định nghĩa theo kiểu đệ qui

2 Một chương trình đệ qui khi gọi chính nó thì bài toán khi đó có kích thước như thế nào so với bài toán ban đầu? Để chương trình đệ qui không bị lặp vô hạn thì cần phải làm gì?

3 Hãy cho biết tại sao khi chương trình có thể viết dưới dạng lặp hoặc cấu trúc khác thì không nên sử dụng đệ qui?

4 Viết chương trình đệ qui tính tổng các số lẻ trong khoảng từ 1 đến 2n+1

5 Hãy cho biết các bước thực hiện chuyển đĩa trong bài toán tháp Hà Nội với số lượng đĩa là 5

Trang 24

CHƯƠNG 2: CÁC THUẬT GIẢI SẮP XẾP VÀ TÌM KIẾM

Mục tiêu: Trình bày được các giải thuật sắp xếp và tìm kiếm Phân biệt được các thuật

toán sắp xếp và tìm kiếm Sinh viên có khả năng cài đặt được các thuật toán sắp xếp và tìm kiếm

1 Một số phương pháp sắp xếp đơn giản

Sắp xếp là quá trình xử lý một danh sách các phần tử (hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử

Sắp xếp dãy số a 1 , a2 , ,aN là thực hiện việc bố trí lại các phần tử sao cho hình thành được dãy mới a k1 , ak2 , ,akN có thứ tự ( giả sử xét thứ tự tăng) nghĩa là

aki aki-1 Mà để quyết định được những tình huống cần thay đổi vị trí các phần tử trong dãy, cần dựa vào kết quả của một loạt phép so sánh Chính vì vậy, hai thao tác

so sánh và gán là các thao tác cơ bản của hầu hết các thuật toán sắp xếp

1.1 Đổi chỗ trực tiếp (Interchange Sort)

a Khái niệm nghịch thế:

- Xét một mảng các số a[0], a[1], … a[n-1]

- Nếu có i<j và a[i] > a[j], thì ta gọi đó là một nghịch thế

- Lặp lại xử lý trên với các phần tử tiếp theo trong dãy

c Ví dụ:

Cho dãy số a :

Trang 25

Sắp xếp dãy a theo trình tự tăng dần, trình bày các bước (có thay đổi) chạy giải thuật sắp xếp theo phương pháp đổi chổ trực tiếp (Interchange Sort)?

Lưu ý: Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

Trang 27

d Thuật toán:

// input: dãy (a, n)

// output: dãy (a, n) đã được sắp xếp

 Bước 1: i = 0; // bắt đầu từ đầu dãy

 Bước 2: j = i+1;

 Bước 3: Trong khi j < n thực hiện:

 Nếu a[i]>a[j] thì đổi chỗ a[i], a[j]

for (int i=0 ; i<n-1 ; i++)

for (int j=i+1; j<n ; j++)

if(a[i]>a[j]) //nếu có nghịch thế thì đổi chỗ

 Ở lần xử lý thứ i có vị trí đầu dãy là i

Trang 28

 Lặp lại xử lý trên cho đến khi không còn cặp phần tử nào để xét

Trang 30

i= 5, j= 6

c Thuật toán:

// input: dãy (a, n)

// output: dãy (a, n) đã được sắp xếp

 Bước 1: i = 0;

 Bước 2: j = n-1; //Duyệt từ cuối dãy ngược về vị trí i

 Trong khi (j > i) thực hiện:

- Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

for (int i=0; i<n-1; i++)

for (int j=n-1; j>i; j ) if(a[j] < a[j-1])

Trang 31

- Tìm cách chèn phần tử a[i]vào vị trí thích hợp của đoạn đã được sắp

để có dãy mới a[0] , a[1] , , a[i-1] trở nên có thứ tự

- Vị trí này chính là pos thỏa :

a[pos-1] a[i ]< a[pos] (1posi) Chi tiết hơn:

- Dãy ban đầu a[0] , a[1] , , a[n-1], xem như đã có đoạn gồm một phần tử a[0] đã được sắp

- Thêm a[1] vào đoạn a[0] sẽ có đoạn a[0] a[1] được sắp

- Thêm a[2] vào đoạn a[0] a[1] để có đoạn a[0] a[1] a[2] được sắp

- Tiếp tục cho đến khi thêm xong a[n-1] vào đoạn a[0] a[1] a[n-1] sẽ có

dãy a[0] a[1]… A[n-1] được sắp b.Ví dụ:

Trang 32

// input: dãy (a, n)

// output: dãy (a, n) đã được sắp xếp

 Bước 1: i = 1; // giả sử có đoạn a[0] đã được sắp

 Bước 2: x = a[i]; //Tìm vị trí pos thích hợp trong đoạn a[0]

Trang 33

void InsertionSort(int a[], int n){

- Mảng có thứ tự thì a[i] = min(a[i], a[i+1], …, a[n-1])

Ý tưởng: mô phỏng một trong những cách sắp xếp tự nhiên nhất trong thực tế:

- Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu dãy hiện hành

- Xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử

Trang 34

// input: dãy (a, n)

// output: dãy (a, n) đã được sắp xếp

 Bước 1 : i = 0

 Bước 2 : Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n-1]

 Bước 3 : Nếu min  i: Đổi chỗ a[min] và a[i]

Trang 35

void SelectionSort(int a[], int n)

{

int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hành

for (int i=0; i<n-1; i++)

}

}

1.5 Phân hoạch (Quick Sort)

a Ý tưởng:

Phân hoạch dãy a1 a2 …an thành 3 thành phần :

 Dãy con 1 : Gồm các phần tử a1 …ai có giá trị không lớn hơn x.(<x)

 Dãy con 2 : Gồm các phần tử aj …an có giá trị không nhỏ hơn x.(>x)

 Dãy con thu 3: ai, aj =x

Với x là giá trị của một phần tử tuỷ ý trong dãy ban đầu

Sau khi phân hoạch, dãy ban đầu được chia làm 3 phần :

Trang 36

Phân hoạch đoạn l =1, r = 3: x = A[2] = 2

Phân hoạch đoạn l = 5, r = 8: x = A[6] = 6

Phân hoạch đoạn l = 7, r = 8: x = A[7] = 6

Dừng

Trang 37

c Thuật toán:

Giải thuật để sắp xếp một dãy al…ar

 Bước 1 : Phân hoạch dãy al…ar thành các dãy con :

 Dãy con 1 : al…aj < x

 Dãy con 2 : aj+1…ai-1 = x

 Dãy con 3 : ai…ar > x

 Bước 2 :

 Nếu (l < j) Phân hoạch dãy al…aj

 Nếu (i < r) Phân hoạch dãy ai…ar

Giải thuật để phân hoạch một dãy al…ar thành 2 dãy con:

 Bước 1 : Chọn tuỳ ý a[k] làm giá trị mốc l<=k<=r

X = a[k]; i=l, j=r

 Bước 2 : Phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] nằm sai chỗ:

 Bước 2a : Trong khi a[i] <x i++;

 Bước 2b : Trong khi a[j]>x j ;

 Bước 2c : Nếu i<j Hoán vị (a[i],a[j])

Trang 38

while (a[j]>x)

j ;

if (i<=j) { Swap(a[i],a[j]);

i++;

j ;

} } while (i<j);

- Số lượng phép hoán vị thực hiện tùy thuộc vào kết quả so sánh

Hình 2 1 Nhận xét đánh giá Interchange Sort 1.6.2 Bubble Sort

- Số lượng các phép so sánh xảy ra không phụ thuộc vào tình trạng của dãy số ban đầu

- Số lượng phép hoán vị thực hiện tùy thuộc vào kết quả so sánh

Hình 2 2 Nhận xét đánh giá Bubble Sort

Trang 39

1.6.3 Insertion Sort

- Các phép so sánh xảy ra trong mỗi vòng lặp tìm vị trí thích hợp pos Mỗi lần xác định vị trí pos đang xét không thích hợp -> dời chỗ phần tử a[pos-1] đến vị trí pos

- Giải thuật thực hiện tất cả N-1 vòng lặp tìm pos, do số lượng phép so sánh

và dời chỗ này phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ có thể ước lược trong từng trường hợp như sau:

Hình 2 3 Nhận xét đánh giá Insertion Sort 1.6.4 Selection Sort

- Ở lượt thứ i, cần (n-i) lần so sánh để xác định phần tử nhỏ nhất hiện hành

- Số lượng phép so sánh không phụ thuộc vào tình trạng của dãy số ban đầu

- Trong mọi trường hợp, số lần so sánh là:

2

1) n(n i) (n

1 n

1 i

Trang 40

Hình 2 5 Nhận xét đánh giá Quick Sort

2 Một số phương pháp tìm kiếm

Tìm kiếm là một yêu cầu rất thường xuyên trong đời sống hàng ngày cũng như trong tin học

Ví dụ:

- Tìm kiếm một sinh viên trong lớp

- Tìm kiếm một tập tin, thư mục trong máy

Để đơn giản ta xét bài toán tìm kiếm như sau: Cho một dãy số gồm các phần tử a1, a2, , an Cho biết trong dãy này có phần tử nào có giá trị bằng X (cho trước) hay không? Xét hai cách tìm kiếm:

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

- Nếu có phần tử bằng X, thuật toán dừng lại (thành công)

- Nếu đến cuối danh sách mà không có phần tử nào bằng X, thuật toán dừng lại (không thành công)

Ngày đăng: 29/01/2021, 12:33

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

TÀI LIỆU LIÊN QUAN

w