1. Trang chủ
  2. » Trung học cơ sở - phổ thông

tài liệu tham khảo khoa toán tin

9 6 0

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

THÔNG TIN TÀI LIỆU

Nội dung

Nhưng trên thực tế ta nên cân nhắc giữa tính đơn giản của giải thuật và thời gian lẫn công sức để xây dựng các giải thuật tinh tế, hiệu quả hơn nhưng chỉ sử dụng quá ít lần với bộ dữ liệ[r]

(1)

Chương I

GIỚI THIỆU CẤU TRÚC DỮ LIỆU

VÀ PHÂN TÍCH GIẢI THUẬT

I.1 Quan hệ cấu trúc liệu giải thuật, kiểu liệu

I.1.1 Biểu diễn liệu

Một mục tiêu quan trọng tin học nhằm giải tự động toán giới thực máy tính điện tử Các thơng tin tốn cần giải quyết máy tính ln mã hố dạng nhị phân Các thơng tin gồm

dữ liệu thao tác liệu đó.

Việc biểu diễn liệu dạng nhị phân bất tiện cho người xử lý toán, đặc biệt tốn lớn phức tạp Chính lý đó, ngơn ngữ lập trình bậc cao cung cấp sẵn cách biểu diễn liệu trừu tượng

đơn giản có cấu trúc, nhằm giúp người lập trình khơng phải nhiều thời gian

và công sức thực thường xuyên lặp lại thao tác sơ cấp nặng nề kiểu liệu nhị phân mức thấp Tính trừu tượng liệu thể chỗ khơng q trọng đến đặc điểm ý nghĩa riêng đối tượng cụ thể mà rút phản ánh tính chất chung mà đối tượng thuộc lớp có

I.1.2 Quan hệ cấu trúc liệu giải thuật, kiểu liệu

Dựa vào chất chung nhóm liệu, đối tượng liệu được phân thành lớp Mỗi lớp liệu thể qua kiểu liệu Một kiểu

dữ liệu T tập hợp đó, phần tử tập gọi thể của

kiểu

Ta biết giải thuật (hay giải thuật) dãy câu lệnh rõ ràng, xác định

một trình tự thao tác số đối tượng (input) cho sau số hữu hạn bước thực (chú ý đến tính khả thi thời gian), ta đạt kết quả (output) mong muốn Giải thuật phản ánh phép xử lý, đối tượng để xử lý bởi giải thuật liệu: liệu (input) đưa vào, liệu trung gian kết

qủa (output) cuối

(2)

Chẳng hạn, chuỗi ký tự, ta có hai cách biểu diễn chúng thể ngơn ngữ lập trình Pascal C Với cách biểu diễn, ta có cách xây dựng thao tác tương ứng chúng khác

Một ví dụ khác, thấy rõ chương tiếp theo, dãy phần tử liệu loại, ta lưu trữ chúng hai cách: lưu mảng (tĩnh, động) hay lưu trữ danh sách liên kết động Khi đó, thao tác chúng chèn, xóa, xếp thực theo cách thức khác có hiệu khác

Do đó, nói đến kiểu liệu T, ta thường ý đến hai đặc trưng quan trọng liên hệ mật thiết với nhau:

- tập V giá trị thuộc kiểu, tập giá trị hợp lệ mà đối tượng kiểu T nhận lưu trữ;

- tập O phép toán (hay thao tác xử lý) xác định thực các đối tượng liệu kiểu

Người ta thường viết: T = <V, O>.

Trong ngôn ngữ lập trình cấp cao cụ thể, người ta thường xây dựng sẵn một số kiểu liệu đơn giản hay sơ cấp xác định, chẳng hạn với C++, ta có các kiểu liệu: số (nguyên, thực), ký tự, lôgic Với kiểu số nguyên, phép toán thường gặp là: phép toán số học +, -, *, / (chia nguyên), % (mod, lấy phần dư) phép toán so sánh như: ==, !=, , , >, < Với kiểu số thực, phép toán thường gặp là: phép toán số học +, -, *, /, phép toán so sánh như: ==, ! =, , , >, < Với kiểu lơgic, phép tốn thường gặp là: ! (not), && (and), || (or) Với kiểu ký tự, phép toán thường gặp là: phép toán ép kiểu phép toán so sánh như: ==, !=, , , >, <, …

