BÀI GIẢNG GIẢI THUẬT VÀ LẬP TRÌNH - QUY HOẠCH ĐỘNG - LÊ MINH HOÀNG - 3 ppt

36 686 3
BÀI GIẢNG GIẢI THUẬT VÀ LẬP TRÌNH - QUY HOẠCH ĐỘNG - LÊ MINH HOÀNG - 3 ppt

Đ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

Cấu trúc liệu Giải thuật 59 end Khi cài đặt mảng, thao tác Stack viết đơn giản ta chia thành chương trình con, chương trình mơ tả thao tác, để từ sau, ta cần biết chương trình ta có cấu trúc Stack, cịn ta mơ cụ thể khơng cần phải quan tâm nữa, cài đặt Stack cấu trúc liệu khác, cần sửa lại thủ tục StackInit, Push Pop mà 5.1.2 Mô tả Stack danh sách nối đơn kiểu LIFO Khi cài đặt Stack danh sách nối đơn kiểu LIFO, Stack bị tràn vùng không gian nhớ dùng cho biến động khơng cịn đủ để thêm phần tử Tuy nhiên, việc kiểm tra điều khó phụ thuộc vào máy tính ngơn ngữ lập trình Ví dụ Turbo Pascal, Heap cịn trống 80 Bytes đủ chỗ cho 10 biến, biến Bytes mà Mặt khác, không gian nhớ dùng cho biến động thường lớn nên cài đặt ta bỏ qua việc kiểm tra Stack tràn program StackByLinkedList; type PNode = ^TNode; {Con trỏ tới nút danh sách} TNode = record {Cấu trúc nút danh sách} Value: Integer; Link: PNode; end; var Last: PNode; {Con trỏ đỉnh Stack} procedure StackInit; {Khởi tạo Stack rỗng} begin Last := nil; end; procedure Push(V: Integer); {Đẩy giá trị V vào Stack ⇔ thêm nút chứa V nối nút vào danh sách} var P: PNode; begin New(P); P^.Value := V; {Tạo nút mới} P^.Link := Last; Last := P; {Móc nút vào danh sách} end; function Pop: Integer; {Lấy giá trị khỏi Stack, trả kết hàm} var P: PNode; begin if Last = nil then WriteLn('Stack is empty') else begin Pop := Last^.Value; {Gán kết hàm} P := Last^.Link; {Giữ lại nút last^ (nút đẩy vào danh sách trước nút Last^)} Dispose(Last); Last := P; {Giải phóng nhớ cấp cho Last^, cập nhật lại Last mới} end; end; begin StackInit; ; {Đưa vài lệnh để kiểm tra hoạt động Stack} Lê Minh Hoàng 60 Chuyên đề end 5.2 HÀNG ĐỢI (QUEUE) Hàng đợi kiểu danh sách trang bị hai phép toán bổ sung phần tử vào cuối danh sách (Rear) loại bỏ phần tử đầu danh sách (Front) Có thể hình dung hàng đợi đoàn người xếp hàng mua vé: Người xếp hàng trước mua vé trước Vì nguyên tắc"vào trước trước" đó, Queue cịn có tên gọi danh sách kiểu FIFO (First In First Out) 5.2.1 Mô tả Queue mảng Khi mô tả Queue mảng, ta có hai số First Last, First lưu số phần tử đầu Queue Last lưu số cuối Queue, khởi tạo Queue rỗng: First := Last := 0; Để thêm phần tử vào Queue, ta tăng Last lên đưa giá trị vào phần tử thứ Last Để loại phần tử khỏi Queue, ta lấy giá trị vị trí First tăng First lên Khi Last tăng lên hết khoảng số mảng mảng đầy, đẩy thêm phần tử vào Khi First > Last tức Queue rỗng Như phần mảng từ vị trí First tới Last sử dụng làm Queue program QueueByArray; const max = 10000; var Queue: array[1 max] of Integer; First, Last: Integer; procedure QueueInit; {Khởi tạo hàng đợi rỗng} begin First := 1; Last := 0; end; procedure Push(V: Integer); {Đẩy V vào hàng đợi} begin if Last = max then WriteLn('Overflow') else begin Inc(Last); Queue[Last] := V; end; end; function Pop: Integer; {Lấy giá trị khỏi hàng đợi, trả kết hàm} begin if First > Last then WriteLn('Queue is Empty') else begin Pop := Queue[First]; Inc(First); end; end; begin Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc liệu Giải thuật 61 QueueInit; ; {Đưa vài lệnh để kiểm tra hoạt động Queue} end Xem lại chương trình cài đặt Stack mảng kích thước tối đa 10000 phần tử, ta thấy ta làm 6000 lần Push 6000 lần Pop lại 6000 lần Push khơng có vấn đề xảy Lý số Last lưu đỉnh Stack tăng lên 6000 lại giảm đến lại tăng trở lại lên 6000 Nhưng cách cài đặt Queue gặp thơng báo lỗi tràn mảng, lần Push, số cuối hàng đợi Last tăng lên không bị giảm Đó nhược điểm mà ta nói tới cài đặt: Chỉ có phần tử từ vị trí First tới Last thuộc Queue, phần tử từ vị trí tới First - vô nghĩa Để khắc phục điều này, ta mơ tả Queue danh sách vịng (biểu diễn mảng cấu trúc liên kết), coi phần tử mảng xếp quanh vòng theo hướng Các phần tử nằm phần cung trịn từ vị trí First tới vị trí Last phần tử Queue Có thêm biến n lưu số phần tử Queue Việc thêm phần tử vào Queue tương đương với việc ta dịch số Last theo vịng vị trí đặt giá trị vào Việc loại bỏ phần tử Queue tương đương với việc lấy phần tử vị trí First dịch số First theo vịng Last … First … … Hình 12: Dùng danh sách vịng mơ tả Queue Lưu ý thao tác Push Pop phải kiểm tra Queue tràn hay Queue cạn nên phải cập nhật lại biến n (Ở dùng thêm biến n cho dễ hiểu thực tế cần hai biến First Last ta kiểm tra Queue tràn hay cạn rồi) program QueueByCList; const max = 10000; var Queue: array[0 max - 1] of Integer; i, n, First, Last: Integer; procedure QueueInit; {Khởi tạo Queue rỗng} begin First := 0; Last := max - 1; n := 0; end; procedure Push(V: Integer); {Đẩy giá trị V vào Queue} begin if n = max then WriteLn('Queue is Full') else Lê Minh Hoàng 62 Chuyên đề begin Last := (Last + 1) mod max; {Last chạy theo vòng tròn} Queue[Last] := V; Inc(n); end; end; function Pop: Integer; {Lấy phần tử khỏi Queue, trả kết hàm} begin if n = then WriteLn('Queue is Empty') else begin Pop := Queue[First]; First := (First + 1) mod max; {First chạy theo vòng tròn} Dec(n); end; end; begin QueueInit; ; {Đưa vài lệnh để kiểm tra hoạt động Queue} end 5.2.2 Mô tả Queue danh sách nối đơn kiểu FIFO Tương tự cài đặt Stack danh sách nối đơn kiểu LIFO, ta không kiểm tra Queue tràn trường hợp mô tả Queue danh sách nối đơn kiểu FIFO program QueueByLinkedList; type PNode = ^TNode; {Kiểu trỏ tới nút danh sách} TNode = record {Cấu trúc nút danh sách} Value: Integer; Link: PNode; end; var First, Last: PNode; {Hai trỏ tới nút đầu nút cuối danh sách} procedure QueueInit; {Khởi tạo Queue rỗng} begin First := nil; end; procedure Push(V: Integer); {Đẩy giá trị V vào Queue} var P: PNode; begin New(P); P^.Value := V; {Tạo nút mới} P^.Link := nil; if First = nil then First := P {Móc nút vào danh sách} else Last^.Link := P; Last := P; {Nút trở thành nút cuối, cập nhật lại trỏ Last} end; function Pop: Integer; {Lấy giá trị khỏi Queue, trả kết hàm} var P: PNode; begin if First = nil then WriteLn('Queue is empty') else begin Pop := First^.Value; {Gán kết hàm} P := First^.Link; {Giữ lại nút First^ (Nút đẩy vào danh sách sau First^)} Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc liệu Giải thuật 63 Dispose(First); First := P; {Giải phóng nhớ cấp cho First^, cập nhật lại First mới} end; end; begin QueueInit; ; {Đưa vài lệnh để kiểm tra hoạt động Queue} end Bài tập Bài Tìm hiểu chế xếp chồng thủ tục đệ quy, phương pháp dùng ngăn xếp để khử đệ quy Viết chương trình mô tả cách đổi số từ hệ thập phân sang hệ số R dùng ngăn xếp Bài Hình 13 cấu đường tàu ga xe lửa … n A C B Hình 13: Di chuyển toa tàu Ban đầu đường ray A chứa toa tàu đánh số từ tới n theo thứ tự từ trái qua phải, người ta muốn chuyển toa sang đường ray C để thứ tự hoán vị (1, 2, …, n) theo quy tắc: đưa toa tàu chạy theo đường ray theo hướng mũi tên, dùng đoạn đường ray B để chứa tạm toa tàu trình di chuyển a) Hãy nhập vào hốn vị cần có, cho biết có phương án chuyển hay khơng, có đưa cách chuyển: Ví dụ: n = 4; Thứ tự cần có (1, 4, 3, 2) 1)A → C; 2)A → B; 3)A → B; 4)A → C; 5)B → C; 6)B → C b) Những hoán vị thứ tự toa tạo thành đoạn đường ray C với luật di chuyển Bài Tương tự 3, với sơ đồ đường ray sau: A C B Hình 14: Di chuyển toa tàu (2) Lê Minh Hoàng … n 64 Chuyên đề §6 CÂY (TREE) 6.1 ĐỊNH NGHĨA Cấu trúc liệu trừu tượng ta quan tâm tới mục cấu trúc Cây cấu trúc liệu gồm tập hữu hạn nút, nút có quan hệ phân cấp gọi quan hệ "cha - con" Có nút đặc biệt gọi gốc (root) Có thể định nghĩa đệ quy sau: • Mỗi nút cây, nút gốc • Nếu n nút n1, n2, …, nk gốc T1, T2, …, Tk; đơi khơng có nút chung Thì cho nút n trở thành cha nút n1, n2, …, nk ta T Cây có nút n gốc T1, T2, …, Tk trở thành (subtree) gốc Để tiện, người ta cịn cho phép tồn khơng có nút mà ta gọi rỗng (null tree) Xét Hình 15: A B E C F D I H G J K Hình 15: Cây A cha B, C, D, G, H, I D Số nút gọi cấp nút đó, ví dụ cấp A 3, cấp B 2, cấp C Nút có cấp gọi nút (leaf) hay nút tận Ví dụ trên, nút E, F, C, G, J, K I nút Những nút gọi nút nhánh (branch) Cấp cao nút gọi cấp đó, hình cấp Gốc người ta gán cho số mức 1, nút cha có mức i nút có mức i + Mức Hình 15 Hình 16: Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc liệu Giải thuật 65 A B C F E D I H G J K Hình 16: Mức nút Chiều cao (height) hay chiều sâu (depth) số mức lớn nút có Cây có chiều cao Một tập hợp phân biệt gọi rừng (forest), một rừng Nếu bỏ nút gốc tạo thành rừng Ví dụ: • Mục lục sách với phần, chương, bài, mục v.v… có cấu trúc • Cấu trúc thư mục đĩa có cấu trúc cây, thư mục gốc coi gốc với thư mục tệp nằm thư mục gốc • Gia phả họ tộc có cấu trúc • Một biểu thức số học gồm phép tốn cộng, trừ, nhân, chia lưu trữ mà toán hạng lưu trữ nút lá, toán tử lưu trữ nút nhánh, nhánh biểu thức * + / A - C B D E (A / B + C) * (D - E) Hình 17: Cây biểu diễn biểu thức 6.2 CÂY NHỊ PHÂN (BINARY TREE) Cây nhị phân dạng quan trọng cấu trúc Nó có đặc điểm nút có tối đa hai nhánh Với nút người ta phân biệt trái phải nút Cây nhị phân có tính đến thứ tự nhánh Cần ý tới số dạng đặc biệt nhị phân Lê Minh Hoàng 66 Chuyên đề Các nhị phân Hình 18Error! Reference source not found gọi nhị phân suy biến (degenerate binary tree), nút có nhánh Cây a) gọi lệch phải, b) gọi lệch trái, c) d) gọi zíc-zắc 1 1 3 3 5 b) a) c) d) Hình 18: Các dạng nhị phân suy biến Các Hình 19 gọi nhị phân hoàn chỉnh (complete binary tree): Nếu chiều cao h nút có mức < h - có nút Cịn nút có mức ≤ h - có nút trường hợp f) gọi nhị phân đầy đủ (full binary tree) Cây nhị phân đầy đủ trường hợp riêng nhị phân hoàn chỉnh 1 4 7 f) e) Hình 19: Cây nhị phân hồn chỉnh nhị phân đầy đủ Ta thấy tính chất sau phép chứng minh quy nạp: Trong nhị phân có số lượng nút nhị phân suy biến có chiều cao lớn nhất, cịn nhị phân hồn chỉnh có chiều cao nhỏ Số lượng tối đa nút mức i nhị phân 2i-1, tối thiểu (i ≥ 1) Số lượng tối đa nút nhị phân có chiều cao h 2h-1, tối thiểu h (h ≥ 1) Cây nhị phân hồn chỉnh, khơng đầy đủ, có n nút chiều cao h = [log2(n + 1)] + Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc liệu Giải thuật 67 Cây nhị phân đầy đủ có n nút chiều cao h = log2(n + 1) 6.3 BIỂU DIỄN CÂY NHỊ PHÂN 6.3.1 Biểu diễn mảng Nếu có nhị phân đầy đủ, ta dễ dàng đánh số cho nút theo thứ tự từ mức trở đi, hết mức đến mức khác từ trái sang phải nút mức A B E C D F G Hình 20: Đánh số nút nhị phân đầy đủ để biểu diễn mảng Với cách đánh số này, nút thứ i nút thứ 2i 2i + Cha nút thứ j nút j div Từ lưu trữ mảng T, nút thứ i lưu trữ phần tử T[i] Với nhị phân đầy đủ Hình 20 lưu trữ mảng, ta mảng sau: A B E C D F G Trong trường hợp nhị phân khơng đầy đủ, ta thêm vào số nút giả để nhị phân đầy đủ, gán giá trị đặc biệt cho phần tử mảng T tương ứng với nút Hoặc dùng thêm mảng phụ để đánh dấu nút nút giả tự ta thêm vào Chính lý nên với nhị phân không đầy đủ, ta gặp phải lãng phí nhớ phải thêm nhiều nút giả vào nhị phân đầy đủ Ví dụ với lệch trái, ta phải dùng mảng 31 phần tử để lưu nhị phân gồm nút Lê Minh Hoàng 68 Chuyên đề A B C D E A B C 10 11 12 13 14 15 16 E D 17 Hình 21: Nhược điểm phương pháp biểu diễn mảng 6.3.2 Biểu diễn cấu trúc liên kết Khi biểu diễn nhị phân cấu trúc liên kết, nút ghi (record) gồm trường: • Trường Info: Chứa giá trị lưu nút • Trường Left: Chứa liên kết (con trỏ) tới nút trái, tức chứa thông tin đủ để biết nút trái nút nút nào, trường hợp khơng có nút trái, trường gán giá trị đặc biệt • Trường Right: Chứa liên kết (con trỏ) tới nút phải, tức chứa thông tin đủ để biết nút phải nút nút nào, trường hợp khơng có nút phải, trường gán giá trị đặc biệt INFO Liên kết trái Liên kếtphải Hình 22: Cấu trúc nút nhị phân Đối với ta cần phải quan tâm giữ lại nút gốc, từ nút gốc, theo hướng liên kết Left, Right ta duyệt nút khác Đại học Sư phạm Hà Nội, 1999-2002 80 S := S + ' '; for i := Length(S) - downto if (S[i] in Opt) or (S[i + 1] Insert(' ', S, i + 1); for i := Length(S) - downto if (S[i] = ' ') and (S[i + 1] end; Chuyên đề {Thêm dấu cách trước sau toán tử dấu ngoặc} in Opt) then {Xoá dấu cách thừa} = ' ') then Delete(S, i + 1, 1); function Priority(Ch: Char): Integer; {Hàm lấy mức độ ưu tiên Ch} begin case ch of '*', '/': Priority := 2; '+', '-': Priority := 1; '(': Priority := 0; end; end; procedure Process(T: String); {Xử lý phần tử đọc từ biểu thức trung tố} var c, x: Char; begin c := T[1]; if not (c in Opt) then Write(T, ' ') else case c of '(': Push(c); ')': repeat x := Pop; if x '(' then Write(x, ' '); until x = '('; '+', '-', '*', '/': begin while (Stack '') and (Priority(c) 3) or not (A > 0) ((A > 0) or (A < 0)) and (B * B - * A * C < 0) Bài Viết chương trình tính biểu thức logic dạng RPN với toán tử and, or, not toán hạng TRUE hay FALSE Bài Viết chương trình hồn chỉnh tính giá trị biểu thức trung tố Lê Minh Hồng 82 Chun đề §8 SẮP XẾP (SORTING) 8.1 BÀI TỐN SẮP XẾP Sắp xếp q trình bố trí lại phần tử tập đối tượng theo thứ tự định Chẳng hạn thứ tự tăng dần (hay giảm dần) dãy số, thứ tự từ điển từ v.v… Yêu cầu xếp thường xuyên xuất ứng dụng Tin học với mục đích khác nhau: xếp liệu máy tính để tìm kiếm cho thuận lợi, xếp kết xử lý để in bảng biểu v.v… Nói chung, liệu xuất nhiều dạng khác nhau, ta quy ước: Một tập đối tượng cần xếp tập ghi (records), ghi bao gồm số trường (fields) khác Nhưng khơng phải tồn trường liệu ghi xem xét đến trình xếp mà trường (hay vài trường đó) ý tới Trường ta gọi khoá (key) Sắp xếp tiến hành dựa vào giá trị khố Ví dụ: Hồ sơ tuyển sinh trường Đại học danh sách thí sinh, thí sinh có tên, số báo danh, điểm thi Khi muốn liệt kê danh sách thí sinh trúng tuyển tức phải xếp thí sinh theo thứ tự từ điểm cao tới điểm thấp Ở khố xếp điểm thi STT SBD Họ tên Điểm thi A100 Nguyễn Văn A 20 B200 Trần Thị B 25 X150 Phạm Văn C 18 G180 Đỗ Thị D 21 Khi xếp, ghi bảng đặt lại vào vị trí cho giá trị khố tương ứng với chúng có thứ tự ấn định Vì kích thước tồn ghi lớn, nên việc xếp thực trực tiếp ghi địi hỏi chuyển đổi vị trí ghi, kéo theo việc thường xuyên phải di chuyển, copy vùng nhớ lớn, gây tổn phí thời gian nhiều Thường người ta khắc phục tình trạng cách xây dựng bảng khoá: Mỗi ghi bảng ban đầu tương ứng với ghi bảng khoá Bảng khoá gồm ghi ghi gồm có hai trường: Trường thứ chứa khoá Trường thứ hai chứa liên kết tới ghi bảng ban đầu, tức chứa thông tin đủ để biết ghi tương ứng với bảng ban đầu ghi Sau đó, việc xếp thực trực tiếp bảng khố, q trình xếp, bảng khơng bị ảnh hưởng gì, việc truy cập vào ghi bảng Đại học Sư phạm Hà Nội, 1999-2002 Cấu trúc liệu Giải thuật 83 thực cách dựa vào trường liên kết ghi tương ứng thuộc bảng khố Như ví dụ trên, ta xây dựng bảng khố gồm trường, trường khoá chứa điểm trường liên kết chứa số thứ tự người có điểm tương ứng bảng ban đầu: Điểm thi STT 20 25 18 21 Sau xếp theo trật tự điểm cao tới điểm thấp nhất, bảng khoá trở thành: Điểm thi STT 25 21 20 18 Dựa vào bảng khoá, ta biết người có điểm cao người mang số thứ tự 2, người mang số thứ tự 4, tiếp người mang số thứ tự 1, cuối người mang số thứ tự 3, muốn liệt kê danh sách đầy đủ ta việc đối chiếu với bảng ban đầu liệt kê theo thứ tự 2, 4, 1, Có thể cịn cải tiến tốt dựa vào nhận xét sau: Trong bảng khoá, nội dung trường khố hồn tồn suy từ trường liên kết cách: Dựa vào trường liên kết, tìm tới ghi tương ứng bảng truy xuất trường khố bảng Như ví dụ người mang số thứ tự chắn phải có điểm thi 20, cịn người mang số thứ tự chắn phải có điểm thi 18 Vậy bảng khố loại bỏ trường khoá mà giữ lại trường liên kết Trong trường hợp phần tử bảng ban đầu đánh số từ tới n trường liên kết số thứ tự ghi bảng ban đầu ví dụ trên, người ta gọi kỹ thuật kỹ thuật xếp số: Bảng ban đầu không bị ảnh hưởng cả, việc xếp đơn đánh lại số cho ghi theo thứ tự xếp Cụ thể hơn: Nếu r[1], r[2], …, r[n] ghi cần xếp theo thứ tự định việc xếp số tức xây dựng dãy Index[1], Index[2], …, Index[n] mà đây: Index[j] = Chỉ số ghi đứng thứ j thứ tự (Bản ghi r[index[j]] phải đứng sau j - ghi khác xếp) Do khố có vai trị đặc biệt nên sau này, trình bày giải thuật, ta coi khoá đại diện cho ghi đơn giản, ta nói tới giá trị khố mà thơi Các thao tác kỹ thuật xếp lẽ tác động lên toàn ghi làm khố Lê Minh Hồng 84 Chun đề Cịn việc cài đặt phương pháp xếp danh sách ghi kỹ thuật xếp số, ta coi tập Bài toán xếp phát biểu sau: Xét quan hệ thứ tự toàn phần "nhỏ bằng" ký hiệu "≤" tập hợp S, quan hệ hai ngơi thoả mãn bốn tính chất: Với ∀a, b, c ∈ S Tính phổ biến: Hoặc a ≤ b, b ≤ a; Tính phản xạ: a ≤ a Tính phản đối xứng: Nếu a ≤ b b ≤ a bắt buộc a = b Tính bắc cầu: Nếu có a ≤ b b ≤ c a ≤ c Trong trường hợp a ≤ b a ≠ b, ta dùng ký hiệu "

Ngày đăng: 13/08/2014, 20:22

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan