Tải bản đầy đủ (.docx) (6 trang)

Thi ket thuc hoc phan cu nhan CNTT lien thong 2012

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (101.94 KB, 6 trang )

<span class='text_page_counter'>(1)</span>Thi kết thúc học phần CẤU TRÚC DỮ LIỆU VÀ GIÁI THUẬT (Cử nhân CNTT liên thông ) Thời gian: 90 phút ĐỀ 1 ----------------------------------------------------Câu 1: (2,0 điểm) a) Thế nào là một thuật giải tốt? Mục đích của việc nghiên cứu cấu trúc dữ liệu và giải thuật. b) Ví dụ minh họa cho thấy tầm quan trọng của một thuật giải hiệu quả. Câu 2 (3,5 điểm). Sử dụng cấu trúc mảng để thực hiện các yêu cầu sau: a) Định nghĩa ngăn xếp (Stack). b) Cài đặt Stack bằng cấu trúc mảng. c) Viết các thủ tục, hàm thao tác trên Stack: Tạo Stack rỗng, Kiểm tra. Stack rỗng, Kiểm tra Stack đầy, xoá (lấy) một phần tử trong Stack, Thêm một phần tử vào Stack. Câu 3 (4,5 điểm): Sử dụng cấu trúc dữ liệu danh sách trên cơ sở mảng để thực hiện các yêu cầu sau: a) Tạo cấu trúc dữ liệu danh sách trên cơ sở mảng để tổ chức quản lý 50 trường học tạo bỡi: Mã trường (MATRUONG), tên trường (TEN), địa chỉ (DIACHI), số điện thoại (SODT). b) Xây dựng các thủ tục, hàm: Khởi tạo danh sách rỗng, kiểm tra danh sách rỗng, kiểm tra danh sách đầy. c) Thực hiện các thao tác trên danh sách: - Thêm (chèn) một phần tử X vào danh sách; - Xây dựng giải thuật tìm kiếm nhị phân để tìm một phần tử X trong danh sách. -------Hết -------DUYỆT ĐỀ. RA ĐỀ. Ths. Hà Văn Dũng.

<span class='text_page_counter'>(2)</span> Hướng dẫn chấm đề 1 Câu 1: (2,0 điểm) a) - Thế nào là một thuật giải tốt (0,5 điểm) ? Có thể nêu hai tiêu chuẩn sau:  Đơn giản, dễ hiểu, dễ lập trình. (1)  Cho lời giải nhanh, dùng ít tài nguyên máy tính. (2) Nếu chỉ dùng thuật giải cho một vài lần thì tiêu chuẩn 1 quan trọng hơn tiêu chuẩn thứ 2. Trái lại, nếu đây là một bài toán rất phổ biến, thuật giải sẽ còn được dùng nhiều lần thì tiêu chuẩn 2 quan trọng hơn tiêu chuẩn 1. - Mục đích của việc nghiên cứu cấu trúc dữ liệu và giải thuật (0,5 điểm): Mục đích của việc nghiên cứu cấu trúc dữ liệu và giải thuật chính là để xây dựng các chương trình hiệu quả. Tiêu chuẩn 2 chính là tính hiệu quả của thuật giải. Một thuật giải được gọi là hiệu quả nếu nó tiết kiệm được không gian và thời gian. Tiết kiệm không gian là chiếm dụng ít bộ nhớ trong thời gian thực hiện. Tiết kiệm thời gian là chạy nhanh. Tiêu chuẩn thời gian thực hiện nhanh là quan trọng hàng đầu. Đánh giá độ phức tạp của thuật giải là đánh giá thời gian thực hiện nó. b) Ví dụ minh họa cho thấy tầm quan trọng của một thuật giải hiệu quả (1,0 điểm) Sinh viên tùy chọn ví dụ minh họa, sau đây là một ví dụ.  Xét bài toán tính định thức cấp n. Giả sử M = aij là ma trận vuông n x n. Cần tính định thức det(M). a1,1 a12 . . . . a1n .. M=. . .. an1 an2 . . . . ann Nếu n = 1 thí det(M) = a11 . - Trái lại, n > 1 sử dụng công thức khai triển theo định thức hàng để đưa về định thức cấp thấp hơn. Giải thuật này sẽ cần đến n.(n-1).(n-2)… 1 = n! phép tính nhân. Mà n! là một số rất lớn ngay khi cả n là không lớn lắm. Sẽ cần đến.

