Ký hiệu Theta về thời gian không đổi. Tại sao chúng ta sử dụng 1?


9

Trong ký hiệu tiệm cận khi được tuyên bố rằng nếu kích thước bài toán đủ nhỏ (ví dụ: n<cđối với một số hằng số c), giải pháp sẽ mất thời gian không đổi và được ghi là Theta(1).
Tại sao chúng ta viết 1 bên trong Theta?
1nghĩa là gì? Tại sao không Theta(c)?

Câu trả lời:


8

Những ký hiệu này có nghĩa là để biểu thị sự tăng trưởng tiệm cận. Các hằng số không phát triển và do đó, nó khá bằng với hằng số bạn chọn. Tuy nhiên, có một quy ước mà bạn chọn 1 để biểu thị không tăng trưởng.

Tôi cho rằng điều này là do thực tế là bạn muốn đơn giản hóa các thuật ngữ toán học trong câu hỏi. Khi bạn có một yếu tố không đổi, chỉ cần chia cho nó và tất cả những gì còn lại của nó là 1. Điều này giúp việc so sánh dễ dàng hơn.

Thí dụ:

O (34 * n ^ 2) = O (1 * n ^ 2) = O (n ^ 2)

O (2567.2343 * n ^ 2/5) = O (n ^ 2)

Hiểu ý tôi chứ? Khi các thuật ngữ toán học này ngày càng phức tạp hơn, bạn không muốn có các hằng số ồn ào khi chúng không liên quan đến thông tin bạn quan tâm. Tại sao tôi nên viết O (2342.4534675767) khi có thể diễn đạt dễ dàng hơn với O (1), trong đó truyền đạt các sự kiện của vụ án một cách rõ ràng.

Hơn nữa, bài viết trên wikipedia về độ phức tạp thời gian cũng ngụ ý đó là một quy ước:

Một thuật toán được gọi là thời gian không đổi (cũng được viết là thời gian O (1)) ...


Tôi hiểu. Nhưng tại sao không chỉ Theta (c) để bao gồm bất kỳ hằng số? Nó chỉ là một quy ước?
dùng10326

8
@ user10326: Tôi nghĩ đó là vì "c" có thể bị hiểu sai, bạn rõ ràng phải nói rằng đó là một hằng số trong khi "1" thực hiện cùng một công việc rõ ràng.
Falcon

Vì vậy, con số thực tế là không liên quan? Chúng tôi sử dụng 1 thay vì 5 như một quy ước?
dùng10326

1
@ user10326: Có, vì nó không tạo ra sự khác biệt. Nhưng tôi không sử dụng "0" vì điều đó có thể dẫn đến nhiều nhầm lẫn.
Falcon

@ user10326: Câu trả lời của Falcon có ý nghĩa hoàn hảo phải không? nếu nó là 5 thay vì 1, giảm 5 trong O(5 * n^2)sẽ cảm thấy ít tự nhiên hơn, trong khi thả * 1là toán cơ bản.
Steven Jeuris

13

Đây là tất cả rất lượn sóng, nhưng có một lý do toán học tại sao chúng ta không sử dụng Theta (c) và thay vào đó sử dụng Theta (1). Thay vào đó, tôi sẽ sử dụng ký hiệu Big O để hiển thị điều này.

Nó có liên quan đến một tài sản của Big Theta (cũng như ký hiệu Big O và Big Omega). Nếu bạn có một chức năng với tốc độ tăng trưởng O(g(x))và khác với tốc độ tăng trưởng O(c * g(x))ở đâu clà một số không đổi, bạn sẽ nói họ có tốc độ tăng trưởng tương tự. Đó làO(c * g(x)) = O(g(x))

Chúng ta có thể nói điều này bởi vì định nghĩa của ký hiệu Big O ( f(x) = O(g(x))) có nghĩa là chúng ta có một hàm f(x)và hàm g(x)sao |f(x)| <= k * |g(x)|cho một số kgiá trị đủ lớn và không đổi x. Khi nhân với hằng số c, chúng ta sẽ có:

