Có các biến thể của thời gian chạy thường xuyên của Ký hiệu Big-O không?


9

Có nhiều -Notations, như hoặc , v.v. Tôi đã tự hỏi, nếu có những biến thể của những cái trong thực tế như hoặc , hoặc nếu những biến thể đó không chính xác về mặt toán học.ÔiÔi(n)Ôi(n2)Ôi(2n2)Ôi(đăng nhậpn2)

Hoặc sẽ là một điều đúng đắn khi nói rằng có thể cải thiện thành ? Tôi không thể và không cần phải tìm ra thời gian chạy và tôi không cần cải thiện bất cứ điều gì, nhưng tôi cần biết nếu đây là cách bạn mô tả các chức năng của bạn trong thực tế.Ôi(5n2)Ôi(3n2)


1
Không có sự khác biệt về vật chất giữa O (5n ^ 2) so với O (3n ^ 2) trong quá trình phân tích tiệm cận. Chúng đều là O (n ^ 2) và chỉ khác nhau bởi một hằng số. Trong thực tế, trong một bằng chứng, bạn thậm chí có thể giảm O (5n ^ 2) xuống O (3n ^ 2) hoặc O (n ^ 2) để làm cho toán sạch hơn vì chúng tương đương nhau. Khi viết bằng chứng của bạn, bạn tạo một ghi chú trong một thanh bên rằng chúng tương đương nhau. Trong thực tế, bạn thậm chí có thể trao đổi một O (log n) với O (n) và lưu ý rằng O (log n) <= O (n) trong thanh bên. Ghi chú trong thanh bên cho người đọc biết đó là cố ý, và không phải là một lỗi đánh máy. (Ít nhất đó là cách tôi đã làm khi tôi thực hiện Phân tích thuật toán ở trường đại học).
jww

2
Nếu bạn đang sử dụng ký hiệu để loại bỏ các yếu tố nhỏ, bạn luôn có thể viết một cái gì đó như "... cải thiện thời gian chạy từ xuống còn ", v.v. Hoặc, tương đương, và . Một số tác giả thích chỉ viết làm tốc ký cho cái trước. Xem, ví dụ, sách giáo khoa của Trefethen và Bau. 5 n 2 + o ( n 2 ) 3 n 2 + o ( n 2 ) ( 5 + o ( 1 ) ) n 2 ( 3 + o ( 1 ) ) n 25 n 2Ôi()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n2~5n2
Yonatan N

Câu trả lời:


21

Tôi đã tự hỏi, nếu có những biến thể của những cái trong thực tế như hoặc , hoặc nếu những biến thể đó không chính xác về mặt toán học.O(2n2)O(log(n2))

Có, hoặc là các biến thể hợp lệ.O(2n2)O(log(n2))

Tuy nhiên, bạn sẽ hiếm khi nhìn thấy chúng nếu bạn hoàn toàn nhìn thấy chúng, đặc biệt là trong kết quả cuối cùng. Lý do là . Tương tự, . Điều đó có thể gây ngạc nhiên cho người mới bắt đầu. Tuy nhiên, những điểm tương đương đó ít nhiều là lý do tại sao các chú thích lớn được đưa ra, để che giấu một yếu tố hằng số nhân thường khó xác định và tương đối không đáng kể.O(2n2) O ( n 2 ) O ( log ( n 2 ) ) O ( log n ) O O(n2)O(log(n2)) O(logn)O

Sẽ là một điều đúng đắn khi nói rằng có thể cải thiện thành ?O(5n2)O(3n2)

Hoàn toàn không phải là một sự cải thiện nếu độ phức tạp thời gian của thuật toán được thay đổi từ thành hoặc từ thành , bởi vì là trong khi là . Vì vậy, không đúng khi nói độ phức tạp thời gian được cải thiện từ thành . Tất nhiên, chính xác là độ phức tạp thời gian của thuật toán được cải thiện từ lên , tất nhiên.O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)5n23n2


Bài tập 1. Cho biết .O(5n2)=O(3n2)=O(n2)

Bài tập 2. Cho thấy .O(logn)=O(log(n2))

Bài tập 3. Cho thấy .Ω(n2+n)=Ω(n2)


1
@bv_Martn Đây là một liên kết tốt để hiểu ký hiệu được định nghĩa là gì (chỉ là phép tính giới hạn đơn giản!): math.stackexchange.com/questions/925053/ trộmO(n)
Akshat Mahajan

2
Lần duy nhất tôi thấy các yếu tố không đổi trong ký hiệu big-O là khi ai đó muốn đưa ra quan điểm rằng, mặc dù hai thuật toán có cùng một lớp phức tạp, một trong số chúng nhanh hơn các thuật toán khác.
Đánh dấu

7
@AkshatMahajan Câu trả lời duy nhất cho câu hỏi đó /math/925053 hoàn toàn sai. Có rất nhiều nguồn đáng tin cậy trên các chú thích lớn . Ôi
John L.

