Ôn Tập Thi Cuối Kì - Answerkey

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

ÔN TẬP THI CUỐI KÌ

Bài 1: Đánh giá độ phức tạp đoạn chương trình sau:


a)
def Function(n):
i = 1
s = 0
while s <= n:
s = s + 1
print(s)

Trả lời:
T(n) = 2n + 3
=>T(n) = O(n) (Tự khai triển để ra được kq này)

b)
def Function(n):
count = 0
for i in range( n ) :
count += 1
for j in range( n ) :
count += 1
return count

Trả lời:
T(n) = 2n + 2
=>T(n) = O(n) (Tự khai triển để ra được kq này)

c)
def Function(n):
for i in range(O, n):
j = 1
while j <= n:
j = j + 1
Function(20)
Trả lời:
T(n) = (2n+1).n + 1 = 2n2 + n + 1
=>T(n) = O(n2) (Tự khai triển để ra được kq này)

1
Bài 2:
a) Viết chương trình đệ quy tính 𝑆(𝑛) = 1 + 3 + 5 . . . +(2𝑛 + 1)
b) Đánh giá độ phức tạp của chương trình trên

a) S(0) = 2.0 +1 = 1
S(1) = S(0) + 2.1 + 1 = 4
S(2) = S(1) + 2.2 + 1
…..
S(n) = S(n-1) +2.n + 1

Chương trình
def Sum4(n):
if (n == 0):
return 1
else:
return 2*n + 1 + Sum4(n-1)

b)
𝑇(𝑛) = 1 𝑛ế𝑢 𝑛 = 0
{
𝑇 (𝑛 ) = 𝑇 (𝑛 − 1) + 2

Tính T(n):
T(0) = 1
T(n) = T(n-1) + 2
= T(n-2) + 2.2
= T(n-3) + 2.3
…….
= T(n-n) + 2.n
= T(0) + 2.n = 2n + 1
Vậy Độ phức tạp của T(n) là O(n)

2
Bài 3: Một nhà máy cần lưu trữ dữ liệu thông tin cá nhân của công nhân gồm 3 thuộc
tính: Mã công nhân, họ tên, tuổi
1. Đưa ra giải pháp sử dụng danh sách liên kết đơn giải quyết yêu cầu trên
Khởi tạo một node gồm 4 trường: 3 trường dữ liệu và 1 trường liên kết
class ListNode:
def __init__(self, id, hoten, tuoi):
self.id = id
self.hoten = hoten
self.tuoi = tuoi
self.next = None
2. Viết đoạn mã giả thực hiện các công việc sau:
a) Thêm một công nhân vào đầu danh sách liên kết đơn (làm tương tự như đoạn bên
dưới chỉ thay tham số ở hàm ListNode)

b) Tìm kiếm công nhân trong danh sách liên kết đơn
Gợi ý: có thể sắp xếp theo id, thay target và data trong ảnh bằng id

c) Xóa công nhân ra khỏi danh sách liên kết đơn


Gợi ý: có thể xóa theo id, thay target và data trong ảnh bằng id

3
Code tham khảo:
class Node:
def __init__(self, id, hoten, tuoi):
self.id = id
self.hoten = hoten
self.tuoi = tuoi
self.next = None

class Dslk:
def __init__(self):
self.head = None

def Prenode(self, id, hoten, tuoi):


newnode = Node(id, hoten, tuoi)
newnode.next = self.head
self.head = newnode

def searchnode(self, id):


curnode = self.head
while curnode is not None and curnode.id != id:
curnode = curnode.next
return curnode is not None
# if curnode is not None:
# print("Tim thay nhan vien co id = " ,id,"trong danh sach")
# else:
# print("Khong tim thay nhan vien co id = ", id,"trong danh
sach")

def removenode(self, id):


prevnode = None
curnode = self.head

while curnode is not None and curnode.id != id:


prevnode = curnode
curnode = curnode.next
if curnode is not None:
if curnode is self.head:
self.head = curnode.next
else:
prevnode.next = curnode.next
else:
print("Khong tim thay nhan vien co id = ", id)

