1. Trang chủ
  2. » Thể loại khác

BÀI 1: GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

30 7 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 30
Dung lượng 453,21 KB

Nội dung

Bài 1: Giới thiệu cấu trúc liệu giải thuật BÀI 1: GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mục tiêu Nội dung Sau học này, bạn có thể:  Mơ tả đối tượng phương pháp nghiên cứu môn học  Trình bày khái niệm cấu trúc liệu  Liệt kê xác định kiểu liệu kiểu liệu số nguyên, số thực, logic, ký tự  Mô tả kiểu liệu trừu tượng cấu trúc liệu ghi, kiểu liệu mảng cách xác  Mô tả ngôn ngữ diễn đạt giải thuật vận dụng để diễn đạt thuật tốn  Trình bày thuật tốn đệ quy, thuật tốn quay lui cách xác     Khái niệm Kiểu liệu Ngôn ngữ diễn đạt giải thuật Đệ quy Thời lượng học tiết CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Chương trình máy tính dãy câu lệnh để xử lý thông tin đem lại kết mong muốn cho người sử dụng Điều có nghĩa đối tượng xử lý chương trình thơng tin Thơng thường thơng tin đối tượng lấy từ thực tế suy diễn từ thực tế Tuy nhiên đời sống thực đối tượng thường mang nhiều thơng tin Ví dụ thông tin người, mặt vật lý có chiều cao, cân nặng, giới tính, nhóm máu, màu da Về mặt xã hội có trình độ học vấn, ngoại ngữ, số IQ, khả ngoại giao, Vì khó mơ tả cách cụ thể chi tiết đối tượng vào chương trình Thay vào đó, thơng tin đối tượng có liên quan, tác động tới mục tiêu xử lý cần biểu diễn chương trình Ví dụ, để xây dựng phần mềm quản lý nhân sự, mô tả nhân viên sử dụng thơng tin như: quê quán, năm sinh, nơi ở, trình độ học vấn, cấp bậc tay nghề, bậc lương, vị trí Mặt khác, thông tin lấy từ thực tế thường thông tin trừu tượng biểu diễn cách trực tiếp máy tính Vì với thông tin cần biểu diễn kiểu liệu phù hợp máy 1.1 Khái niệm Cấu trúc liệu cách thức tổ chức xếp liệu để biểu diễn thông tin máy tính Dữ liệu lưu trữ nhớ để trực tiếp xử lý, lưu thiết bị lưu trữ ngồi ví dụ dạng tệp liệu ổ cứng Khi thông tin biểu diễn hay lưu trữ máy, cơng việc cịn lại người lập trình phải xử lý thơng tin đó, hay nói cách khác thao tác liệu nhằm giải vấn đề đặt Khi số lượng thơng tin ít, hay lượng liệu cần xử lý vài cá thể đơn lẻ, việc xử lý liệu trở nên đơn giản, mức độ phức tạp việc xử lý nói chung khơng ảnh hưởng nhiều đến hiệu suất chương trình Vấn đề trở nên đáng quan tâm lượng liệu cần xử lý lớn, thời gian xử lý liệu đóng vai trị định tới hiệu suất chương trình Thuật ngữ giải thuật sử dụng rộng rãi khoa học máy tính để mô tả phương pháp giải vấn đề phù hợp cho việc thực thi máy tính Trong khn khổ giáo trình này, giải thuật hiểu biện pháp, cách thức để thao tác liệu Trên thực tế tồn nhiều giải thuật kiểu cấu trúc liệu Quyết định sử dụng cấu trúc liệu giải thuật cho vấn đề định phụ thuộc vào nhiều yếu tố yêu cầu chương trình cần triển khai Ví dụ khả lưu trữ liệu máy Trong trường hợp nhớ máy đủ lớn, tồn liệu lưu trữ nhớ trong, thời gian truy cập liệu nhanh Ngồi máy tính đại cịn có thêm loại nhớ truy cập nhanh, vùng đệm vi xử lý nhớ Dữ liệu đọc từ nhớ vào nhớ truy cập nhanh theo khối nhằm tăng tốc độ truy cập liệu Vì thứ tự xử lý liệu đóng vai trị định Nói chung liệu thường ưu tiên xử lý liên tiếp, tính sẵn sàng liệu nhớ truy cập nhanh nâng cao Ngược lại, trường hợp nhớ máy khơng đủ lớn để lưu trữ tồn liệu, thiết bị lưu trữ sử dụng để lưu trữ liệu Dữ liệu đọc vào nhớ cần phải thao tác chúng Thiết bị lưu trữ ngồi cịn có CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật tác dụng lưu trữ liệu lâu dài, qua phiên làm việc máy biết, sau phiên làm việc máy, toàn liệu lưu nhớ bị xóa không khôi phục phiên làm việc Trường hợp thường gặp liệu ghi vào tệp ổ cứng máy tính Có giải thuật phức tạp tỏ hiệu áp dụng cấu trúc liệu phức tạp thực nhiều lần Tuy nhiên áp dụng với cấu trúc liệu đơn giản hơn, số lần áp dụng hơn, giải thuật lại hiệu giải thuật đơn giản Trong khn khổ giáo trình này, giới thiệu cho học viên cấu trúc liệu giải thuật theo trình tự định để học viên dễ tiếp cận Nắm rõ cấu trúc giải thuật giúp cho học viên tìm hiểu dễ dàng cấu trúc liệu giải thuật phức tạp, nâng cao Khi nói đến cấu trúc liệu ta quan tâm đến vấn đề sau:  Cách cài đặt cấu trúc liệu  Cách thực thao tác với cấu trúc liệu o Tạo o Thêm phần tử o Xóa phần tử o Tìm phần tử… Cịn nói đến giải thuật ta quan tâm đến vấn đề sau:  Tư tưởng giải thuật  Nội dung thuật toán cách cài đặt thuật tốn  Đánh giá độ phức tạp thời gian độ phức tạp nhớ 1.2 Kiểu liệu Như nhắc đến phần trên, thông tin từ thực tế biểu diễn máy tính dạng kiểu liệu Tuy nhiên việc lựa chọn kiểu liệu để biểu diễn thông tin không đơn giản Như biết, máy tính biểu diễn liệu dựa số nhị phân (chỉ nhận hai giá trị 1) Trường giá trị biểu diễn tập hợp giá trị rời rạc, khơng thích hợp cho việc biểu diễn trực tiếp giá trị thực tế thường giá trị liên tục Vì kiểu liệu dùng để biểu diễn thông tin cần phải sát với kiểu giá trị thơng tin thực tế Một yếu tố cần xem xét lựa chọn kiểu liệu thao tác thực liệu Ví dụ để biểu diễn chiều dài (được tính mét), thực tế giá trị chiều dài thường giá trị thực (ví dụ 102,35m) Vì kiểu liệu gần để biểu diễn chiều dài máy tính số thực dấu phẩy động (floating – point number), số trường hợp số thực dấu phấy tĩnh Nhưng giá trị chiều dài tương đối lớn, ví dụ vài chục km vài trăm km, sử dụng kiểu liệu số nguyên để biểu diễn chiều dài theo m theo cm Mặc dù độ xác liệu biểu diễn giảm so với việc sử dụng kiểu liệu số thực dấu phấy động, lại giúp nâng cao tốc độ tính tốn thao tác số ngun máy tính thường nhanh nhiều so với với thao CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật tác số thực Quyết định sử dụng kiểu liệu số thực hay số nguyên phụ thuộc vào độ xác u cầu chương trình Trong khn khổ thiết kế chương trình, kiểu liệu sử dụng không nên mức độ thấp phụ thuộc vào cấu trúc máy tính cụ thể hay ngơn ngữ lập trình làm giảm độ linh động triển khai chương trình Vì kiểu liệu trừu tượng thường sử dụng để thiết kế chương trình Việc sử dụng kiểu liệu trừu tượng giúp cho người lập trình khơng phải q quan tâm đến cách thức biểu diễn cụ thể liệu máy tính Mặt khác, mức độ trừu tượng liệu khơng nên q cao gây khó khăn cho việc triển khai chương trình Kiểu liệu trừu tượng sử dụng sát với thực tế giúp cho người triển khai dễ dàng lựa chọn kiểu liệu cụ thể để biểu diễn máy tính Ví dụ, khơng nên sử dụng kiểu liệu "tọa độ" để biểu diễn vị trí đối tượng thực tế, người triển khai chương trình khơng biết dùng kiểu liệu cụ thể Đó kiểu tọa độ đề các, hay kiểu tọa độ trục? Mỗi trường tọa độ biểu diễn số nguyên hay số thực? Phần giới thiệu kiểu liệu trừu tượng thường sử dụng việc thiết kế chương trình, hay thiết kế giải thuật 1.2.1 Các kiểu liệu Kiểu liệu kiểu liệu có sẵn hầu hết máy tính, hỗ trợ hầu hết ngơn ngữ lập trình Chúng bao gồm kiểu liệu số nguyên (INTEGER), kiểu liệu số thực (REAL), kiểu liệu giá trị logic (BOOLEAN), kiểu liệu ký tự (CHAR) Ngoài kiểu liệu hay sử dụng thuật toán kiểu liệu trỏ (POINTER) 1.2.1.1 Kiểu liệu số nguyên (INTEGER) Kiểu liệu số nguyên biểu diễn giá trị nguyên thực tế Trên thực tế có hai kiểu liệu số nguyên số nguyên có dấu (biểu diễn giá trị âm giá trị dương) số nguyên không dấu (chỉ biểu diễn giá trị lớn 0) Nhưng nhắc đến số nguyên thường ngầm định kiểu giá trị số nguyên có dấu Trong trường hợp muốn sử dụng kiểu liệu số nguyên không dấu cần khai báo rõ ràng Trường giá trị kiểu liệu số nguyên phụ thuộc vào số lượng bit sử dụng để biểu diễn Giả thiết kiểu liệu số nguyên biểu diễn n bit hệ thống biểu diễn phần bù 2, trường giá trị kiểu liệu số nguyên nằm khoảng từ –2n-1 2n-1 -1 Thông thường số bit để biểu diễn kiểu liệu máy tính bội số 8, n = 8, 16, 32, 64, 128 Mỗi giá trị cụ thể n tương ứng với kiểu liệu máy tính Việc định sử dụng kiểu liệu để biểu diễn số nguyên phụ thuộc vào trường giá trị thông tin thực tế Các thao tác thực kiểu liệu nguyên bao gồm cộng (+), trừ (–), nhân (*), chia (/, DIV), phần dư (MOD) Thao tác chia / để biểu diễn kết dạng số thực, thao tác chia DIV (hay gọi phần thương theo thuật ngữ số học) để biểu diễn kết dạng số nguyên Một lưu ý thực thao tác phần thương (DIV) giá trị âm phần thương làm tròn xuống CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Ví dụ 1.1 1; –1; 2; –2 số nguyên 31 / = 6.2 31 DIV = 31 MOD = 31 chia cho thương dư 1, phép DIV phép chia lấy thương nên 31 DIV = 6, phép MOD phép chia lấy dư nên 31 MOD = –31 DIV = –7 –31 MOD = –31 chia thương dư (–31 = * –5 + 4) 1.2.1.2 Kiểu liệu số thực (REAL) Kiểu liệu số thực dùng để biểu diễn giá trị thực Khác với kiểu liệu số nguyên, kiểu liệu số thực không biểu diễn xác giá trị thực thực tế Lý kiểu liệu số thực triển khai máy tính dựa biểu diễn nhị phân, trường giá trị kiểu liệu số thực tập hợp giá trị rời rạc Trong giá trị thực thực tế liên tục Vì biểu diễn giá trị thực kiểu liệu số thực thường gây sai số làm tròn (round – off error) Hệ kết thao tác kiểu liệu số thực thường không xác Chúng ta khơng sâu vào vấn đề lĩnh vực nghiên cứu rộng khoa học máy tính Các thao tác kiểu liệu số thực bao gồm cộng (+), trừ (–), nhân (*), chia (/) Ngồi cịn thao tác hay sử dụng thao tác chuyển đổi từ kiểu liệu số thực sang kiểu liệu số nguyên ([]), thao tác cho phép lấy phần trị nguyên số thực Vì làm trịn số thực x tương đương với [x + 0.5] 1.2.1.3 Kiểu liệu logic (BOOLEAN) Kiểu liệu logic dùng để biểu diễn giá trị logic, bao gồm hai giá trị (TRUE) sai (FALSE) Kiểu liệu sử dụng để biểu diễn kết so sánh giá trị thuộc kiểu liệu số (nguyên thực) Ví dụ phép so sánh = đem lại kết sai (FALSE), phép so sánh 3.5 < 9.0 đem lại kết (TRUE) Các thao tác kiểu liệu logic bao gồm phép nhân (AND), phép cộng (OR), phép đảo (NOT) Kết phép cho bảng đây: P CS101_Bai1_v2.0014101214 Q P AND Q P OR Q NOT(P) TRUE TRUE(1) TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE P Q P AND Q P OR Q NOT(P) 1 1 0 0 1 0 0 Bài 1: Giới thiệu cấu trúc liệu giải thuật 1.2.1.4 Kiểu liệu ký tự (CHAR) Kiểu liệu ký tự dùng để biểu diễn tập hợp ký tự Trên thực tế có nhiều ký tự khác phụ thuộc vào ngôn ngữ cụ Vì đây, khơng nhắc đến cách rõ ràng kiểu liệu ký tự bao gồm ký tự la tinh, ký tự thường từ 'a' đến 'z' ký tự in hoa từ 'A' đến 'Z', chữ số từ '0' đến '9' Ngồi cịn có hai ký tự đặc biệt dấu cách ' ' dấu kết thúc dòng Kiểu liệu ký tự xếp theo thứ tự theo quy tắc so sánh sau: 'A' < 'B' < < 'Z' < 'a' < 'b' < < 'z' < '0' < '1' < '9' Lưu ý viết số kiểu giá trị ký tự, cần phải đặt hai dấu nháy '' để phân biệt với số kiểu giá trị số, phân biệt với câu lệnh 1.2.1.5 Kiểu liệu trỏ (POINTER) Kiểu liệu trỏ dùng để lưu trỏ đến kiểu liệu khác Trên thực tế giá trị "con trỏ" địa đến vùng nhớ định Kiểu trỏ kiểu liệu vùng nhớ Ví dụ trỏ kiểu số ngun trỏ đến vùng nhớ lưu trữ số nguyên Trong trỏ số thực trỏ đến vùng nhớ khác lưu trữ số thực Hai thao tác liên quan đến trỏ lấy liệu lưu trữ vị trí trỏ (VAL), lấy địa liệu nhớ để ghi lại biến trỏ (ADR) 1.2.2 Kiểu liệu trừu tượng Nói chung đối tượng thực tế thường mang nhiều thơng tin địi hỏi phải sử dụng đồng thời nhiều kiểu liệu nêu để biểu diễn Do để tạo điều kiện thuận lợi cho người lập trình thiết kế liệu, hầu hết ngơn ngữ lập trình cho phép người dùng định nghĩa kiểu liệu riêng dựa kiểu liệu sẵn có Những kiểu liệu định nghĩa gọi kiểu liệu trừu tượng, để phân biệt với kiểu liệu Phần giới thiệu cho học viên số kiểu liệu trừu tượng thường dùng trình thiết kế chương trình 1.2.2.1 Cấu trúc liệu ghi (RECORD) Cách thức đơn giản thông thường để tổ chức liệu nhóm tất phần tử thuộc kiểu liệu vào tổ hợp Các phần tử thuộc kiểu liệu bản, kiểu liệu trừu tượng khác Các ví dụ đơn giản cấu trúc ghi kiểu liệu số phức bao gồm phần thực phần ảo thuộc kiểu liệu số thực Tương tự kiểu liệu tọa độ, bao gồm 2, nhiều tọa độ khác tùy thuộc tọa độ chiều, chiều hay nhiều chiều Hoặc kiểu liệu để mô tả cá nhân bao gồm thông tin đơn giản họ, tên, ngày sinh, giới tính Thuật ngữ ghi (record) xuất phát từ lĩnh vực xử lý liệu Các kiểu liệu tổng hợp thường xuất tệp ngân hàng liệu để ghi lại đặc tính, CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật thông tin liên quan cá nhân đối tượng Thuật ngữ ghi sử dụng rộng rãi để mô tả tập hợp liệu thông tin Các liệu lưu ghi gọi trường liệu (field) ghi Để định nghĩa cấu trúc ghi mới, dùng quy tắc đây: Định nghĩa kiểu struct ten_cua_cau_truc { kiểu_dữ_liệu_1 tên_trường_dữ_liệu_1; kiểu_dữ_liệu_2 tên_trường_dữ_liệu_2; ……………… }; Để truy cập trường liệu ghi, viết sau: TÊN_CẤU_TRÚC.TÊN_TRƯỜNG_DỮ_LIỆU Ví dụ 1.2 Kiểu liệu số phức: Định nghĩa kiểu liệu: struct so_phuc { float phan_thuc; float phan_ao; }; Để truy cập phần thực phần ảo phần tử x thuộc kiểu liệu so_phuc, viết sau: x.phan_thuc, x.phan_ao 1.2.2.2 Cấu trúc liệu mảng (ARRAY) Khác với cấu trúc liệu ghi dùng để tập hợp kiểu liệu khác nhau, nhiều trường hợp, người dùng muốn lưu trữ số lượng định liệu thuộc kiểu liệu Đó mục đích cấu trúc liệu mảng Cấu trúc liệu mảng sử dụng để lưu trữ liên tiếp phần tử thuộc kiểu liệu Mỗi phần tử mảng xác định vị trí mảng Trên thực tế ngơn ngữ lập trình có kiểu riêng để đánh số thứ tự mảng Ví dụ FORTRAN đánh số 1, C Java đánh số Cấu trúc mảng có lẽ cấu trúc sử dụng nhiều chương trình Cấu trúc mảng cịn gọi cấu trúc đồng phần tử mảng bắt buộc phải kiểu liệu Ngồi cịn gọi cấu trúc liệu truy nhập ngẫu nhiên, phần tử mảng truy xuất cách dễ dàng nhanh chóng dựa vào vị trí mảng Vị trí phần tử gọi số (index) phần tử mảng Cách thao tác cấu trúc mảng nói chung thao tác phần tử mảng Vì thao tác cấu trúc mảng thao tác truy xuất ([???]) Ví dụ, x biến thuộc kiểu cấu trúc mảng, để truy xuất phần tử thứ mảng sử dụng: x[5] CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Một trường hợp đặc biệt cấu trúc liệu mảng kiểu liệu xâu ký tự (STRING) Mỗi xâu ký tự (STRING) mảng kiểu liệu ký tự (CHAR), kết thúc ký tự đặc biệt Thơng thường ký tự kết thúc dịng ngơn ngữ lập trình có giá trị mã hóa Các thao tác xâu ký tự kể hiển thị xâu ký tự, so sánh xâu ký tự, ghép nối xâu ký tự, Mỗi thao tác xâu ký tự dựa thao tác mảng Ví dụ để hiển thị xâu ký tự, cần phải duyệt qua tất phần tử mảng, in phần tử (ký tự) hết xâu Mảng chiều Cấu trúc mảng cịn thường sử dụng để mã hóa đối tượng thuộc kiểu ma trận toán học Ma trận chiều, hay vector lưu trữ mảng chiều trình bày Để biểu diễn ma trận hai chiều phải sử dụng mảng hai chiều Các phần tử mảng hai chiều xếp theo hàng cột Các phần tử thuộc hàng xiếp liên tiếp Để truy xuất đến phần tử mảng hai chiều, ta phải sử dụng hai số: số cột số hàng Ví dụ, để tham chiếu đến phần tử thuộc hàng thứ 3, cột thứ mảng hai chiều a, ta sử dụng cú pháp: a[3][5] Vì để duyệt mảng hai chiều ta phải duyệt hàng phần tử mảng Tương tự ta mở rộng khái niệm mảng nhiều chiều Tuy nhiên thực tế phải sử dụng đến mảng nhiều chiều Hơn việc tổ chức mảng nhiều chiều nhớ phức tạp nhiều so với mảng chiều mảng hai chiều 1.3 Ngôn ngữ diễn đạt giải thuật Cũng giống với cấu trúc liệu, với mục đích thiết kế chương trình khơng phụ thuộc vào máy tính hay ngơn ngữ định, giải thuật phải diễn đạt hay biểu diễn ngơn ngữ chung Ngơn ngữ vừa phải mang tính trừu tượng giúp cho người dùng khơng cần quan tâm tới đặc tả máy tính hay câu lệnh cụ thể ngôn ngữ Hơn nữa, ngôn ngữ diễn đạt giải thuật gần với ngơn ngữ tự nhiên dễ cho học viên nắm bắt giải thuật viết Nhưng ngôn ngữ diễn đạt giải thuật phải gần với ngơn ngữ lập trình có tốt để giúp cho người triển khai phần mềm dễ dàng chuyển từ thiết kế chương trình sang triển khai ngơn ngữ lập trình cụ thể lựa chọn Nói chung khơng có quy chuẩn định cho ngơn ngữ diễn đạt phần mềm Vì tồn nhiều phiên ngôn ngữ diễn đạt phần mềm Có phiên xây dựng nhiều dựa ngơn ngữ lập trình cụ thể mà nhiều người biết tới Có thể kể ngơn ngữ lập trình Pascal hay ngơn ngữ lập trình C Ngơn ngữ diễn đạt giải thuật cịn phụ thuộc vào ngôn ngữ tự nhiên, hay ngôn ngữ giao tiếp chung người viết người sử dụng Các ngôn ngữ diện đạt giải thuật thường sử dụng thuật ngữ tiếng Anh với hai lý do:  Câu lệnh ngơn ngữ lập trình thường dựa thuật ngữ tiếng Anh  Phần lớn tài liệu công nghệ thông tin viết tiếng Anh, bao gồm tài liệu cấu trúc liệu giải thuật CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Việc lựa chọn sử dụng thuật ngữ tiếng Anh có ưu điểm mặt giúp cho học viên làm quen dần với thuật ngữ công nghệ thông tin tiếng Anh, tiện cho việc đọc tài liệu giải thuật diễn tả tiếng Anh Mặt khác học viên có kiến thức ngơn ngữ lập trình cảm thấy ngơn ngữ diễn đạt giải thuật gần với ngôn ngữ lập trình Mục đích phần giới thiệu cho học viên ngôn ngữ diễn đạt giải thuật sử dụng để mô tả giải thuật nghiên cứu phần sau 1.3.1 Cấu trúc liệu giải thuật viết ngôn ngữ diễn đạt giải thuật Một giải thuật viết bao gồm hai phần:  Phần định nghĩa, hay phần đầu giải thuật Phần mô tả khái quát giải thuật bao gồm liệu đầu vào, điều kiện áp dụng giải thuật, kết trả mong muốn việc thực giải thuật  Phần triển khai, hay phần thân giải thuật Phần bao gồm việc khai báo biến liệu sử dụng giải thuật, mô tả lệnh cụ thể cần thực để triển khai giải thuật Phần định nghĩa giải thuật có cấu trúc sau: Algorithm name Input… Pre-condition Post-condition Output Ví dụ 1.3 Để diễn tả giải thuật tính giai thừa, phần định nghĩa viết sau: Algorithm factorial Input: n an integer Precondition: n >= Post-condition: calculate the factorial of n Phần triển khai giải thuật bao gồm hai phần nhỏ khai báo liệu khối lệnh cụ thể để thực giải thuật đặt hai dấu móc lệnh { } mặt tổng quan, cấu trúc giải thuật viết sau: Algorithm name Input: Pre-condition Post-condition Declarations { List of operations } Phần giới thiệu cách khai báo biến, kiểu câu lệnh ngôn ngữ diễn đạt giải thuật CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật 1.3.2 Khai báo biến Để khai báo biến (Variable) để sử dụng giải thuật, dùng cấu trúc: TYPE variable; Ví dụ: int n; Ví dụ 1.4 Các ví dụ khai báo biến: int n; // Kiểu số nguyên float x; // Kiểu số thực char c; // Kiểu ký tự Việc khai báo biến thuộc kiểu liệu ghi thực theo quy tắc Tuy nhiên cần lưu ý cần phải định nghĩa kiểu liệu ghi (như nêu phần cấu trúc ghi) trước sử dụng kiểu liệu ghi Phần khai báo kiểu liệu đặt bên phần định nghĩa giải thuật Khai báo biến thuộc cấu trúc mảng TYPE variable[size]; Ví dụ: int arr [10]; Ví dụ 1.5 a : MẢNG 25 phần tử thuộc KIỂU SỐ NGUYÊN int arr [25]; Kích thước mảng hai chiều khai báo theo cú pháp: số hàng x số cột Ví dụ để khai báo mảng có 10 hàng 25 cột, ta sử dụng A : MẢNG 10x25 phần tử thuộc KIỂU SỐ NGUYÊN int arr [10][25]; Lưu ý: để giải thuật ngắn gọn, biến có kiểu liệu khai báo đồng thời Ví dụ để khai báo số nguyên a, b, c ta dùng: int a,b,c; //khai báo số nguyên a, b, c int a,b,c[10]; //khai báo số nguyên a, b mảng số nguyên c có 10 phần tử 1.3.3 Câu lệnh 1.3.3.1 Câu lệnh gán Câu lệnh gán dùng để gán giá trị cho biến Giá trị số biểu thức có kiểu giá trị với biến Cấu trúc câu lệnh gán: variable = constant/expression; Ví dụ: n = 5; Ví dụ 1.6 Phép gán giá trị cho biến kiểu số nguyên: int a,b,c; b = 5; c = 8; a = b + c; Trong đoạn lệnh trên, a, b, c biến thuộc kiểu số nguyên b c gán giá trị số nguyên, a gán giá trị biểu thức b c Sau thực đoạn lệnh này, biến mang giá trị: b = 5, c = 8, a = 13 10 CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Độ phức tạp toán phụ thuộc vào n Ở ta không đặc trưng độ phức tạp số lượng phép tính, mà dùng đại lượng tổng quát tài nguyên cần dùng R(n) Đó số lượng phép tính (có thể tính số lần truy nhập nhớ, ghi vào nhớ); thời gian thực chương trình (độ phức tạp thời gian) dung lượng nhớ cần phải cấp để chạy chương trình (độ phức tạp không gian) Xét quan hệ tài nguyên độ lớn đầu vào, tìm số C > 0, C không phụ thuộc vào n, cho với n đủ lớn, hàm R(n), g(n) dương R(n)  C.g(n) ta nói thuật tốn có độ phức tạp cỡ O(g(n))  Diễn giải Độ phức tạp khơng phải độ đo xác lượng tài nguyên máy cần dùng, mà đặc trưng cho động thái hệ thống kích thước đầu vào tăng lên Chẳng hạn với thuật tốn có độ phức tạp tuyến tính O(n), kích thước đầu vào tăng gấp đơi ước tính tài nguyên cần dùng tăng khoảng gấp đôi Nhưng với thuật tốn có độ phức tạp bình phương O(n2) tài nguyên tăng gấp bốn Mặt khác, với thuật tốn có độ phức tạp hàm mũ O(2n) cần công thêm đơn vị vào độ lớn đầu vào làm tài nguyên tăng gấp lần (tức theo cấp số nhân)  Các độ phức tạp thường gặp thuật tốn thơng thường gồm có: Độ phức tạp số, O(1) Số phép tính/thời gian chạy/dung lượng nhớ khơng phụ thuộc vào độ lớn đầu vào Chẳng hạn thao tác hệ thống: đóng, mở file Độ phức tạp tuyến tính, O(n) Số phép tính/thời gian chạy/dung lượng nhớ có xu hướng tỉ lệ thuận với độ lớn đầu vào Chẳng hạn tính tổng phần tử mảng chiều Độ phức tạp đa thức, O(P(n)), với P đa thức bậc cao (từ trở lên) Chẳng hạn thao tác tính tốn với mảng nhiều chiều (tính định thức ma trận) Độ phức tạp logarit, O(logn) (chú ý: bậc thấp so với O(n)) Chẳng hạn thuật tốn Euclid để tìm ước số chung lớn Độ phức tạp hàm mũ, O(2n) Trường hợp bất lợi phi thực tế thực thuật toán với độ phức tạp Ví dụ: Xét thuật tốn tìm kiếm phần tử lớn dãy số nguyên cho trước Input: a mảng số nguyên, n > 0, số số mảng a Output: Max, số lớn mảng a Giải thuật: Max = a[0]; for (int i = 0; i < n; i++) if(Max < a[i]) Max = a[i]; Vì phép tốn dùng phép toán so sánh sơ cấp nên ta dùng số phép toán sơ cấp để đo độ phức tạp thuật toán Ta dễ dàng thấy số phép toán so sánh sơ cấp sử dụng 2(n – 1) Vì ta nói độ phức tạp thuật tốn nói O(n)(gọi độ phức tạp tuyến tính.) 16 CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật 1.5 Đệ quy 1.5.1 Giới thiệu đệ quy (Recurrence) Recurrence tiếng Anh có nghĩa gọi lại Bản chất việc thiết kế giải thuật theo phương pháp đệ quy việc gọi lại giải thuật q trình thiết kế giải thuật Các giải thuật thiết kế theo phương pháp đệ quy gọi chung tên giải thuật đệ quy Vì giải thuật đệ quy gọi lại mình, nên để thiết kế giải thuật đệ quy cần phải quy định cách gọi giải thuật ngôn ngữ thiết kế giải thuật Lời gọi giải thuật có cấu trúc sau: TÊN_GIẢI_THUẬT (danh sách tham số đầu vào); Ví dụ để thực lời gọi giải thuật phần dư thiết kế trên: a = PHẦN_DƯ(10,3); Sau lời gọi trên, giá trị trả thuật toán PHẦN_DƯ gán vào biến a Do biến a mang giá trị Nói chung giải thuật đệ quy thường thiết kế theo cấu trúc:  Kiểm tra điều kiện kết thúc đệ quy trả kết tương ứng  Chia nhỏ liệu đầu vào  Áp dụng giải thuật đệ quy phần liệu  Tổng hợp kết thu Trong tốn học có phép tốn gần tương đương với giải thuật đệ quy phép toán truy hồi: giá trị tính tốn dựa một vài giá trị tính tốn trước Trên thực tế việc triển khai phép tốn truy hồi tốn học máy tính thực trực quan thuật toán đệ quy Hãy xem xét ví dụ với dãy số Fibonacci Các phần tử dãy số Fibonacci định nghĩa sau: F[1] = F[2] = F[n] = F[n – 1] + F[n – 2] với n > Theo định nghĩa, phần tử dãy số Fibonacci tính cách lấy tổng hai phần tử đứng trước Vì vậy, để tính giá trị phần tử trước tiên cần phải biết giá trị hai phần tử đứng trước Với cơng thức truy hồi nêu tính giá trị phần tử dãy Fibonacci cách lùi dần vị trí đầu dãy Điều có nghĩa để xác định dãy điều kiện bắt buộc phải xác định giá trị phần tử đầu dãy Điều kiện gọi điều kiện đầu Bây xem xét cách triển khai giải thuật tính giá trị dãy Fibonacci dựa giải thuật đệ quy Phần định nghĩa giải thuật sau: CS101_Bai1_v2.0014101214 17 Bài 1: Giới thiệu cấu trúc liệu giải thuật Giải thuật Fibonaci Dữ liệu đầu vào: int n ; Điều kiện áp dụng: n > ; Kết trả về: giá trị phần tử thứ n dãy Fibonacci F[n] Để thiết kế giải thuật này, không cần phải sử dụng thêm biến phụ, phần khai báo biến bỏ qua Trước tiên cần phải triển khai điều kiện đầu dãy, hay xác định giá trị ban đầu dãy Việc tương đương với kiểm tra điều kiện kết thúc lời gọi đệ quy thực đơn giản câu lệnh điều kiện để kiểm tra giá trị n: if(n == 1) return ; else { if(n == 2) return ; } Cuối cùng, để tính giá trị phần tử thứ n dãy Fibonacci, hai phần tử thứ n – n – đứng trước tính cách gọi đệ quy đến giải thuật Fibonacci Tổng kết lại, giải thuật Fibonacci viết đầy đủ sau: Giải thuật Fibonacci: Dữ liệu đầu vào: int n ; Điều kiện áp dụng n > Điều kiện trả về: giá trị phần tử thứ n dãy Fibonacci F[n] { if(n == 1) return ; else { if(n == 2) return ; } return Fibonacci(n – 1) + Fibonacci(n – 2) ; } 18 CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Để minh họa giải thuật, xem cách thức hoạt động giải thuật với giá trị thể n = { n = – điều kiện n = không thỏa mãn – điều kiện n = không thỏa mãn – gọi giải thuật FIBONACCI với n = 4: – điều kiện n = không thỏa mãn – điều kiện n = không thỏa mãn – gọi giải thuật FIBONACCI với n = 3: – điều kiện n = không thỏa mãn – điều kiện n = không thỏa mãn – gọi giải thuật FIBONACCI với n = 2: – điều kiện n = thỏa mãn, trả giá trị – gọi giải thuật FIBONACCI với n = 1: – điều kiện n = thỏa mãn, trả giá trị – tính tổng FIBONACCI(2) + FIBONACCI(1) = + = – trả giá trị – gọi giải thuật FIBONACCI với n = 2: – điều kiện n = thỏa mãn, trả giá trị – tính tổng FIBONACCI(3) + FIBONACCI (2) = + = – trả giá trị – gọi giải thuật FIBONACCI với n = 3: – điều kiện n = không thỏa mãn – điều kiện n = không thỏa mãn – gọi giải thuật FIBONACCI với n = 2: – điều kiện n = thỏa mãn, trả giá trị – gọi giải thuật FIBONACCI với n = 1: – điều kiện n = thỏa mãn, trả giá trị – tính tổng FIBONACCI(2) + FIBONACCI(1) = + = – trả giá trị – tính tổng FIBONACCI(4) + FIBONACCI(3) = + = – trả giá trị } Quá trình thực giải thuật minh hoạ cấu trúc sau Mỗi nút tương ứng với lời gọi đến giải thuật CS101_Bai1_v2.0014101214 19 Bài 1: Giới thiệu cấu trúc liệu giải thuật Như để tính giá trị phần tử thứ dãy FIBONACCI cần thực lời gọi Fibonacci(5) Nhưng thực tế, theo minh họa trên, số lời gọi thực tế đến giải thuật 9, bên lời gọi Fibonacci(5) có chứa lời gọi đến Fibonacci(4) Fibonacci(3), Tuy nhiên, việc thực lời gọi hoàn toàn "trong suốt" người sử dụng giải thuật Ưu điểm lớn phương pháp đệ quy tính hiệu thiết kế lập trình Như thấy ví dụ trên, với việc sử dụng lời đệ quy, logic chương trình biểu diễn đơn giản sáng Giải thuật đệ quy đặc biệt thích hợp để giải vấn đề, để triển khai hàm hay để xử lý liệu định nghĩa phương pháp truy hồi Tuy nhiên giải thuật đệ quy không thật hiệu xét mặt thực chương trình Như ví dụ trên, để tính Fibonacci(5), Fibonacci(3) Fibonacci(1) gọi lần, Fibonacci(2) gọi lần Số lần lời gọi đến giải thuật tính dựa thuật toán truy hồi Nếu gọi số lần gọi truy hồi đến giải thuật Fibonacci cho vị trí thứ n CALL (n), CALL (n)sẽ tính theo cơng thức : Call(n) = + CALL(n – 1) + CALL (n – 2) Như số lần gọi truy hồi để tính phần tử thứ n dãy Fibonacci cịn tăng nhanh giá trị Theo cách giải hệ thức truy hồi ta tính được:   1 F(n)        1      n Vì số lần gọi truy hồi thuật tốn tăng theo cấp số mũ Thời gian thực giải thuật tăng nhanh giá trị n tăng lên Còn vấn đề số lần gọi truy hồi thuật toán tăng lên dung lượng nhớ yêu cầu Trên thực tế, thực lời gọi đệ quy, môi trường thực thi thời ghi lại để chương trình tiếp tục chạy sau lời gọi kết thúc Bộ nhớ cần thiết để chạy chương trình tăng lên độ sâu lời gọi đệ quy tăng lên Như hình minh họa trên, độ sâu lời gọi đệ quy giá trị n Hạn chế chấp nhận thuật tốn địi hỏi sử dụng nhớ Vấn đề trở nên trầm trọng chương trình cần sử dụng lượng lớn nhớ định cho lần gọi đệ quy Vì vậy, chương trình thiết kế giải thuật trực tiếp mà không phức tạp khơng nên sử dụng giải thuật đệ quy để thiết kế chương trình Ví dụ, để tính phần tử thứ n dãy Fibonacci, ta sử dụng giải thuật trực tiếp sau: 20 CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Giải thuật Fibonacci Dữ liệu đầu vào: n: KIỂU SỐ NGUYÊN Điều kiện áp dụng: n > Kết trả về: giá trị phần tử thứ n dãy Fibonacci F[n] Khai báo biến i, x, y, z ; int if (n == 1)return ; else { If (n == 2)return ; } x = ; y = ; i = ; while (i < n) { z = x + y ; x = y ; y = z ; i = i + ; } return (x + y); } 1.5.2 Phương pháp quay lui Trong thực tế có nhiều vấn đề khơng thể xây dựng lời giải quy tắc, cơng thức tính tốn định Để tìm lời giải cho vấn đề đó, người ta khơng cịn cách khác phải thử trường hợp lời giải Một phương pháp để giải vấn đề chung chung phương pháp thử quay lại sai (trial and error) Vấn đề chia nhỏ thành vấn đề nhỏ hơn, chương trình chọn thử giá trị vấn đề Với giá trị chương trình tìm cách kiểm tra xem có tồn lời giải với vấn đề cịn lại hay khơng Nếu khơng tồn lời giải cho vấn đề cịn lại, chương trình quay lại thử giá trị vấn đề thời Vấn đề thường chia nhỏ thành nhiều tầng theo hướng đệ quy Việc tìm lời giải cho tầng thực lời gọi đệ quy Nếu khơng tìm lời giải cho tầng quay lui lên tầng để thử lời giải Vì phương pháp gọi phương pháp quay lui Để hiểu rõ phương pháp xây dựng giải thuật quay lui, ta xem xét phân tích ví dụ cụ thể: toán Tám Hậu Mục tiêu tốn tìm cách bố trí hậu bàn cờ vua cho khơng ăn CS101_Bai1_v2.0014101214 21 Bài 1: Giới thiệu cấu trúc liệu giải thuật Đặt vấn đề: Bàn cờ vua có kích thước 88 Để hậu khơng ăn thiết khơng có xếp theo hàng hay cột Để mô tả bàn cờ vua, ta sử dụng mảng hai chiều có kích thước tương đương gồm hàng cột, gọi mảng ban_co Mảng khởi tạo với tất phần tử mang giá trị Thay tìm cách tìm vị trí cho hậu bàn cờ, ta tìm vị trí hậu hàng từ đến Nhớ hàng có hậu Mỗi lần xếp hậu vào hàng, ta đánh dấu vị trí hàng mà bị hậu hàng ăn cách gán giá trị cho phân tử mảng ban_co giá trị hàng Ví dụ, hàng ta xếp hậu cột thứ phần tử mảng ban_co vị trí: (3, 2) (3, 3) (3, 4) (4, 1) (4, 3) (4, 5) (5, 3) (5, 6) (6, 3) (6, 7) (7, 3) (7, 8) (8, 3) gán giá trị chưa gán giá trị Theo quy tắc chơi cờ vua, tất phần tử nằm cột, đường chéo với phần tử vị trí (2, 3) bị đánh dấu Lưu ý:  Phần tử vị trí (i, j) thuộc cột với (2, 3) j =  Phần tử vị trí (i, j) thuộc đường chéo trái với (2, 3) nếu: i + j = +  Phần tử vị trí (i, j) thuộc đường chéo phải với (2, 3) nếu: j – i = – Sau ta xuống hàng để tiếp thục việc kiểm thử Nếu tìm lời giải hàng giá trị hàng thời đúng, ta tìm lời giải cho tốn Ngược lại, không xếp hậu cho hàng tiếp theo, ta phải tiếp thục thử vị trí cho hậu hàng thời Lưu ý trước thử vị trí cần phải xóa bỏ đánh dấu vị trí trước Để thuật tốn Tám Hậu rõ ràng, xây dựng giải thuật toán con: KHOI_TAO để khởi tạo mảng ban đầu, DANH_DAU để đánh dấu bàn cờ lần đặt hậu mới, XOA_DAU để xóa bỏ đánh dấu, giải thuật THU_HAU để thử xếp hậu vào hàng bàn cờ Giải thuật KHOI_TAO Dữ liệu đầu vào: int ban_co[8][8]; Điều kiện ban đầu: khơng có Kết trả về: tất phần tử mảng ban_co có giá trị Khai báo biến int i, j; { for(i = 0; i < 7; i++) for(j = 0; i < 7; j++) ban_co[i][j] = 0; } 22 CS101_Bai1_v2.0014101214 Bài 1: Giới thiệu cấu trúc liệu giải thuật Giải thuật DANH_DAU Dữ liệu đầu vào: int ban_co[8][8]; int m.n; Điều kiện ban đầu: m >= 1, n = 1) && (ban_co[i][j] == 0)) ban_co[i][j] = m; } for(i = n + 1; i < 7; i++) { j = n – m + i; if ((j = 1; m = 1; m Hãy trình bày thuật tốn để tính n! theo giải thuật đệ quy không đệ quy Dựa theo thuật toán phần dư, viết thuật toán cho phép tính ước số chung lớn hai số nguyên: theo giải thuật đệ quy không đệ quy 30 CS101_Bai1_v2.0014101214

Ngày đăng: 02/08/2022, 17:55

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

TÀI LIỆU LIÊN QUAN

w