<span class='text_page_counter'>(3)</span> hàng triệu năm để tính một định thức cấp 100. Rõ ràng là không thể chấp nhận một thuật toán như thế. - Đưa ma trận về dạng đường chéo.Tính định thức bằng tích các phần tử trên đường chéo.  Dùng thuật toán này tính định thức cấp n chỉ cần n3 phép tính. Chỉ cần không quá 1 giây để tính định thức cấp 100. Câu 2 (3,5 điểm) a) Định nghĩa Stack (0,5 điểm) - Stack là một danh sách mà các đối tượng được thêm vào và lấy ra chỉ ở một đầu của danh sách. - Vì thế, việc thêm một đối tượng vào Stack hoặc lấy một đối tượng ra khỏi Stack được thực hiện theo cơ chế LIFO (Last In First Out - Vào sau ra trước) - Các đối tượng có thể được thêm vào Stack bất kỳ lúc nào nhưng chỉ có đối tượng thêm vào sau cùng mới được phép lấy ra khỏi Stack b) Cài đặt Stack (0,5 điểm) (sinh viên có thể sử dụng ngôn ngữ Pascal hoặc C, C++ để minh họa thuật toán, 0,5 điểm/phép toán) CONST maxlength=...; {độ dài của mảng} TYPEelementType = ...; {kiểu các phần tử trong ngăn xếp} STACK = record element:array[1..maxlength] of elementtype; top_idx: integer; {giữ đỉnh ngăn xếp} end; c) Các phép toán cơ bản trên Stack (2,5 điểm: 0,5 điểm/ phép toán) 1. Tạo ngăn xếp rỗng Procedure MAKENULL_STACK(var s:stack); begin s.top_idx:=maxlength+1; end; 2. Kiểm tra ngăn xếp rỗng Function EMPTY_STACK(s:stack):boolean; begin EMPTY_STACK:=(s.top_idx=maxlength+1);.

<span class='text_page_counter'>(4)</span> end; 3. Kiểm tra ngăn xếp đầy Function FULL_STACK(S:stack):boolean; begin FULL_STACK:=(s.top_idx=1); end; 4. Thủ tục xoá (lấy) một phần tử Procedure POP(var S:STACK); begin if not EMPTY_STACK(s) then s.top_idx:=s.top_idx+1; Else writeln('Lỗi: ngăn xếp rỗng'); end; 5. Thêm một phần tử vào ngăn xếp Procedure PUSH(x:elementtype;var s:stack); begin if not FULL_STACK(s) then begin S.top_idx:=S.top_idx-1; S.element[S.top_idx]:=x end else writeln('lỗi: ngăn xếp đầy'); end; Câu 3(4,5 điểm) a) Tạo cấu trúc dữ liệu cho danh sách (1,5 điểm) CONST Max = 50; TYPE Truong = record MATRUONG : string [5] TEN: string [30]; DIACHI: string [50]; SODT: word; End; LArray = array [1..max] of truong; List = record Size: word;.

<span class='text_page_counter'>(5)</span> Data: LArray; End; Var ds: list; b) Xây dựng các thủ tục hoặc hàm: Khởi tạo danh sách rỗng, kiểm tra danh sách rỗng, kiểm tra danh sách đầy. (1,0 điểm) Procedure InitList (var ds: list); Begin Ds.Size := 0; End; Function Empty (ds: list): boolean; Begin Empty : = ds.size = 0; End; Function Full (ds: list): boolean; Begin Full := ds.size >= max; End; c) Thực hiện các thao tác trên danh sách: - Thêm một trường (phần tử) X vào danh sách; (1,0 điểm) Procedure InsertList (X: dataType; var ds: list, i: word); Var j: word; Begin If not Full (ds) then Begin Inc(ds.size) If ( i > = 1) and (I <= ds.size) then For j := ds.size downto I + 1 do Ds.data [j - 1] Else I : = ds.size; Ds.data := X.

<span class='text_page_counter'>(6)</span> End; End; Xây dựng giải thuật tìm kiếm nhị phân để tìm một trường (phần tử) X trong danh sách; (1,0 điểm) Function Search (X: dataType; ds: list): word; Var Lo, Hi, Mid: word; Found: boolean; Begin Lo := 1; Hi := ds.size; Found = false; While (hi > = lo) and (not found) do Begin Mid := (lo + hi) div 2; If sless (ds.data[mid], X) then Lo := mid + 1 Else If equal(ds.data[mid], X) then Found := true; Else Hi := Hi – 1; End; If found then Search := mid; Else Search := 0; End;.

<span class='text_page_counter'>(7)</span>

×