Trình bày cách Xác định độ phức tạp tính toán của giải thuật, với những nội dung: Qui tắc tổng, phép toán tích cực, thời gian chạy của các câu lệnh lặp, cho ví dụ minh họa...7 Câu 9 : Tr
Trang 1Mục lục
Câu 1: Trình bày mối quan hệ giữa cấu trúc dữ liệu và giải thuật Cho ví dụ minh họa 2
Câu 2: Cấu trúc dữ liệu và phép toán 3
Câu 3: Trình bày sự khác nhau của cấu trúc dữ liệu và cấu trúc lưu trữ, cho vd minh họa? 3
Câu 4: Trình bày những đặc điểm về cấu trúc trong các ngôn ngữ lt bậc cao, có liên hệ với ngôn ngữ C 3
Câu 5 : Phương pháp thiết kế Top_Down 4
Câu 6: Phương pháp tinh chỉnh từng bước ( stepwise refinement) 6
Câu 7: Trình bày cách phân tích thời gian thực hiện giải thuật 6
Câu 8 Trình bày cách Xác định độ phức tạp tính toán của giải thuật, với những nội dung: Qui tắc tổng, phép toán tích cực, thời gian chạy của các câu lệnh lặp, cho ví dụ minh họa 7
Câu 9 : Trình bày ( bằng ngôn ngữ tựa C ) giải thuật bổ sung một nút mới có chứa dữ liệu X vào trước nút con trỏ bởi Q trong danh sách móc nối hai chiều với : Pdau trỏ và phần tử đầu, Pcuoi trỏ vào phần tử cuối, mỗi nút có cấu trúc như sau : 8
Câu 10 : Trình bày ( bằng ngôn ngữ tựa C ) giải thuật loại bỏ một nút trỏ bởi Q trong danh sách móc nối hai chiều với : Pdau chỉ vào phần tử đầu, Pcuoi chỉ vào phần tử cuối, mỗi nút có cấu trúc như sau: 9
Câu 11: Trình bày bằng ngôn ngữ tựa C giải thuật cộng 2 đa thức C = A + B Các phần tử của mỗi đa thức có cấu trúc như sau 10
Câu 12: Trình bày ( bằng ngôn ngữ tựa C ) giải thuật định giá biểu thực hậu tố bằng cách dùng stack 11
Câu 13: chuyển đổi biểu thức trung tố sang hậu tố 12
Câu 14: Trình bày (nn tựa C) giải thuật duyệt cây theo thứ tự trước, ko đệ quy, dùng stack 14
Câu 15: Trình bày giải thuật duyệt cây theo thứ tự giữa bằng giải thuật ko đệ quy có sử dụng stack 15
Câu 16: Tìm kiếm nhị fân 16
Câu 17: kiểm tra xem T có phải là "cây nhị phân tìm kiếm" hay ko 17
Câu 18: Tìm kiếm có bổ sung trên cây nhị fân 19
Câu 19: loại bỏ 1 nút có giá trị X trên cây nhị phân tìm kiếm 21
Câu 20: sắp xếp nhanh ( Phân đoạn) Quick sort 22
Câu 21: sắp xếp vun đống (Heapsort) 23
Câu 22: Sắp xếp hòa nhập (Merge-sort) 25
Câu 23: Quân hậu 26
Câu 24: giai thừa 28
Câu 25: Duyệt cây thứ tự sau 30
Câu 26: ưu nhược các phương pháp sắp xếp 30
Trang 2Câu 1: Trình bày mối quan hệ giữa cấu trúc dữ liệu và giải thuật Cho ví dụ minh họa
Cấu trúc dữ liệu và giải thuật có mối quan hệ mật thiết
Giải thuật là một hệ thống chặt chẽ và rõ ràng các qui tắc nhằm xác định 1 dãy cácthao tác trên những đối tượng, sao cho sau 1 số bước hữu hạn thực hiện các thaotác đó ta thu được kết quả mong muốn
Cấu trúc dữ liệu: là cách tổ chức, lưu trữ dữ liệu trong MTDT 1 cách có thứ tự, có
hệ thống nhằm sử dụng dữ liệu 1 cách hiệu quả
Ctdl và gt có mối liên hệ chặt chẽ với nhau, chúng luôn tồn tại song song đi kèmnhau theo công thức: ctdl+gt=ctrinh
Bản thân các phần tử của dữ liệu thường có mối quan hệ với nhau, ngoài ra nếubiết tổ chức chúng theo các cấu trúc dữ liệu thích hợp thì việc thực hiện các phép
xử lý trên các dữ liệu sẽ càng thuận lợi hơn, đạt hiệu quả cao hơn Với 1 ctdl đãchọn ta sẽ có giải thuật xử lý tương ứng Ctdl thay đổi thì giải thuật cũng thay đổitheo Để có 1 ctrinh tốt, ta cần phải chọn được ctdl phù hợp và chọn được 1 gtđúng đắn
Vd: Giả sử ta có 1 danh sách các trường đại học và cao đẳng trên cả nước mỗitrường có các thông tin sau: Tên trường, địa chỉ, sđt phòng đào tạo Ta muốn viếtmột chương trình trên máy tính điện tử để khi cho biết “tên trường” máy sẽ hiện ramàn hình cho ta: “địa chỉ” và “số điện thoại phòng đào tạo” của trường đó
1 cách đơn giản là cứ duyệt tuần tự các tên trường trong dnah sách cho tới khi tìmthấy trên trường cần tìm thì sẽ đói chiếu ra “địa chỉ” và “số điện thoại phòng đàotạo” của trường đó Cách tìm tuần tự này rõ ràng chỉ chấp nhận được khi danh sáchngắn còn danh sách dài thì rất mất thời gian
Nếu ta biết tổ chức lại danh sách bằng cách sắp xếp theo thứ tự từ điển của têntrường, thì có thể áp dụng 1 giải thuật tìm kiếm khác tốt hơn, tương tự như ta vẫnthường làm khi tra từ điển Cách tìm này nhanh hơn cách trên rất nhiều nhưngkhông thể áp dụng được với dữ liệu chưa được sắp xếp
Nếu lại biết tổ chức thêm 1 bảng mục lục chỉ dẫn theo chữ cái đầu tiên của têntrường, thì khi tìm “địa chỉ” và “số điện thoại phòng đào tạo” của Hvktmm ta sẽ bỏqua được các tên trường mà chữ cái đầu không phải là “H”
Như vậy giữa cấu trúc dl và gt có mqh mật thiết Có thể coi chúng như hình vớibóng, không thể nói gới cái này mà không nhắc tới cái kia
Câu 2: Cấu trúc dữ liệu và phép toán
Đối với các bài toán phi số, đi đôi với các cấu trúc dữ liệu mwosi cũng xuất hiệncác phép toán mới tác động trên các cấu trúc ấy Thông thường có các phép toánnhư : phép tạo lập hoặc hủy bỏ một cấu trúc, phép truy nhập vào từng phần tử củacấu trúc, phép bổ sung hoặc laoij bỏ một phần tử trên cấu trúc…
Trang 3Các phép toán đó sẽ có những tác dụng khác nhau đối với từng cấu trúc Có phéptoán hữu hiệu đối với cấu trúc này nhưng lại tỏ ra không hữu hiệu trên các cấu trúckhác.
Vì vậy khi chọn một cấu trúc dữ liệu ta phải nghĩ ngay tới các phép toán tác độngtrên cấu trúc ấy và ngược lại, nói tới phép toán thì lại phải chú ý tới phép đó đktác động trên cấu trúc dữ liệu nào Cho nên người ta thường quan niệm : nói tới cấutrúc dữ liệu là bao hàm luôn cả phép toán tác động đến cấu trúc ấy
Câu 3: Trình bày sự khác nhau của cấu trúc dữ liệu và cấu trúc lưu trữ, cho
Vd: cấu trúc lưu trữ kế tiếp ( mảng) và cấu trúc lưu trữ móc nối đều có thể
đk dùng để cài đặt cấu trúc dữ liệu ngăn xếp (stack) Mặt khác, các cấu trúc dữ liệunhue : danh sách, ngân xếp và cây đều có thể cài đặt trên máy thông qua cấu trúclưu trữ móc nối
Câu 4: Trình bày những đặc điểm về cấu trúc trong các ngôn ngữ lt bậc cao,
có liên hệ với ngôn ngữ C
Trong các ngôn ngữ lập trình bậc cao, các dữ liệu được phân nhánh thành các kiểu
dữ liệu kiểu dữ liệu nhận của một biến được xác đinh bởi một tập các giá trị màbiến đó có thể nhận và các phép toán có thể thực hiện trên các giá trị đó
Mỗi ngôn ngữ lập trình cung cấp cho chúng ta một số kiểu dữ liệu cơ bạn trongcác ngôn ngữ lập trình khác nhau , các kiểu dữ liệu cơ bản có thể khác nhau Cácngôn ngữ lập trình như C, pascal… có các kiểu dữ liệu cơ bản rất phong phú
Các kiểu dữ liệu đk tạo thành từ nhiều kiểu dữ liệu khác nhau được gọi la kiểu dữliệu có cấu trúc Các dữ liệu thuộc kiểu dữ liệu cấu trúc được gọi là cấu trúc dữliệu
Từ các kiểu cơ bản , bằng cách sử dụng các quy tắc ,cú pháp để kiến tạo các kiểu
dữ liệu, người lập trình có thể xây dựng nên được gọi là các kiểu dữ liệu xác địnhbởi người sử dụng
=> Như vậy: một cấu trúc dữ liệu phức hợp gồm nhiều thành phần dữ liệu, mỗithành phần hoặc là dữ liệu cơ sở hoặc là cấu trúc dữ liệu đã đk xây dựng Cácthành phần dữ liệu tạo nên một cấu trúc dữ liệu đk liên kết với nhau theo một cáchnào đó
Trang 4+) Liên kết dữ liệu cùng kiểu tạo thành mảng dữ liệu.
+) Liên kết các dữ liệu thành mảng cấu trúc trong C
+) Sử dụng con trỏ để liên kết dữ liệu
Câu 5 : Phương pháp thiết kế Top_Down
Ngày nay công nghệ thông tin đã và đang được ứng dụng trong mọi lĩnh vực củacuộc sống, bởi vậy các bài toán giải được trên máy tính điện tử rất đa dạng vàophức tạp, các giải thuật và chương trình để giải chúng cũng có quy mô ngày cànglớn , nên càng khó thì ta càng muốn tìm hiểu và thiết lập chúng
Tuy nhiên ta cũng thấy rằng mọi việc sẽ đơn giản hơn nếu như có thể phân chiabài toán lớn thành các bài toán nhỏ hơn Điều đó cũng có nghã là nếu coi bài toáncủa ta như một mô đun chính thì cần chia nó thành các mô đun con, và dĩ nhiên,với tinh thần như thế, đến lượt nó, mỗi mô đun con này lại tiếp tục được chia tiếpcho tới những mô đun ứng với các phần việc cơ bản mà ta đã biết cách giải quyết.Như vậy việc tổ chức lời giải của các bài toán sẽ được thể hiện theo một cấu trúcnhân cấp có dạng như sau :
Cách giải quyết bài toán theo hình như vậy được gọi là chiến thuật “ chia để trị”
Để thể hiện chiến thuật đó, người ta dùng cách thiết kế “ đinh_xuống” (top-downdesign) Đó là cách phân tích tổng quát toàn bộ vấn đề, xuất phát từ dữ kiện và cácmục tiêu đặt ra để đề cập đến những công việc chủ yếu trước, rồi sau đó mwosi đidần vào giải quyết các phần việc cụ thể một cách chi tiết hơn, cũng vì vậy màngười ta còn gọi cách thiết kế này là cách thiết kế từ khái quát đến chi tiết
Ví dụ: để viết chương trình quản lí bán hàng chạy trên máy tính, với các yêucầu là : hàng ngày phải nhập các hóa đơn bán hàng, hóa đơn nhập hàng, tìm kiếmcác hóa đơn đã nhập để xem hoặc sửa lại in các hóa đơn cho khách hàng; tínhdoanh thu, lợi nhuận trong khoảng thời gian bất kì; tính tổng hợp kho, tính doanh
Xử lí dữ liệu về các hóa đơn bán hàng, hóa đơn nhập hàng
In các báo cáo về doanh thu, lợi nhuận
Có thể hình dung cách thiết kế này theo sơ đồ cấu trúc sau:
Trang 5Chia bài toán chính thành 3 bài toán nhỏ
Các nhiệm vụ ở mức đầu này thường vẫn còn tương đối phức tạp, nên cần phảichia tiếp thành các nhiệm vụ con Chằng hạn nhiệm vụ “ xử lí doanh mục” đượcchia thành hai là “ danh mục hàng hóa” và “ danh mục khách hàng”
Trong danh mục hàng hóa lại có thể chia thành các nhiệm vụ nhỏ hơn như:
Thông thường, đối với các bài toán lớn, việc giải quyết nó phải do nhiều ngườicùng làm Chính phương pháp mô đun hóa sẽ cho phép tách bài toán ra thành cácphần độc lập, tạo điều kiện cho các nhóm giải quyết phần việc của mình mà khôngảnh hưởng gì đến nhóm khác Với chương trình được xây dựng trên cơ sở của cácgiải thuật được thiết kế theo cách này , thì việc tìm hiểu cũng như sửa chữa, chỉnh
lí sẽ đơn giản hơn
Xử lí hóa đơn In các báo cáo
Trang 6Trong thực tế, việc phân tích bài toán thành các bài toán con như thế không phải làviệc dễ dàng Chính vì vậy mà có những bài toán, nhiệm vụ phân tích và thiết kếgiải thuật giải bài toán còn mất nhiều thời gian và công sức hơn cả nhiệm vụ lậptrình.
Câu 6: Phương pháp tinh chỉnh từng bước ( stepwise refinement)
Tinh chỉnh bước là phương pháp thiết kế giải thuật gắn liền với lập trình Nó phảnánh tinh thần của quá trình mô đun hóa bài toán và thiết kế kiểu top-down
Ban đầu chương trình thể hiện giải thuật được trình bày bằng ngôn ngữ tựnhiên, phản ánh ý chính của của công việc cần làm Từ các bước sau, những lời ,những ý đó sẽ được chi tiết hóa dần dần tương ứng với những công việc nhỏ hơn
Ta gọi đó là các bước tinh chỉnh, sự tinh chỉnh này sẽ hướng về phía ngôn ngữ lậptrình mà ta đã chọn Càng ở các bước sau, các lời lẽ đặc tả công việc cần xử lí sẽđược thay thế dần bởi các câu lệnh hướng tới câu lệnh của ngôn ngữ lập trình.Muốn vậy, ở các giai đoạn trung gian người ta thường dùng pha tạp cả ngôn ngữ tựnhiên lẫn ngôn ngữ lập trình, mà người ta gọi là “ giả ngôn ngữ” hay “ giả mã”.Như vậy nghĩa là quá trình thiết kế giải thuật và phát triển chương trình sẽ đượcthể hiện dần dần, từ dạng ngôn ngữ tự nhiên, qua giả ngôn ngữ, rồi đến ngôn ngữlập trình, và đi từ mức” làm cái gì” đến mức “ làm như thế nào”, ngày càng sát vớicác chức năng ứng với các câu lệnh của ngôn ngữ lập trình đã chọn
Trong quá trình này dữ liệu cũng được “ tính chế “ dần dần từ dạng cấu trúc
dữ liệu đến dạng cấu trúc lưu trữ cụ thể trên máy
Các bước: diễn đạt gt bằng ngôn ngữ tự nhiên Thay thế lời lẽ đặc tả côngviệc bằng các câu lệnh hướng tới câu lệnh của ngôn ngữ ltrinh, dùng giả ngôn ngữhay giả mã Viết bằng n2 lập trình
Câu 7: Trình bày cách phân tích thời gian thực hiện giải thuật
Thời gian thực hiện một giải thuật phụ thuộc vào rất nhiều yếu tố 1 yếu tốcần chú ý trc tiên đó là kích thước của dữ liệu đưa vào Chẳng hạn thời gian sắpxếp 1 dãy số phải chịu ảnh hưởng của số lượng các số thuộc dãy số đó Nếu gọi n
là số lượng này thì thời gian thực hiện T của 1 giải thuật phải được biểu diễn như 1hàm của n: T(n)
Các kiểu lệnh cà tốc độ xử lý của máy tính ngôn ngữ viết chương trình và chươngtrình dịch ngôn ngữ ấy đều ảnh hưởng tới thời gian thực hiện, nhưng những yếu tốnày không đồng đều với mọi loại máy trên đó cài đặt giải thuật, vì vậy không thểdựa vào chúng khi xác lập T(n) Điều đố cũng có nghĩa là T(n) không thể đượcbiểu diễn thành đơn vị thời gian bằng giây, bằng phút được Tuy nhiên không
Trang 7phải vì thế mà không thể so sánh được các giải thuật về mặt tốc độ Nếu thời gianthực hiện của 1 giải thuật là T1(n)=cn2 và thời gian thực hiện của 1 giải thuật khác
là T2(n)=kn (với c và k là 1 hằng số nào đó) thì n khá lớn, thời gian thực hiện giảithuật T2 rõ ràng ít hơn so với giải thuật T1 Và như vậy thì nếu nói thời gian thựchiện giải thuật T(n) tỉ lệ với n2 hay tỉ lệ với n cũng cho ta ý niệm về tốc độ thựchiện giải thuật đó khi n khá lớn (với n nhỏ thì việc xét T(n) không có ý nghĩa)
Câu 8 Trình bày cách Xác định độ phức tạp tính toán của giải thuật, với những nội dung: Qui tắc tổng, phép toán tích cực, thời gian chạy của các câu lệnh lặp, cho ví dụ minh họa.
Nếu thời gian thực hiện 1 giải thuật là T(n)=cn2 (c là hằng số) thì ta nói : độ phứctạp tính toán của giải thuật này có cấp là n2 và ta ký hiệu:
Ví dụ: trong 1 chương trình có 3 bước thực hiện mà thời gian thực hiện từng bướclần lượt là O(n2), O(n3) và O(n log2n) thì thời gian thực hiện 2 bước đầu làO(max(n2,n3))=O(n3) thời gian thực hiện chương trình sẽ là:
O(max(n3, n log2n))=O(n3)
Thời gian chạy của các câu lệnh lặp:
Các câu lệnh lặp gồm: for, while, do while
Để đánh giá thời gian thực hiện 1 câu lệnh lặp, trước hết ta cần đánh giá số tối đacác lần lặp giả sử đó là L(n) Sau đó đnahs giái thời gian chạy của mỗi lần lặp, chú
ý rằng thời gian thực hiện thân của 1 lệnh lặp ở các lần lặp khác nhau có thể khácnhau, giả sử thời gian thực hiện thân lệnh lặp ở lần thứ i(i=1,2, L(n)) là Ti(n) Mỗilần lặp, chúng ta cần kiểm tra điều kiện lặp giả sử thời gian lặp kiểm tra là T0(n).Như vậy thời gian chạy của lệnh lặp là:
Trang 8lần lặp tối đa là bao nhiêu Nhưng cũng không ít các lệnh lặp, từ điều kiện lặp đểsuy ra số tối đa các lần lặp, ta cần phải tiến hành các suy diễn không đơn giản.Trường hợp hay gặp là kiểm tra điều kiện lặp chỉ cần thời gian O(1), thời gian thựchiện các lần lặp là như nhau và giả sử ta đánh giá được là O(f(n)); khi đó nếu đánhgiá được số lần lặp là O(g(n)) thì thời gian chạy của lệnh lặp là O(g(n)).f(n)
Ví dụ: giải sử có mảng A các số thực, cỡ n và ta cần tìm xem mảng có chứa số thực
x không Điều đó có thể thực hiện bởi giải thuật tìm kiếm tuần tự như sau:
i=0;
while(i<n&& x!=A[i])
i++;
lệnh gán (1) có thời gian chạy là O(1) Lệnh lặp (2)-(3) có số tối đa các lần lặp là n,
đó là trường hợp x chỉ xuất hiện ở thành phần cuối cùng của mảng A[n-1] hoặc xkhông có trong mảng Thân của lệnh lặp là lệnh (3) có thời gian chạy O(1) Do đó,lệnh lặp có thời gian chạy là O(n) Giải thuật gồm lệnh gán và lệnh lặp với thờigian là O(1) và O(n), nên thời gian chạy của nó là O(n)
phép toán tích cực: Đó là phép toán thuộc giải thuật mà thời gian thực hiện không
ít hơn thời gian thực hiện các phép khác hay nói cách khác: số lần thực hiện nókhông kém các phép khác
Câu 9 : Trình bày ( bằng ngôn ngữ tựa C ) giải thuật bổ sung một nút mới có chứa dữ liệu X vào trước nút con trỏ bởi Q trong danh sách móc nối hai chiều với : Pdau trỏ và phần tử đầu, Pcuoi trỏ vào phần tử cuối, mỗi nút có cấu trúc như sau :
P_L trỏ tới con trỏ bên trái
P_R trỏ tới con trỏ bên phải
THEM_NUT ( Pdau, Pcuoi, Q, X)
{
/*Cho con trỏ L, R lần lưượt trỏ tới nút cực trái và nút cực phải của một danhsách móc nối kép, Q là con trỏ trỏ tới một nút trong danh sách này Giải thuật đượcthực hiện bổ sung một nút mới, mà dữ liệu chứa ở X, vào trước nút trỏ bởi Q */
P = MALLOC(); // tạo một con trỏ mới
Trang 9Câu 10 : Trình bày ( bằng ngôn ngữ tựa C ) giải thuật loại bỏ một nút trỏ bởi
Q trong danh sách móc nối hai chiều với : Pdau chỉ vào phần tử đầu, Pcuoi chỉ vào phần tử cuối, mỗi nút có cấu trúc như sau:
P_L trỏ tới con trỏ bên trái
P_R trỏ tới con trỏ bên phảiXOA_NUT (Pdau, Pcuoi, Q )
Pdau = Q-> P_RPdau -> P_L = NULL;
}Else
Trang 10If ( Q == Pcuoi ) {
Pcuoi = Pcuoi -> P_L;
Pcuoi -> P_R = NULL;
}Else {
Q -> P_L -> P_R = Q -> P_R;
Q -> P_R -> P_L = Q -> P_L;
}Free(Q);
D -> NEXT = P;//gán P vào đuôi
Else // chưa có đuôi
Trang 11B1: Khởi tạo 1 stack rỗng
B2: Đọc lần lượt các phần tử của biểu thức từ trái qua phải
Nếu là toán hạng, đẩy vào stack
Nếu là toán tử X, lấy từ stack ra 2 giá trị (Y và Z) sau đó áp dụng toán tử đó vào 2giá trị vừa lấy ra, đẩy kết quả tìm được (Z X Y) vào stack
Trang 12B3: sau khi kết thúc B2, thì tất cả biểu thức hậu tố đã đọc xong, trong stack cònduy nhất 1 phần tử là giá trị của biểu thức
1 khởi tạo 1 ngăn xếp (stack) rỗng
2 đọc lần lượt các thành phần trong biểu thức
nếu X là toán hạng thì viết nó vào biểu thức hậu tố (in ra)
nếu X là phép toán thì thực hiện:
+ nếu stack không rỗng thì: nếu phần tử ở đỉnh stack là phép toán có độ ưu tiên caohơn hoặc bằng phép toán hiện thời (X) thì phép toán đó được kéo ra khỏi stack vàviết vào biểu thức hậu tố (lặp lại bước này)
+ nếu stack rỗng hoặc phần ử ở đỉnh ngăn xếp là dấu mở ngoặc hoặc phép toán ởđỉnh ngăn xếp có quyền ưu tiên thấp hơn phép toán hiện thời (X) thì phép toán hiệnthời được đẩy vào ngăn xếp
nếu X là dấu mở ngoặc thì nó được đẩy vào stack
nếu X là dấu đóng ngoặc thì thực hiện:
Trang 13+ (bước lặp):loại các phép toán ở đỉnh ngăn xếp và viết vào biểu thức dạng hậu tốcho tới khi đỉnh ngăn xếp là dấu mở ngoặc
+ loại dấu mở ngoặc khỏi ngăn xếp
3 sau khi toàn bộ biểu thức dạng trung tố được đọc, loại lần lượt các phép toán ởđỉnh stack và viết vào biểu thức hậu tố cho tới khi stack rỗng
if ((T>-1) && (S[T] là phép toán có độ ưu tiên cao hơn X))
Trang 14Câu 14: Trình bày (nn tựa C) giải thuật duyệt cây theo thứ tự trước, ko đệ quy, dùng stack
nếu cây con phải khác rỗng thì lưu địa chỉ gốc cây con phải vào stack
chuyển xuống cây con trái, in ra khóa của nút con trái (lặp lại)
Giải thuật:
T là con trỏ trỏ tới gốc cây đã cho
S là 1 ngăn xếp (stack) được cài đặt bằng mảng với biến trỏ TOP trỏ tới đỉnh
Con trỏ P được dùng để trỏ tới nút hiện đang được xét
Có sử dụng các hàm PUSH và POP
PUSH: Bổ sung 1 phần tử vào ngăn xếp
POP: Loại 1 phần tử ở đỉnh ngăn xếp đang được trỏ bởi T
If(P -> P_R! = NULL) PUSH(S,TOP, P->P_R);
P = P -> P_L;
}
Trang 15lấy phần tử trên cùng ra khỏi stack, trỏ vào vị trí của nút đó trên cây
in ra khóa của nút đang xét
trỏ đến cây con phải
(lặp lại cho tới khi stack rỗng)
Giải thuật:
T là con trỏ trỏ tới gốc cây đã cho
S là 1 ngăn xếp (stack) được cài đặt bằng mảng với biến trỏ TOP trỏ tới đỉnh
Con trỏ P được dùng để trỏ tới nút hiện đang được xét
Có sử dụng các hàm PUSH và POP
PUSH: Bổ sung 1 phần tử vào ngăn xếp
POP: Loại 1 phần tử ở đỉnh ngăn xếp đang được trỏ bởi T
Trang 16Printf(“P->DaTa”);
P=P->R;
}Else
{PUSH(S,TOP,P);
P = P->L;
}}
}
Câu 16: Tìm kiếm nhị fân
Ý tưởng:
giả sử dãy ban đầu được sắp xếp theo thứ tự tăng dần (K0<K1< <Kn)
ta chọn khóa ở "giữa" (giả sử Kg) của dãy đang xét để so sánh
+ nếu x = Kg : tìm thấy x trong dãy, dừng quá trình tìm kiếm
+ nếu x < Kg : nếu x có trong dãy thì x nằm ở nửa bên trái của Kg
+ nếu x > Kg : nếu x có trong dãy thì x nằm ở nửa bên phải của Kg
việc tìm kiếm x trên nửa bến trái (hoặc bên phải) của Kg được thực
hiện như việc tìm x trên cả dãy ban đầu
if( x==K[g] ) return g;
if( x<K[g] ) TimKiem_dq(K,t,g-1,x);
else TimKiem_dq(K,g+1, p,x)}
}