Hãy giải thích câu lệnh rằng hàm an + b thuộc về O (n ^ 2) và Θ (n)?


12

Giả sử tôi có hàm tuyến tính f(n)= an+b, cách tốt nhất để chứng minh rằng hàm này thuộc về O (n 2 ) và là Θ(n)gì?

Tôi không cần sự chặt chẽ toán học ở đây. Tôi cần một lập trình viên trả lời. Một số cách giải thích hợp lý.

Đây chính xác là lý do tại sao tôi không đăng câu hỏi trong phần hỏi đáp toán học và thay vào đó là phần hỏi đáp của lập trình viên.


2
@EmmadKareem Trong văn học thường ký hiệu Big O thường được sử dụng một cách tình cờ để thể hiện các giới hạn chặt chẽ về cơ bản là (n). Big O là giới hạn trên thực sự.
Geek

1
@EmmadKareem "giới hạn trên của O (n) không phải là n * n." ,, không có giới hạn trên của O (n). O (n) tự xác định giới hạn trên. Nó thực sự có thể chứa một tập hợp các hàm thỏa mãn điều kiện: f (x) O (g (x)) vì tồn tại c> 0 (ví dụ c = 1) và x0 (ví dụ x0 = 5) sao cho f (x ) <cg (x) bất cứ khi nào x> x0.
Geek

2
@EmmadKareem Trên thực tế O (n) \ subset O (n ^ 2) \ subset O (n ^ 3), v.v., do đó f \ in O (n ^ 2) bằng cách chuyển đổi của \ subset. Lưu ý rằng \ tập hợp con không phải là \ subseteq.
Scarfridge

6
"Tôi cần một lập trình viên trả lời. Một số cách giải thích hợp lý." - làm thế nào để bạn xác định "hợp lý"? Toán học là logic. Bất cứ điều gì ít hơn suy nghĩ nghiêm ngặt là sai ở đây. Bạn có thể thử giải thích chủ đề, nhưng không tiêu hóa toán học (nếu không không khó) đằng sau nó, bạn sẽ không thực sự hiểu được nó - bạn sẽ chỉ có cảm giác mù mờ về ý nghĩa của nó.
Tamás Szelei

2
@Geek: Tôi đoán bạn có nghĩa là Toán học ? cs.SE cũng sẽ là một địa chỉ tốt.
Raphael

Câu trả lời:


20

Ký hiệu Big Oh (O, Theta, Omega) là về tốc độ tăng trưởng của các chức năng.

Khi bạn thực hiện một thuật toán, nó có một đặc điểm nhất định về cách thời gian chạy thay đổi khi bạn tăng bộ dữ liệu hoạt động. Bây giờ, bạn có thể tối ưu hóa thuật toán để nó chạy nhanh hơn với hệ số 100. Chắc chắn, điều này thật tuyệt, nhưng về cơ bản, nó vẫn là thuật toán tương tự. Tương tự, trong một vài năm, máy tính có thể nhanh gấp đôi so với ngày nay.

Ký hiệu Landau trừu tượng hóa các yếu tố không đổi này. Nó không quan tâm đến việc liệu một thuật toán fluôn nhanh gấp đôi so với thuật toán khác hay không g: Có gthể được tối ưu hóa để chạy nhanh hơn 4 lần hoặc bạn có thể mua phần cứng nhanh hơn thay thế. Nếu bạn nhìn nó từ quan điểm này, bạn có thể nói họ "giống nhau". (Điều đó không có nghĩa là bạn có thể (luôn luôn) bỏ qua các yếu tố không đổi trong thực tế.)

Big oh chỉ định một giới hạn trên, nó tương tự như <=mối quan hệ.

Bạn sẽ đồng ý đó 1 < 2là sự thật. Điều đó có nghĩa là 1không thể ít hơn bất kỳ số nào khác? Chắc chắn không. Có một số lượng vô hạn lớn hơn 1.