def printds(self):

4
curnode = self.head
while curnode is not None:
print(curnode.id, curnode.hoten, curnode.tuoi)
curnode = curnode.next

llist = Dslk()
llist.Prenode(6, "Nguyen Tien Dat", 21)
llist.Prenode(5, "Lo Sam Thu Uyen", 20)
llist.Prenode(3, "Nguyen Van Anh", 21)
llist.Prenode(4, "Pham Ngoc Van Anh", 23)
llist.Prenode(2, "Tran Nhat Giang", 20)
llist.Prenode(1, "Bach Duc Anh", 20)

llist.printds()
print(llist.searchnode(4))
llist.removenode(5)
print("Danh sach sau khi xoa la: ")
llist.printds()

Bài 4:
a) Nêu định nghĩa cấu trúc dữ liệu Stack
− Ngăn xếp là một cấu trúc dữ liệu tuyến tính đặc biệt trong đó việc bổ sung và loại
bỏ phần tử được thực hiện ở một đầu thường được gọi là đỉnh (Top) của ngăn
xếp. Đầu còn lại được gọi là đáy (Base) của ngăn xếp.
− Các phép toán:
• Stack(): Khởi tạo một ngăn xếp rỗng
• isEmpty(): Hàm trả về True nếu ngăn xếp rỗng và False nếu ngược lại
• length(): Trả về số phần tử của ngăn xếp
• push(x): Đẩy x vào đỉnh của ngăn xếp
• pop(): Loại đối tượng ở đỉnh của ngăn xếp
• getTop(): Hàm trả về đối tượng ở đỉnh của ngăn xếp, nội dung ngăn xếp không
thay đổi

b) Cài đặt phép toán Push, pop Stack bằng danh sách liên kết

5
c) Nêu định nghĩa cấu trúc dữ liệu Queue
− Hàng đợi là một cấu trúc dữ liệu tuyến tính đặc biệt trong đó một phần tử mới
được thêm vào ở lối sau (back) và các phần tử của hàng đợi bị loại bỏ ở lối trước
(front)
− Các phép toán:
• Queue(): Khởi tạo một hàng đợi rỗng
• isEmpty(): Hàm trả về True nếu hàng đợi rỗng và False nếu không.
• length(): trả về số phần tử có trong hàng đợi.
• enqueue(x,): Thêm đối tượng x vào đuôi hàng đợi.
• dequeue(): Loại đối tượng đứng ở đầu hàng đợi.
• getHead(): Hàm trả về đối tượng đứng ở đầu hàng đợi, nội dung hàng đợi thì
không thay đổi.
d) Cài đặt EnQueue, Dequeue bằng danh sách liên kết

6
Bài 5: Duyệt cây nhị phân sau:

Cách làm:
Nêu ý tưởng 3 phép duyệt (Tham khảo Slide)
a) Duyệt cây theo thứ tự trước:
Kết quả: F B A D C E G I H
b) Duyệt cây theo thứ tự giữa:
Kết quả: A B C D E F G H I
c) Duyệt cây theo thứ tự sau:
Kết quả: A C E D B H I G F

Bài 6: Cho cây nhị phân tìm kiếm rỗng


Nêu ý tưởng thuật toán (kết hợp minh họa bằng hình ảnh) để giải quyết các công
việc sau:
a) Thực hiện phép toán chèn nút gốc là 8, sau đó chèn lần lượt các nút 3, 5, 2, 20,
11, 30, 9, 18, 4 vào cây nhị phân trên
Trả lời:
− Tìm trên cây xem có nút nào chứa giá trị cần chèn không
− Nếu không có nút chứa giá trị cần chèn:
• Tạo nút mới chứa giá trị cần chèn
• Nếu cây T rỗng thì ta chỉ cần tạo ra cây T chỉ có một đỉnh gốc chứa dữ
liệu d.
• T không rỗng:
o d < giá trị tại nút gốc: Xem vào bên cây con trái
o d > giá trị tại nút gốc: Xem vào bên cây con phải