1
"Thật đúng khi nói độ phức tạp thời gian của thuật toán được cải thiện từ 5n ^ 2 lên 3n ^ 2" - mặc dù thời gian chạy chính xác thường thay đổi theo các kích thước và giá trị đầu vào khác nhau. Ngoài ra, điều này liên quan đến việc cân tất cả các thao tác / tập trung vào một thao tác, có thể không nói nhiều về các yếu tố không đổi bạn sẽ có trong thế giới thực hoặc có thể so sánh với các thuật toán khác sử dụng các trọng số khác nhau. Vì vậy, trong khi nó có thể có một vài trường hợp sử dụng hợp lệ, việc nói một cái gì đó như ở trên là hữu ích hạn chế (đó có thể là lý do tại sao nó hiếm khi được nhìn thấy).
Dukeling

1
@Mark: Điều đó đơn giản là sai.
user21820

13

Bạn luôn tự do không sử dụng ký hiệu này. Đó là, bạn có thể xác định một hàm chính xác nhất có thể, và sau đó cố gắng cải thiện điều đó. Ví dụ: bạn có thể có một thuật toán sắp xếp để so sánh , vì vậy bạn có thể thử đưa ra một thuật toán sắp xếp khác chỉ so sánh . Tất nhiên, tất cả các loại hàm tồn tại (trên lý thuyết) và cũng có thể xuất hiện (trong thực tế).f(n)f(n)g(n)f(n)

Thay vì coi ký hiệu Big Oh là ma thuật bí ẩn, nơi bạn phải hỏi ý kiến ​​các pháp sư để hỏi liệu bạn có thể làm gì không, bạn nên xem định nghĩa của nó . Tôn trọng định nghĩa, và sau đó làm bất cứ điều gì bạn cần để hoàn thành công việc của bạn.


Vâng, tôi không cần nó trong thực tế. Hoặc trên lý thuyết thực tế, tôi chỉ cần biết các định nghĩa do wikipedia đưa ra O (1) -O (n!) Là những định nghĩa duy nhất tồn tại, hoặc trong thực tế, bạn có thể mô tả chúng khác nhau nếu chúng khác nhau, chẳng hạn như O (7N). Nỗi sợ hãi của tôi là nếu tôi sử dụng một giáo sư toán học sẽ mất đôi cánh của mình
bv_Martn

1
Bất kỳ định nghĩa mà bất cứ ai làm cho tồn tại. Bạn nên đọc thật kỹ ký hiệu hoặc O ( n ! ) Có nghĩa là gì vì câu hỏi của bạn không có ý nghĩa. Không có vết cắt ngắn. Nếu bạn muốn hiểu một phần của nội dung toán học có nghĩa là gì, bạn phải sẵn sàng đầu tư một thời gian. O(1)O(n!)
Juho

6
@bv_Martn Giáo sư toán học có nhiều khả năng lật ra vì bạn đang xem danh sách các ví dụ dưới dạng danh sách các định nghĩa. Vì vậy, phần lớn quan điểm của toán học là định nghĩa mọi thứ theo cách làm cho chúng hoạt động nói chung, không chỉ trong các trường hợp cụ thể. Câu hỏi của bạn về cơ bản là một phiên bản nâng cao hơn của "Wikipedia nói rằng tôi có thể thêm một và thêm hai và thêm mười bảy. Nhưng tôi cũng có thể thêm các số khác không?"
David Richerby

7

Mặc dù câu trả lời được chấp nhận là khá tốt, nhưng nó vẫn không chạm vào lý do thực sự tại sao O(n)=O(2n) .

Ký hiệu Big-O mô tả khả năng mở rộng

Về cốt lõi, Ký hiệu Big-O không phải là một mô tả về thời gian chạy thuật toán. Nó cũng không phải là một mô tả về bao nhiêu bước, dòng mã hoặc so sánh một thuật toán tạo ra. Nó hữu ích nhất khi được sử dụng để mô tả cách thuật toán chia tỷ lệ với số lượng đầu vào.

Lấy một tìm kiếm nhị phân, ví dụ. Đưa ra một danh sách được sắp xếp, làm thế nào để bạn tìm thấy một giá trị tùy ý bên trong nó? Vâng, bạn có thể bắt đầu ở giữa. Vì danh sách được sắp xếp, giá trị giữa sẽ cho bạn biết một nửa danh sách mà giá trị mục tiêu của bạn nằm trong. Vì vậy, danh sách bạn phải tìm kiếm hiện được chia làm một nửa. Điều này có thể được áp dụng đệ quy, sau đó đi đến giữa danh sách mới, và cứ thế cho đến khi kích thước danh sách là 1 và bạn đã tìm thấy giá trị của mình (hoặc nó không tồn tại trong danh sách). Nhân đôi kích thước của danh sách chỉ thêm một bước nữa vào thuật toán, đó là mối quan hệ logarit. Do đó, thuật toán này là O(logn). Logarit là cơ sở 2, nhưng điều đó không thành vấn đề - cốt lõi của mối quan hệ là nhân danh sách với một giá trị không đổi chỉ thêm một giá trị không đổi theo thời gian.