Dựa kiểu đơn giản có phương pháp xác định ngơn ngữ lập trình qui định, ta xây dựng nên cấu trúc liệu hay kiểu dữ

liệu có cấu trúc phức tạp nhằm phản ánh tốt loại liệu phong phú

và đa dạng giới thực Chẳng hạn như: kiểu mảng, kiểu cấu trúc, kiểu hợp, kiểu file, … Một phép toán kiểu liệu là: truy cập đến phần tử hay thành phần đối tượng liệu

I.1.3 Các bước để giải tốn máy tính

Để giải tốn máy tính, ta thường trải qua giai đoạn sau đây:

- Đặt tốn, phân tích, đặc tả mơ hình hố tốn

- Chọn cấu trúc liệu để biểu diễn toán phát triển giải thuật (chọn

(3)

- Mã hóa chương trình - Thử nghiệm chương trình - Bảo trì chương trình

Hai giai đoạn đầu quan trọng, góp phần định tính đắn hiệu chương trình nhằm giải tốn

Vai trị kiểu liệu việc giải tốn máy tính

Khi đề cập đến thao tác, cần phải xác định tác động lên loại đối tượng hay cấu trúc liệu kiểu liệu ?

Với mơ hình liệu, có nhiều cách cài đặt cấu trúc dữ

liệu khác Trong cách cài đặt, có số phép toán thực hiện

thuận lợi, số phép tốn khác lại khơng thuận tiện Khi đề cập đến thao tác, cần phải xác định rõ tác động loại đối tượng kiểu liệu ? Khi cấu trúc liệu thay đổi giải thuật tương ứng với cũng

thay đổi theo Vì việc chọn cấu trúc liệu để biểu diễn mô hình phụ thuộc vào ứng dụng cụ thể.

Để việc chọn cấu trúc liệu biểu diễn toán cách phù hợp, cần

chú ý đến quan hệ đối tượng thành phần liệu với nhau;

ngồi ra, ta cịn cần phải lưu ý đến phép toán thực hiện

thường xuyên đối tượng liệu Chẳng hạn, dãy đối

tượng liệu loại, số lượng đối tượng không lớn (để lưu nhớ trong), biến động nhiều, phép toán thêm hủy đối tượng xảy thường xuyên ta nên chọn kiểu liệu danh sách liên kết động kiểu mảng tĩnh để lưu trữ dãy đối tượng

Khi xây dựng giải thuật nhằm giải toán, ta phải dựa trên

các yêu cầu cần xử lý để xem xét kỹ lưỡng, nên dựa đặc trưng

của toán tài nguyên (tốc độ xử lý khả lưu trữ hệ thống máy tính) thực tế có.

Tóm lại, xây dựng kiểu liệu nhằm giải toán cụ thể, ta nên để ý tiêu chuẩn sau:

- Phản ánh thực tế: có dự trù đến khả biến đổi liệu trong

chu trình sống Đây tiêu chuẩn quan trọng nhằm định tính đúng

đắn tồn tốn

- Cấu trúc liệu xây dựng cần phù hợp với thao tác (đặc biệt thao tác sử dụng nhiều nhất) Khi đó, việc phát triển giải thuật sẽ đơn giản, tự nhiên đạt hiệu cao mặt tốc độ nhớ.

(4)

I.2 Thiết kế phân tích giải thuật

I.2.1 Thiết kế giải thuật theo phương pháp Top-Down

Các tốn giải máy tính ngày đa dạng phức tạp Việc xây dựng mơ hình với giải thuật cách cài đặt chương trình giải chúng ngày có quy mơ lớn phức tạp, thường địi hỏi cơng sức đồng thời tập thể nhóm phân tích - thiết kế viên thảo chương viên Mặt khác, việc thử nghiệm, sửa chữa, bổ sung, mở rộng, bảo trì hệ chương trình lớn chiếm tỷ lệ thời gian đáng kể so với tổng thời gian xây dựng hệ chương trình

Để chương trình trở nên dễ hiểu, dễ kiểm tra, dễ bảo trì dễ mở rộng hơn, đặc biệt môi trường làm việc theo nhóm, người ta thường áp dụng chiến thuật “chia để trị” phương pháp thiết kế từ xuống (top-down design) hay thiết kế từ khái qt đến chi tiết Đó cách phân tích tóan, xuất

phát từ kiện mục tiêu đặt nhằm đưa công việc chủ yếu (theo cấu trúc phân cấp, chưa vội sa đà vào tiểu tiết), chia dần công việc lớn thành công việc (module) chi tiết hơn; module phức tạp ta lại chia tiếp chúng thành module nhỏ đạt đến phần việc mà ta biết cách giải Việc giải toán lớn ban đầu qui việc kết hợp lời giải tốn Đó sở kỹ thuật lập

trình có cấu trúc.

Khi thiết kế module nên ý đến tính độc lập tương đối chúng module khác Phương pháp thiết kế hỗ trợ đắc lực việc lập trình theo nhóm cơng nghệ phần mềm Khi đó, nhiều người chia xẻ giải vấn đề lớn mà không cần quan tâm tới chi tiết phần việc người khác mà sau nối kết module nhỏ để tốn lớn giải Q trình làm cho việc tìm hiểu sửa lỗi, bổ sung, mở rộng chương trình trở nên dễ dàng đơn giản

Việc phân tích thiết kế toán lớn thành toán thường chiếm thời gian lẫn công sức lớn nhiều so với nhiệm vụ lập trình (coding)

I.2.2 Các chiến lược khác để thiết kế giải thuật

(5)

Phương pháp tham lam thường dùng để tìm nghiệm tối ưu tập nghiệm chấp nhận S xây dựng theo hàm chọn để bổ sung phần tử vào S theo một cách thích hợp

Phương pháp qui hoạch động sử dụng kỹ thuật “đi từ lên”: xuất phát từ nghiệm của toán sơ cấp (được lưu giữ bảng nhằm tránh công sức giải lại toán phát sinh cần giải lớn sau này), ta xây dựng nghiệm toán lớn lưu tiếp vào bảng; tiếp tục tìm nghiệm tốn lớn ban đầu từ bảng

Phương pháp quay lui thường dùng để tìm tất nghiệm tốn dạng vectơ nghiệm chưa biết trước độ dài xác định dần trình giải Đây kỹ thuật quan trọng việc thiết kế giải thuật

Phương pháp nhánh cận dạng cải tiến phương pháp quay lui để tìm nghiệm

tối ưu tốn Trong q trình bước mở rộng nghiệm phần để đạt đến nghiệm tối

ưu toán (dưới dạng vectơ), biết nghiệm mở rộng có hàm giá lớn giá nghiệm tốt thời điểm đó, ta khơng cần mở rộng nghiệm phần theo nhánh quay lui sang tìm nghiệm nhánh khác có triển vọng

Các chiến lược nghiên cứu chi tiết học phần

I.2.3 Phân tích giải thuật độ phức tạp giải thuật a Các vấn đề cần lưu ý phân tích giải thuật

- Tính đắn giải thuật: cần trả lời câu hỏi liệu giải thuật hiện lời giải cuả tốn hay không? Thông thường người ta cài đặt giải thuật máy tính thử nghiệm với số liệu mẫu so sánh kết thử nghiệm với kết lấy từ thông tin phương pháp khác mà ta biết Nhưng cách thử phát tính sai chưa thể bảo đảm tính giải thuật Để chứng minh tính đắn của giải thuật nhiều đòi hỏi phải sử dụng cơng cụ tốn học phức tạp, công việc luôn dễ dàng

- Tính đơn giản giải thuật: thể qua tính dễ hiểu, tự nhiên, dễ lập

trình, dễ chỉnh lý Thơng thường giải thuật q đơn sơ chưa cách tốt

nhất thường gây tổn phí thời gian nhớ thực Nhưng thực tế ta nên cân nhắc tính đơn giản giải thuật thời gian lẫn công sức để xây dựng giải thuật tinh tế, hiệu sử dụng lần với liệu nhỏ với điều kiện thời gian hạn chế môi trường lập trình thực tế

- Tốc độ thực dung lượng nhớ cần chiếm dụng giải thuật: Thông thường hai yêu cầu tối ưu thời gian nhớ thỏa

mãn đồng thời Các giải thuật không tầm thường có tốc độ thực cao thì

(6)

b Độ phức tạp giải thuật

 Thời gian thực giải thuật phụ thuộc vào nhiều yếu tố: - Kích thước liệu n đưa vào: ta gọi thời gian thực giải thuật trên liệu hàm n : T(n)

- Các kiểu lệnh tốc độ xử lý máy tính, ngơn ngữ lập trình chương trình dịch ngơn ngữ Nhưng loại yếu tố phụ thuộc vào cách cài đặt và loại máy tính giải thuật cài đặt Vì xây dựng T(n) khơng nên dựa vào chúng

- Khi xây dựng hàm T(n) cho giải thuật người ta thường xét các

thao tác đặc trưng cho giải thuật đo (thời gian thực thao tác nhiều hơn đáng kể so với thời gian thực loại thao tác khác) Chẳng hạn, xét

các giải thuật xếp n mục liệu với cấu trúc “lưu trữ trong” ta thường ý tới số lần đổi chỗ so sánh mục liệu theo trường khố

- Tình trạng liệu: Thời gian thực giải thuật không phụ thuộc vào kích thước n liệu mà cịn phụ thuộc vào tình trạng liệu

đó Chẳng hạn, số thao tác để xếp theo thứ tự tăng dãy số đưa

vào có thứ tự khác nhiều so với dãy chưa hay theo thứ tự ngược lại Vì vậy, xét độ phức tạp T(n) giải thuật ta thường xét các

trường hợp: thuận lợi nhất, xấu trung bình (thường khó xét nhiều trường hợp địi hỏi cơng cụ tốn học phức tạp).

Cách đánh giá thời gian thực giải thuật độc lập với máy tính phụ thuộc vào thân giải thuật liệu dẫn tới khái niệm “độ phức tạp giải thuật” hay cấp độ lớn thời gian thực giải thuật.

Gọi T(n) độ phức tạp giải thuật, tồn tại: hàm g(n)

không âm, số dương C n0 cho:

T(n)  C g(n) n  n0 (1)

Khi ta nói: T(n) có cấp g(n) viết: T(n) = O(g(n)). + Lưu ý:

- Ta nên chọn cận g(n) có “cấp nhỏ nhất” thỏa mãn tính chất (1) - T(n) có cấp g(n) :

lim ( )

) (

n g

n T

= C > 0, n

- Thông thường ta dùng hàm sau để đánh giá độ phức tạp giải thuật: 1 << log2n << n << n log2n << n2 << … << nk (k>= 2,

độ

phức tạp loại đa

thức) << (độ phức tạp loại mũ) n << n! << nn

trong đó, ký hiệu : f(n) << g(n) có nghĩa “f(n) nhỏ g(n) nhiều” n đủ lớn hay:

lim ( )

) (

n g

n f

(7)

Bảng sau cho ta hình dung độ tăng nhanh lớp giải thuật có độ phức tạp đa thức mũ theo số lượng n mục liệu đầu vào Giả sử ta cài đặt giải thuật máy tính với tốc độ xử lý tỉ phép tính giây (s)

N Log2(n) (s) n (s) n*Log2(n) (s) n*n (s) 2n(năm) n! (năm) nn (năm)

10 e-09 e-08 e-08 e-07 3 e-14 1 e-10 3 e-07

50 e-09 e-08 e-07 e-06 4 e-02 1 e+48 3 e+68

100 e-09 e-07 e-07 e-05 4 e+13 3 e+141 3 e+183

c Một số quy tắc để xác định độ phức tạp giải thuật

Giả sử T1(n) T2 (n) thời gian thực hai đoạn chương trình P1

P2 mà T1(n) = O(f(n)) T2 (n) = O(g(n))

- Quy tắc tổng: Thời gian thực liên tiếp P1 P2 là: T1(n) + T2(n) =

O(max(f(n),g(n))).

Ví dụ: f(n)  g(n), n  n0 O(f(n) + g(n)) = O(g(n))

- Quy tắc nhân: Thời gian thực P1 P2 lồng là: T1(n) T2(n) =

O(f(n).g(n)).

Ví du: P1 vịng lặp, P2 thao tác P1.

d Các bước phân tích giải thuật

- Xác định đặc trưng liệu dùng làm liệu nhập định sự phân tích phù hợp

- Xác định thao tác trừu tượng giải thuật để tách biệt sự

phân tích với cài đặt.

- Phân tích mặt toán học độ phức tạp giải thuật trường hợp: tốt nhất, xấu trung bình Để đánh giá độ phức tạp giải thuật trong

trường hợp trung bình thường địi hỏi cơng cụ tốn học tinh vi khó; nhiều trường hợp, ta thường hạn chế đánh giá ước lượng chặn tránh sa đà vào tiểu tiết phức tạp

* Ví du: Xét giải thuật tìm xem phần tử X có mặt vector có n phần tử V = v1,v2, , vn cho trước hay khơng?

Boolean TìmKiếm(ptu X, ptu V[], int n)

Bước 1: Thấy = False; Thứ = 1;

(8)

 if (vThứ == X) Thấy = True;

else Thứ = Thứ + 1; 

Bước 3: Trả trị Thấy;

Phép toán giải thuật tìm kiếm phép so sánh khóa dữ liệu vThứ với X

- Trường hợp tốt xảy X v1:

Ttốt(n) = O(1)

- Trường hợp xấu xảy X khơng tìm thấy:

Txấu(n) = O(n)

- Trường hợp trung bình: Gọi q xác suất để X rơi vào phần tử của V giả sử X có phân bố n phần tử phân biệt V xác suất để X rơi vào phần tử vi là: pi = q/n; xác suất để X không rơi vào phần tử

V là: - q

Độ phức tạp trung bình giải thuật là: Ttb (n) =

n

i 1 pi.i + (1-q)n

Ttb (n) = q

n

i 1 i/n + (1-q)n

= q(n+1)/2 + (1-q)n = n(1-q/2) + q/2

Nếu q=1 (nghĩa ln tìm thấy X V) : Ttb (n) = (n+1)/2

Nếu q=1/2 (nghĩa khả tìm thấy khơng tìm thấy X V nhau) : Ttb (n) = (3n+1)/4

Nếu q= (nghĩa không tìm thấy X V) : Ttb (n) = n

Tóm lại: Ttb (n) = O(n)

I.2.4 Qui ước ngôn ngữ mã giả

Để tiện cho việc thực hành cho học viên (trên ngôn ngữ lập trình C hay C+ +), giáo trình sử dụng ngôn ngữ mã giả tựa ngôn ngữ C++ (thật chỉ khác ngơn ngữ mã giả tựa Pascal không đáng kể) để mô tả cấu trúc liệu cấu trúc điều khiển giải thuật

- Lệnh ghép: dãy lệnh nằm cặp dấu ngoặc kép  … 

(9)

if (ĐiềuKiện) S; hoặc:

if (ĐiềuKiện) S1;

else S2;

- Cấu trúc điều khiển nhiều chọn lựa: switch (BiểuThứcVôHướng)  case Trị_1: S1; break;

case Trị_2: S2; break;

case Trị_n: Sn; break;

[default : S;] ;

- Cấu trúc lặp:

for (LệnhKhởiĐầu; ĐiềuKiệnLặp; LệnhThayĐổiĐiềuKiệnLặp) S; while (ĐiềuKiện) S;

do S while (ĐiềuKiện); repeat S until (ĐiềuKiện); - Phép gán: =

- Phép tốn lơgic: && (and), || (or), ! (not) trị lôgic kiểu boolean: True, False

- Quan hệ so sánh: ==, !=, >, <, , 

- Khai báo chương trình viết dạng hàm:

KiểuTrảVềCủaHàm TênHàm(KiểuThamTrị ThamTrị, KiểuThamChiếu

Ngày đăng: 08/04/2021, 18:27

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

TÀI LIỆU LIÊN QUAN

w