1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tập môn phân tích và thiết kế thuật toán homework 03 Độ phức tạp và các ký hiệu tiệm cận

22 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Độ Phức Tạp và Các Ký Hiệu Tiệm Cận
Tác giả Trần Đình Khánh Đăng, Lê Minh Nhựt, Lê Cảnh Nhật, Nguyễn Hùng Phát
Người hướng dẫn Huỳnh Thị Thanh Thương
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Phân tích và Thiết kế Thuật Toán
Thể loại Homework
Năm xuất bản 2024
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 22
Dung lượng 2,24 MB

Nội dung

KHOA KHOA HỌC MÁY TÍNHBÀI TẬP MÔN PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁNHOMEWORK 03: ĐỘ PHỨC TẠP VÀ CÁC KÝ HIỆU TIỆM CẬN GV hướng dẫn: Huỳnh Thị Thanh Thương Nhóm sinh viên thực hiện:... join

Trang 1

KHOA KHOA HỌC MÁY TÍNH

BÀI TẬP MÔN PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁNHOMEWORK 03:

ĐỘ PHỨC TẠP VÀ CÁC KÝ HIỆU TIỆM CẬN

GV hướng dẫn: Huỳnh Thị Thanh Thương

Nhóm sinh viên thực hiện:

Trang 2

BÀI 1:

Bảng giá trị n lớn nhất ứng với hàm f(n) và thời gian t

1 second 1 minute 1 hour 1 day 1 month 1 year 1 century

return math log(n) / math log( ) 2

'''Danh sách các hàm phức tạp tính toán thời gian chạy'''

complexities = [lambda n: math sqrt(n), # f(n)=sqrt()

''' Giới hạn tối đa cho từng hàm phức tạp '''

max_bound = [ 1e40, 1e20, 1e20, 1e10, 1e10, 100, 100 ]

'''Thời gian thực thi tương ứng, với số phép tính máy tính có thể tính toán trong 1 giây là 10^6'''

''' Tính số mũ của 10 cho giá trị thời gian t '''

exp = int (math log10(t))

'''Tính hệ số cho giá trị thời gian t, làm tròn tới chữ số thập phân thứ 2'''

coeff = round (t / ( 10 ** exp), 2 )

1

Trang 3

'''Kiểm tra nếu hệ số là 1.0'''

if coeff == 1.0 :

'''Trả về chuỗi biểu diễn 10 mũ exp'''

return ' 10^{}' format(exp)

else:

'''Trả về chuỗi biểu diễn hệ số nhân với 10 mũ exp'''

return '{}*10^{}' format(coeff, exp)

print ('1 giây | 1 phút | 1 giờ | 1 ngày | 1 tháng | 1 năm | 1 thế kỷ')

'''In ra các giá trị n lớn nhất có thể thực thi của hàm lgn'''

print ('lgn: 2^(', end='')

print (') | 2^(' join( map (format_time, times)), end ='')

print (' ') )

'''Do giá trị của n với trường hợp lgn quá lớn nên

không thể tính toán bằng máy tính theo phương pháp bên dưới

vì vậy em dùng cách trên để có thể biểu diễn kết quả'''

'''Duyệt qua từng hàm phức tạp tính toán thời gian chạy'''

for k in range len ( (complexities)):

'''Lấy hàm phức tạp tính toán thời gian chạy thứ k từ

'''Khởi tạo biến left và right cho thuật toán tìm kiếm nhị phân'''

left, right = 0, int (max_bound[k])

'''Khởi tạo biến max_n để lưu trữ giá trị lớn nhất của n

thỏa mãn thời gian t'''

max_n = 0

'''Thực hiện thuật toán tìm kiếm nhị phân để tìm giá trị lớn nhất của n thỏa mãn thời gian t'''

while left <= right:

mid = (left + right) // 2

'''Tính toán thời gian thực thi của hàm c với đầu vào là mid'''

value = c(mid)

'''Nếu thời gian thực thi không xác định hoặc vượt

quá thời gian t'''

if value == float ('inf') or value > t:

'''Giảm giá trị right để thuật toán tiếp tục tìm kiếm

ở phía bên trái'''

right = mid - 1

else:

'''Tăng giá trị left để thuật toán tiếp tục tìm kiếm

