Professional Documents
Culture Documents
• Nhằm xem xét tốc độ tăng trưởng của hàm f(n) khi n
dần tới +
• Cho phép quy các dạng hàm f(n) khác nhau về một
vài dạng cơ bản (như log n, n, n2), từ đó giúp so sánh
thời gian chạy của các thuật toán dễ dàng hơn
• Có 3 cách phân tích tiệm cận tương ứng với ba ký
hiệu tiệm cận sau đây:
– Ô lớn: O → tìm cận trên của f(n)
– Ô-mê-ga lớn: → tìm cận dưới của f(n)
– Tê-ta lớn: → tìm cận chặt của f(n)
Ký hiệu O
f(n) = O(g(n))
khi và chỉ khi c > 0 và n0 > 0 sao cho f(n)
cg(n) n n0
cg(n)
f(n)
n0
Ký hiệu Ω
f(n) = (g(n))
khi và chỉ khi c > 0 và n0 > 0 sao cho cg(n)
f(n) n n0
f(n)
cg(n)
f(n) bị chặn dưới bởi g(n)
theo nghĩa tiệm cận
n0
Ký hiệu Θ
f(n) = (g(n))
khi và chỉ khi c1 > 0, c2 > 0 và n0 > 0 sao cho
c1g(n) f(n) c2g(n) n n0
c2g(n)
f(n)
f(n) có cùng tốc độ tăng
c1g(n) với g(n) theo nghĩa tiệm
cận
n0
Ví dụ phân tích tiệm cận
f(n) = 3n2 + 17
– (1), (n), (n2) → cận dưới
– O(n2), O(n3), … → cận trên
– (n2) → cận chặt
Hãy điền vào dấu chấm hỏi sau đây !
f(n) = 1000 n2 + 17 + 0,001 n3
– (?) → cận dưới
– O(?) → cận trên
– (?) → cận chặt
Tính chất bắc cầu
Hàm Tên
c Hằng
log n Lôgarit
log2 n Lôgarit bình phương
n Tuyến tính
n log n
n2 Bậc hai
n3 Bậc ba
2n Hàm mũ
Hàm nào tăng chậm hơn?
• Chỉ cần cộng thời gian chạy của các vòng lặp
• Thời gian chạy tổng thể: t(n) = 3n + 5n = 8n = O(n)
Các vòng lặp lồng nhau
1 if (x > 0)
2 i = 0;
3 else
4 for (j = 0; j < n; j++)
5 a[j] = j;
• Có 3 thao tác cơ bản:
– Phép so sánh ở dòng 1 được thực hiện 1 lần
– Phép gán ở dòng 2 được thực hiện 0 hoặc 1 lần
– Phép gán ở dòng 5 được thực hiện 0 hoặc n lần
• Trong trường hợp tồi nhất (điều kiện x > 0 sai), phép gán ở
dòng 5 chạy n lần
• Thời gian chạy: t(n) = 1 + n = O(n)
Hàm đệ quy
1 lon factorial(int n)
g
2 {
3 if (n <= 1)
4 return 1;
5 else
6 return n * factorial(n - 1);
7 }
• Nếu n = 1, chỉ mất 1 phép so sánh ở dòng 3
• Nếu n > 1:
– Dòng 3 có 1 phép so sánh
– Dòng 6 có 1 phép nhân, 1 phép trừ và 1 lời gọi hàm đệ quy
tốn thời gian t(n-1)
Hàm đệ quy (tiếp)
a 2 4 5 8 11 15 20
x = 8?
a 2 4 5 8 11 15 20
x = 15?
a 2 4 5 8 11 15 20
x = 11?
Tìm kiếm nhị phân – thuật toán
function binarySearch(a, n, x)
{
left 1, right n
while (left right)
{
mid (left + right) / 2
if (x < a[mid]) right mid – 1
else if (x > a[mid]) left mid + 1
else return mid
}
return –1
}
5. Máy turing
Máy turing
➢Máy Turing là một mô hình toán học về thiết bị xử
lý các ký tự, tuy đơn giản, nhưng có thể thực hiện
được tất cả các thuật toán máy tính.
➢Các máy Turing đã được Alan Turing trình bày vào
năm 1936.
➢Nó được xây dựng không dành cho việc trực tiếp
chế tạo ra máy tính, mà là dành cho các thí nghiệm
tưởng tượng để tìm hiểu về các giới hạn của việc
tính toán trên máy móc.
➢Việc nghiên cứu các tính chất của máy Turing cho
biết nhiều kiến thức quan trọng trong lĩnh vực khoa
học máy tính và lý thuyết về độ phức tạp tính toán.
Máy turing
➢Ở dạng đơn giản và thông dụng, máy Turing có
thể được mô tả với các bộ phận sau:
▪ Một dải băng (dài vô hạn), ở trên có nhiều ô. Mỗi
ô có ghi một ký tự, và ký tự này có thể được đọc
ra bên ngoài, hoặc được bên ngoài ghi đè lên
(thay thế bằng ký tự khác). Các ký tự thuộc một
bảng ký tự hữu hạn V (tức là có hữu hạn các ký
tự), trong đó có một ký tự đặc biệt gọi là ký tự
trống. Các ô trên dải băng chưa bao giờ được ghi
đè lên từ bên ngoài, luôn được coi là có ghi sẵn ký
tự trống.
Máy turing
➢Ở dạng đơn giản và thông dụng, máy Turing
có thể được mô tả với các bộ phận sau:
▪ Đầu đọc trên máy Turing
▪ Một đầu đọc và ghi, chạy trên dải băng hoặc
đứng yên cho dải băng chạy qua. Tại một thời
điểm, đầu đọc này có thể thực hiện một trong
4 nhiệm vụ:
• Đọc ký tự trên ô mà đầu đọc đang nằm trên nó.
• Ghi đè ký tự mới lên ô mà đầu đọc đang nằm trên nó.
• Di chuyển sang ô bên trái
• Di chuyển sang ô bên phải
Máy turing
➢Ở dạng đơn giản và thông dụng, máy Turing có
thể được mô tả với các bộ phận sau:
▪ Một bộ phận ghi nhớ lại các trạng thái của máy
Turing. Tại một thời điểm, máy Turing luôn ở một
trong số hữu hạn các trạng thái, và bộ ghi nhớ cho
biết máy đang ở trạng thái nào. Tập tất cả
các trạng thái có thể ký hiệu là S. Trong số các
trạng thái, có trạng thái khởi động (hay trạng thái
ban đầu), mặc định là máy Turing sẽ luôn ở trạng
thái này khi bắt đầu hoạt động (ví dụ khi bật máy
lên).
Máy turing
➢Ở dạng đơn giản và thông dụng, máy Turing có thể
được mô tả với các bộ phận sau:
▪ Một hàm chuyển trạng thái hay bảng câu lệnh quy định
hoạt động của máy Turing. Bảng này thường là danh
sách chứa các quy tắc có dạng Si Ci → Sj Cj Dj. Ở đây Si,
Sj là các trạng thái trong S. Ci, Cj là các ký tự trong bảng
ký tự V (đọc được từ băng hoặc ghi lên băng). Dj là một
trong 2 hướng di chuyển của đầu đọc, sang trái hoặc
sang phải. Quy tắc Si Ci → Sj Cj Dj có thể hiểu là: nếu
máy đang ở trạng thái Si và đầu đọc đọc được ký tự
Ci thì thực hiện các công việc sau:
• Ghi đè ký tự Cj lên ô mà đầu đọc đang nằm trên
• Di chuyển đầu đọc lệch một ô theo hướng Dj (sang trái hoặc phải)
• Chuyển máy sang trạng thái Sj và ghi nhớ nó vào bộ ghi nhớ trạng thái.
Máy turing
Máy turing
➢Một máy Turing lượng tử (MTLT), cũng là
một máy tính lượng tử vạn năng, là một
máy trừu tượng được sử dụng để mô hình
hóa hiệu ứng của máy tính lượng tử.
➢Nó cung cấp một mô hình rất đơn giản, nắm
bắt tất cả sức mạnh của tính toán lượng tử.
Máy turing
➢Bất kỳ thuật toán lượng tử nào cũng có thể
được biểu diễn chính thức như một máy
Turing lượng tử cụ thể.
➢Những máy Turing như vậy lần đầu tiên
được đề xuất trong một bài báo năm 1985
được viết bởi nhà vật lý David Đại học
Oxford, cho rằng cổng lượng tử có thể hoạt
động theo kiểu tương tự như cổng logic nhị
phân điện toán kỹ thuật số truyền thống.