Với tốc độ tăng trưởng, nó tương tự. O(n)biểu thị tập hợp của tất cả các hàm, tăng trưởng tuyến tính (hoặc chậm hơn). O(n^2)mặt khác biểu thị tất cả các chức năng đó, phát triển với sự đồng bộ bậc hai (hoặc chậm hơn). Tôi chắc chắn rằng bạn sẽ đồng ý rằng một hàm tuyến tính phát triển chậm hơn một hàm bậc hai.

Đây là lý do tại sao một hàm có thể nằm trong nhiều lớp "Big-oh".

Dưới đây là so sánh các hàm khác nhau với những hạn chế: (từ toán học cụ thể của Knuth)

so sánh tốc độ tăng trưởng

Từ trái sang phải, các chức năng phát triển nhanh hơn.

Ngoài ra, nhập mô tả hình ảnh ở đâycó nghĩa là n ^ 2 tăng nhanh hơn n ^ 1 vì 2> 1.

Các định nghĩa

định nghĩa Omega

"f phát triển nhanh hơn hoặc nhanh bằng g"

định nghĩa lớn Oh

"f phát triển chậm hơn hoặc nhanh bằng g"

định nghĩa Theta

Sự kết hợp của hai điều trên. Nó nói rằng chức năng fphát triển "nhanh như nhau" như g. Đó là một mối quan hệ tương đương.

Diễn dịch

Giả sử bạn có hai thuật toán fg.

Omega

Giả sử f không ở Theta của g, f trong Omega của gcó nghĩa là bất kể ngân sách của bạn, không có sức mạnh tính toán liên tục mà bạn có thể thêm vào hệ thống của mình, như vậy fsẽ luôn chạy nhanh như vậy g.

Lớn rồi

Giả sử f không ở Theta của g, f trong Big Oh của gcó nghĩa là nếu bạn có đủ dữ liệu, fsẽ luôn chạy nhanh hơn g, bất kể bạn có thêm bao nhiêu năng lực tính toán vào hệ thống của mình.

Bằng chứng

Nếu bạn thực sự cố gắng chứng minh điều này, bạn cần thể hiện bằng cách sử dụng các định nghĩa của ký hiệu Landau rằng chức năng của bạn đáp ứng các điều kiện cần thiết.

Vì vậy, bạn cần phải tìm giá trị cho c, d, n_0như vậy tình trạng nắm giữ.

Đây là cách bạn có thể làm điều đó cho giới hạn dưới với c:

bằng chứng

Điều quan trọng là nhận ra rằng, tôi tùy tiện xác định clà nhỏ hơn a-1là hoàn toàn tốt. Định nghĩa của Theta (g) nói rằng "tồn tại một c". Nó có thể là bất kỳ giá trị nào miễn là lớn hơn 0. (Nếu alà số thực dương, bạn sẽ cần thay đổi bằng chứng một chút, vì a - 1thực tế có thể là số âm)

(Tôi giả sử alà dương, nếu không, hàm sẽ luôn âm đối với các giá trị lớn n, điều này không có nghĩa đối với hàm biểu thị thời gian chạy.)

Bạn có thể thử làm nó cho giới hạn trên, nó khá giống nhau. Nếu bạn không biết làm thế nào, tôi có thể cung cấp bằng chứng cho bạn.

Gợi ý: bắt đầu với d > a + 1

Chú ý

Điều quan trọng là bạn không chứng minh nó sai cách. Nếu bạn cho rằng (an + b) nằm trong O (n) và đi từ đó, bạn chưa chứng minh được mình muốn gì. Bạn sẽ cần xác minh rằng tất cả các bước của bạn đi cả hai chiều, tức là thay vì =>bạn có <=>.


2
Đó là nó. Những người quá xấu tính vì toán học, nó thực sự rất đơn giản.
Tamás Szelei

câu hỏi nêu rõ: "Tôi không cần sự chặt chẽ về toán học ở đây. Tôi cần một lập trình viên trả lời ..." Ký hiệu được sử dụng trong câu trả lời này có vẻ không phù hợp với câu hỏi
gnat