ở phía bên phải'''

left = mid + 1

''' Cập nhật giá trị lớn nhất của n thỏa mãn thời gian t '''

max_n = max (max_n, mid)

'''Sau khi tìm được giá trị lớn nhất của n cho thời gian t, thêm giá trị này vào danh sách values'''

Trang 4

print (' | ' join( map (lambda v: str int ( (math.floor(v))), values)))

Kết quả chạy chương trình:

- Giải thích thêm bằng lời:

+ Ta có số phép mà máy tính có thể thực trong 1 giây là106

+ Vậy ta cần giải n với hàm:f (n) = 106.t

+Với các hàm f(n) và t khác ta cũng làm tương tự, riêng 2 hàmf (n) = nvà

f (n) = !n không phải lúc nào cũng rõ ràng để tính toán nên ta cần đến đoạncode bên trên

+ Đoạn code trên có ý tưởng chính là duyệt qua mỗi hàm phức tạp và mỗi giớihạn thời gian, sau đó thực hiện thuật toán tìm kiếm nhị phân để tìm giá trị lớnnhất của n Với hàmlg nta có thể thấy ở ví dụ trên n tìm được rất lớn nên không

3

Trang 5

thể tìm kiếm nhị phân vì vậy trong đoạn code em sẽ biểu diễn nó với dạng210 6 t

Trang 6

BÀI 2: Sắp xếp tăng dần "theo Big O nhỏ nhất"

Ta có:log n ∈ O(nc)vớiccó thể rất bé vàc > 0(dùng cho toàn bộ bài 2)

f3(n) = 1

n= n

−1= O(n−1)f4(n) = 101000n = O( )n

(n − n1)2! = O(n

2)f4(n) = n√ n

i=1

i +

nX

i=1

1 =n(n + 1)

2 + n =

n2+ 3n2

f8(n) = 2n 4

= 2O( n 4 )

f9(n) = n4 log n= (2logn)4logn= 24logn.logn= 2O(n 2c )

Vậy thứ tự tăng dần theo Big-O nhỏ nhất của các hàm số là:

f9(n) < f6(n)< f7(n)< f8( )n

5

Trang 7

5 Group 5:

f6(n) = n√n= (2logn)√n= 2√ = 2 = 2

n.logn O(n 0.5 n c ) O( n 0.5+c )f7(n) = nlogn= (2logn)logn= 2logn.logn= 2O( n 2c )

f8(n) = 2n/ 2= 2O( ) n

f9(n) = 3√n= (2log 2 3)n 0.5 3 ( )

= 2log2 n 0.5

= 2O n 0.5f10(n) = 4n 1/4

= (22)n 0.25= 22.n 0.25= 2O( n 0 25 )

Ta có:log n ∈ O(nc)vớiccó thể rất bé vàc > 0

Vậy thứ tự tăng dần theo Big-O nhỏ nhất của các hàm số là:

Trang 8

BÀI 3: Chứng minh, dùng định nghĩa của các ký hiệu tiệm cận (không dùng lim)

Trang 12

Bài 4: Các khẳng định là đúng hay sai? Vì sao?

g(n) = O(f ( )) = O(n + 2) = O(n)n

Nhưng hai hàm sốf (n)vàg(n)không bằng nhau

• Vậy khẳng định trên là sai

11

Trang 13

Mâu thuẫn với điều kiện trên vì∀n ≥ n0, n >log2c

Trang 14

• Suy ra giả sử ban đầu là sai

• Vậy khẳng định210n= O(2n)là sai

logbalogbn ≤ logan ≤logba1 logbn, ∀n ≥ 1

⇔ logan ≤logan ≤ logan, ∀n≥1(đúng)

• Vậy khẳng địnhlogan = Θ(log nb )là đúng

13

Trang 15

Bài 5: Ước lượng nhanh độ phức tạp của giải thuật

• Vìa = bd= 3nên áp dụng case 2 của dạng đơn giản

• Vậy:T (n) = Θ(n lognd ) = Θ(n.logn)

Trang 16

• Vìa > bd(16 > 41), nên áp dụng case 3 của dạng đơn giản

• Vậy:T (n) = Θ(nlogba) = Θ(nlog416) = Θ( )n2

• Vìa > bd(3 > 21)nên áp dụng case 3 của dạng đơn giản

• Vậy:T (n) ∈Θ(nlogb a) = Θ(nlog2 3)

• Vìa > bd(3 > 30.5)nên áp dụng case 3 của dạng đơn giản

• Vậy:T (n) = Θ(nlogb a) = Θ(nlog3 3) = Θ( )n

Trang 17

• Vậy:T (n) = Θ(nlogba) = Θ(nlog24) = Θ( )n2

• Vìa = bd(4 = 41)nên áp dụng case 2 của dạng đơn giản

• Vậy:T (n) = Θ(ndlog n) = Θ(n log )n

• Vìa > bd(5 > 41)nên áp dụng case 3 của dạng đơn giản

• Vậy:T (n) ∈Θ(nlogb a) = Θ(nlog4 5)

Trang 18

• Vậy:T (n) = Θ(n lognd ) = Θ(n logn2 )

• Vìa > bd(10 > 31.2)nên áp dụng case 3 của dạng đơn giản

• Vậy:T (n) = Θ(nlogba) = Θ(nlog3 10)

f (n) = log n = O(nc) = O(n2−ϵ)vớicrất nhỏ vàϵ > 0

Nên áp dụng case 1 của dạng tổng quát

f (n) = log n = O(nc) = O(nlog5 4−ϵ)vớicrất nhỏ vàϵ > 0

• Nên áp dụng case 1 của dạng tổng quát

• Vậy:T (n) = Θ(nlogb a) = Θ(nlog5 4)

17

Trang 19

f (n) = log n = O(nc) = O(n1−ϵ)vớicrất nhỏ vàϵ > 0

• Nên áp dụng case 1 của dạng tổng quát

3nlogn −23n.log3 ≤ c.nlogn, c =23< 1)

• Nên áp dụng case 3 của dạng tổng quát

Trang 20

• Ta thấy:f (n) = n2logn = Ω(nlog36+ϵ) vớiϵ > 0

f (n) = log2n = O(n2c) = O(nlog53−ϵ)vớicrất nhỏ vàϵ > 0

• Nên áp dụng case 1 của dạng tổng quát

• Vậy:T (n) = Θ(nlogb a) = Θ(nlog5 3)

22 Đề bài

T (n) = 2T (n

2) +

nlog n

Lời giải

• Ta có:

a = 2, b = 2, n

log n= n

logb alog−1n = nlog2 2log−1n = n log−1n

f (n) = n log−1n = Θ(n log−1n) = Θ(nlogb alogkn)

• Không áp dụng được định lý Master dạng đơn giản vìf (n)không phải là

Trang 21

• Vìa < 1nên không áp dụng được định lý Master

f (n) = (2 − cos ) = 2n − n cos n = Ω(nn n ϵ)vớiϵ > 0(case 3)

• Vìf (n)không phải là hàm đa thức vàf (n)có chứacos nlàm choT ( )nkhông đơn điệu nên không thể áp dụng định lý Master dạng đơn giản

Ngày đăng: 08/10/2024, 16:32

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

TÀI LIỆU LIÊN QUAN

w