O(c * g(x)) => k * |c * g(x)| = k * |c| * |g(x)| <= k' * g(x) Ở đâu k' = k * |c|

Lưu ý rằng |k' * g(x)| <= k'' g(x)đối với một số k''giá trị không đổi và đủ lớn x, có nghĩa là k' * g(x)tăng trưởng với tốc độ O(g(x))và do đóO(c * g(x)) = O(g(x))

Khi nào g(x) = 1, chúng ta có O(1)sự tăng trưởng, nói rằng O(c)sự tăng trưởng đối với một số giá trị ckhông cho chúng ta biết bất cứ điều gì bởi vì hằng số đã được xác định theo định nghĩa của ký hiệu Big O. giản thểO(c) = O(1)


3

Chà, tất nhiên bạn có thể viết Theta (c) (hoặc O (c)) nhưng tại sao điều đó khác với Theta (n)? n chỉ là một biến biểu thị kích thước của đầu vào. Bạn có thể viết "Hàm là Theta (c) trong đó c là hằng số". Phụ lục quan trọng là ... trong đó c là hằng số . Bạn phải nói rõ rằng một định danh không phải là một biến.

Hãy xem xét lý thuyết đồ thị trong đó các giới hạn cho một thuật toán thường được mô tả là một hàm của | V | và | E |, hoặc số lượng nút và cạnh tương ứng. Sau đó, có thể là thận trọng để nói "Hàm là Theta (| V | * | E | ^ 2)".

Tuy nhiên, Theta (1) luôn là một hằng số - giả sử các thực hành toán học bình thường.


Theta(1) however is always a constant. Đây là phần tôi không nhận được. Theta (c) luôn luôn là một hằng số. Vì vậy, tôi đã tự hỏi nếu nó 1có một ý nghĩa đặc biệt
user10326

5
@ user10326: không, ckhông phải luôn luôn là một hằng số, vì clà một biến nếu bạn không nói rõ rằng nó thực sự nên được hiểu là một hằng số ... Đó chính xác là sự khác biệt tinh tế cần tránh 1.
blubb

Ok, nhưng nó đại diện cho một thời gian liên tục.
dùng10326

2
@ user10326: Không, không, nó không biểu thị thời gian không đổi. Nó đại diện cho thời gian phát triển tuyến tính với c. Đó là những khác nhau , bởi vì bạn cần một cái gì đó bổ sung để buộc giá trị của c không bao giờ thay đổi, trong khi 1 không bao giờ thay đổi.
jprete

1
@ user10326: Hoặc, nói đơn giản hơn: ckhông phải là hằng số; clà một lá thư. Các chữ cái khác đại diện cho các biến, làm thế nào bạn mong người đọc biết cái này không?
Random832

0

Ký hiệu Theta là về sự tăng trưởng như là một hàm của một số biến - điển hình là n. Nếu cần phải làm rõ biến nào được dự định, cách viết nó sẽ là Theta (n ^ 0). Từ đó, một bước đơn giản để áp dụng danh tính n ^ 0 = 1 (cho n! = 0).


Nhưng tại sao bạn nói n^0để biểu thị thời gian liên tục và không n^1trong ví dụ của bạn?
dùng10326

@ user10326, vì n ^ 1 = n không phải là hằng số. Nó phát triển tuyến tính.
Peter Taylor

0

O ( c ) đặc biệt có nghĩa là lớp thuật toán liên quan phát triển tuyến tính với c , trong đó c là kích thước của một đầu vào cho thuật toán hoặc một tham số cho thuật toán . Nó không giống c được sử dụng để giải thích ký hiệu O, bởi vì c chỉ liên quan đến giải thích, không phải cách sử dụng. O ( c ) chứa một c khác phải xuất phát từ bối cảnh nhập thuật toán.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.