1
@gnat Hmm, tôi nghĩ câu hỏi "chứng minh" tại một thời điểm. Dù sao, tôi đã thêm các giải thích cho các định nghĩa toán học.
phant0m

@ phant0m câu trả lời tuyệt vời. Chính xác những gì tôi đang tìm kiếm . Các phép toán trong câu trả lời làm cho nó vững chắc hơn, mặc dù "toán học" không được yêu cầu cụ thể trong câu hỏi ban đầu. Cảm ơn rất nhiều.
Geek

@Geek, tôi rất vui vì bạn thích nó. Nếu bạn có thêm câu hỏi nào, vui lòng hỏi và tôi có thể làm rõ / mở rộng câu trả lời của mình.
phant0m

5

Khi bạn đang xử lý đa thức, bạn chỉ quan tâm đến mức độ của đa thức. Đó là, cho an + b, bạn chỉ quan tâm n. Nếu đó là an^3 + bn^2 + cn + d, bạn sẽ chỉ quan tâm n^3.

Vì vậy, một đa thức với độ d sẽ luôn luôn ở trong Θ(n^d). Đơn giản.

Bây giờ chúng ta cần nói về sự khác biệt giữa và O. Về cơ bản, đó là sự khác biệt tương tự như giữa ==<=tương ứng. Vì vậy, Θ(n)có nghĩa là nó luôn luôn một yếu tố không đổi n. O(n)có nghĩa là nó luôn luôn nằm trong một hệ số không đổi nhoặc nhỏ hơn n.

Điều này có nghĩa là bất kỳ chức năng nào Θ(s), đối với bất kỳ s, cũng sẽ có trong O(s). Ngoài ra, nếu một hàm nằm trong Θ(s)sluôn nhỏ hơn một số hàm khác t, thì hàm đó nằm trong O(t)nhưng không Θ(t).

Để hoàn thiện, cũng có Ω(n). Nếu Θđại diện ==Ođại diện <=, Ωđại diện >=. Vì vậy, an + blà trong Ω(1), Θ(n)O(n^2).

Như tôi đã nói trước đó, thật dễ dàng để tìm ra đa thức lớp là gì - bạn chỉ cần nhìn vào mức độ. Có một số chức năng khác cũng dễ làm việc.

Bất kỳ chức năng trong các hình thức a^bncho tùy ý abđược trong Θ(a^n). Đối với bất kỳ giá trị c >= a, họ đang ở O(c^n). Mọi đa thức đều ở O(2^n). Về cơ bản, điều này chỉ nói rằng các hàm số mũ luôn đánh bại các đa thức và cơ sở của hàm số mũ có vấn đề.

Logarit thì ngược lại. Đối với một, log_b nlà trong Θ(log n)bất kỳ b. Điều này có nghĩa là cơ sở không quan trọng đối với logarit. Điều này có ý nghĩa bởi vì chuyển đổi giữa các cơ sở khác nhau trong logarit chỉ là nhân với một hằng số. Các hàm logarit cũng nằm trong O(n)- đó là, một hàm logarit nhỏ hơn bất kỳ đa thức nào (ít nhất là độ 1).

Cho một tổng số các chức năng này, cái lớn nhất "thắng". Vì vậy, n + log nlà trong Θ(n)nthuật ngữ thống trị log nthuật ngữ. Phép nhân phức tạp hơn. Đối với CS, điều duy nhất bạn cần biết nlog nlà giữa nn^2.


1
khá tốt. Theo hồi ức của tôi, lời giải thích ở trên gần với Hướng dẫn thiết kế thuật toán cổ điển như nó nhận được
gnat

1
@Tikhlon viết hay lên. Vì vậy, +1. Nhưng cái mà tôi chấp nhận thậm chí còn tốt hơn.
Geek

-2

Không sử dụng nhiều toán học, bạn lấy hàm f (n) = an + b và bỏ tất cả các hằng số, vì vậy nó trông giống như f (n) = n, sau đó bạn lấy "n" với mức độ cao nhất làm câu trả lời của bạn QED Θ (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.