Đối chiếu một tìm kiếm tiêu chuẩn thông qua một danh sách chưa được sắp xếp - cách duy nhất để tìm kiếm một giá trị trong trường hợp này là kiểm tra từng cái. Trường hợp xấu nhất (đó là điều Big-O đặc biệt ngụ ý) là giá trị của bạn ở cuối cùng, có nghĩa là đối với danh sách kích thước n , bạn phải kiểm tra n giá trị. Nhân đôi kích thước của danh sách nhân đôi số lần bạn phải kiểm tra, đó là mối quan hệ tuyến tính. O(n) . Nhưng ngay cả khi bạn phải thực hiện hai thao tác trên mỗi giá trị, một số xử lý, ví dụ, mối quan hệ tuyến tính vẫn giữ. O(2n) đơn giản là không hữu ích như một mô tả, vì nó sẽ mô tả chính xác khả năng mở rộng tương tự như O(n) .

Tôi đánh giá cao rằng rất nhiều câu trả lời về cơ bản là bảo bạn tự đi đến kết luận này bằng cách đọc định nghĩa của Big-O. Nhưng sự hiểu biết trực quan này đã khiến tôi mất khá nhiều thời gian để quấn đầu và vì vậy tôi đưa nó ra cho bạn rõ ràng nhất có thể.


5
Vấn đề lớn nhất với loại câu trả lời này là nó không chạm đến định nghĩa của Big Oh, mà chỉ sử dụng nó như một loại phép thuật trực quan như trong "xem khi bạn làm điều này và điều này, đó là ". Cá nhân, tôi nghĩ rằng sẽ có nhiều hướng dẫn hơn để nói với ai đó rằng Big Oh hoàn toàn không liên quan gì đến thuật toán và bắt đầu với điều đó. O(n)
Juho

3
@Juho Hướng dẫn, có thể, nhưng cuối cùng vô dụng đối với đại đa số các nhà khoa học máy tính.
phân tán

4
Với điều này tôi phải không đồng ý. Dán nhãn cho bản thân như một nhà khoa học máy tính không phải là lý do cho việc không hiểu ý nghĩa của một ký hiệu mà người ta sử dụng có nghĩa là gì, tức là bỏ qua tất cả các phép toán.
Juho

3
Vâng. Tôi không phản đối việc các lập trình viên không hiểu thứ này nhưng nếu bạn muốn tự gọi mình là nhà khoa học máy tính , thì đây là tài liệu cốt lõi.
David Richerby

2
@dkaeae Không, tôi đang đề cập đến những người làm việc khác trong lĩnh vực này, chẳng hạn như nhà phát triển phần mềm.
phân tán

5

Bạn có thể viết Ôi(f) cho bất kỳ hàm f và nó có ý nghĩa hoàn hảo. Theo định nghĩa, g(n)= =Ôi(f(n)) nếu có một số hằng số  cg(n)cf(n) cho tất cản đủ lớn . Không có gì trong định nghĩa đó nói rằngf phải là một loại hàm "đẹp" nào đó.

Nhưng, như các câu trả lời khác đã chỉ ra, g(n)=O(f(n))g(n)=O(2f(n)) mô tả chính xác tình huống tương tự: if g(n)cf(n) cho tất cả mọi đủ lớn n , sau đó chúng tôi cũng cóg(n)c22f(n), vì vậyg(n)=O(2f(n)), cũng (lấy hằng số làc/2).

Là một vấn đề phụ, đừng viết " đăng nhậpn2 ", vì nó không rõ ràng 100% nghĩa của nó là gì. Bạn có thể nói rằng nó rõ ràng có nghĩa là đăng nhập(n2) nhưng hầu như mọi người sẽ viết đó là 2đăng nhậpn , vì vậy nó gây nghi ngờ trong tâm trí người đọc.

Ngoài ra, lưu ý rằng ký hiệu big- Ôi không liên quan gì đến thời gian chạy mỗi giây . Nó chỉ là một ký hiệu cho mối quan hệ giữa các chức năng. Các hàm này thường được sử dụng để đo thời gian chạy của thuật toán nhưng đó chỉ là một ứng dụng, giống như đo chiều cao của mọi người chỉ là một ứng dụng của số.


4

Nhìn vào định nghĩa của O (f (n)) và bạn thấy rằng ví dụ O (2n ^ 2) và O (n ^ 2) hoàn toàn giống nhau. Thay đổi thuật toán từ 5n ^ 2 thành 3n ^ 2 thao tác là một cải tiến 40 phần trăm. Thay đổi từ O (5n ^ 2) thành O (3n ^ 2) thực sự không có bất kỳ thay đổi nào, chúng giống nhau.

Một lần nữa, đọc định nghĩa của O (f (n)).


4

O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

=

O(n)=O(2n)


4
log(n!)=nlognn+O(logn)O(f)
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.