7
b) Thực hiện tìm kiếm nút 5và nút 18 trong cây nhị phân trên.
Minh họa

Trả lời:
− Ý tưởng: So sánh khóa tìm kiếm k với giá trị tại nút gốc
• Nếu k = giá trị tại nút gốc, kết thúc việc tìm kiếm với phép tìm kiếm
được thỏa
• Nếu k < giá trị tại nút gốc: Tìm trên cây con trái
• Nều k > giá trị tại nút gốc: Tìm trên cây con phải
− Kết quả:
• Có tìm thấy giá trị 5 và 18
c) Tìm nút lớn nhất và nhỏ nhất trong cây

Trả lời:
Ý tưởng:
− Phép toán tìm phần tử nhỏ nhất:
o Nếu nút gốc không có con trái thì giá trị tại nút gốc là giá trị nhỏ nhất
o Nếu nút gốc có con trái thì giá trị nhỏ nhất nằm trong cây con trái
− Phép toán tìm phần tử lớn nhất:
o Nếu nút gốc không có con phải thì giá trị tại nút gốc là giá trị lớn nhất
o Nếu nút gốc có con phải thì giá trị lớn nhất nhất nằm trong cây con phải

8
d) Xóa nút 2, nút 5, nút 20 khỏi cây nhị phân tìm kiếm
Trả lời:
− Ta thấy nút 2 là nút lá. Ta đặt trường con trái của nút 3 là None (Vì nút 2
là con trái của nút 3).
− Nút 5 là nút có 1 con. Ta thấy nút 4 là con trái của nút 5 và nút 5 là con
phải của nút 3. Đặt con phải của nút 3 là nút 4. Sau đó ta tiến hành xóa nút
5.
− Nút 20 là nút có 2 con. Nút kế nhiệm của nút 20 theo thứ tự duyệt giữa
của cây là nút 30. Ta tiến hành gán khóa từ nút 30 sang nút 20. Cuối cùng
ta loại 20 khỏi cây.
Xóa nút có 1 con

Xóa nút có 2 con

9
Bài 7: Cho dãy số A: 8, 6, 34, 22, 40, 5, 11, 23, 44, 18. Ta cần sắp xếp dãy số trên theo
thứ tự tăng dần.
a) Nêu ý tưởng và minh họa thuật toán Sắp xếp chèn giải quyết bài toán trên
(Describe the idea using the Insertion Sort to to solve this problem)
b) Nêu ý tưởng và minh họa thuật toán Sắp xếp nhanh giải quyết bài toán trên
(Describe the idea using the Quick Sort to to solve this problem)
c) Đánh giá độ phức tạp của thuật toán trên (Analyze the complexity of Insertion
Sort and Quick sort Algorithm)

Trả lời:
a)
− Ý tưởng: Tham khảo slide
− Minh họa:
i=1 8 6 34 22 40 5 11 23 44 18
i=2 6 8 34 22 40 5 11 23 44 18
i=3 6 8 22 34 40 5 11 23 44 18
i=4 6 8 22 34 40 5 11 23 44 18
i=5 6 8 22 34 40 5 11 23 44 18
i=6 5 6 8 22 34 40 11 23 44 18
i=7 5 6 8 11 22 34 40 23 44 18
i=8 5 6 8 11 22 23 34 40 44 18
i=9 5 6 8 11 18 22 23 34 40 44
Kết quả 5 6 8 11 18 22 23 34 40 44

Ghi chú: Dãy được bôi đỏ là dãy gồm k phần tử đã được sắp xếp sau bước k

b) Sắp xếp nhanh:


Ý tưởng: Tham khảo slide
Minh họa:
- Chọn 8 là phần tử chốt

10
− Gợi ý làm tiếp: Làm tương tự với 2 dãy còn lại. Dãy bên trái chọn chốt là 5, dãy
bên phải chọn chốt là 22, …
− …
c) Độ phức tạp sắp xếp chèn: O(n2)
Độ phức tạp sắp xếp nhanh: O(nlogn)

11

You might also like