n * log n và n / log n theo thời gian chạy đa thức


12

Tôi hiểu rằng Θ(n) là nhanh hơn so với Θ(nlogn) và chậm hơn so với Θ(n/logn) . Điều gì là khó khăn cho tôi để hiểu là làm thế nào để thực sự so sánh Θ(nlogn)Θ(n/logn) với Θ(nf) nơi 0<f<1 .

Ví dụ, làm thế nào để chúng tôi quyết định vs Θ ( n 2 / 3 ) hoặc Θ ( n 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

Tôi muốn có một số hướng để tiến hành trong các trường hợp như vậy. Cảm ơn bạn.

Câu trả lời:


3

Nếu bạn chỉ vẽ một vài biểu đồ, bạn sẽ có hình dạng tốt. Wolfram Alpha là một nguồn tài nguyên tuyệt vời cho các loại điều tra này:

equations

Graph

Được tạo bởi liên kết này . Lưu ý rằng trong biểu đồ, log (x) là logarit tự nhiên, đó là lý do phương trình của một biểu đồ trông hơi buồn cười.



Ngoài việc đồng ý với Raphael, bức ảnh này sẽ cho ý tưởng tốt hơn nhiều , việc chọn phạm vi thậm chí còn lớn hơn cho phép chức năng thứ hai biến mất có thể gây nhầm lẫn.
phant0m

9

là nghịch đảo của 2 n . Cũng giống như 2 n tăng trưởng nhanh hơn so với bất kỳ đa thức n k bất kể như thế nào lớn một hữu hạn k là, log n sẽ tăng trưởng chậm hơn so với bất kỳ chức năng đa thức n k bất kể một khác không nhỏ như thế nào, tích cực k là.logn2n2nnkklognnkk

vs n k , với k < 1 trùng với: n / log n vs n / n 1 - kn/lognnkk<1n/lognn/n1k

như cho lớn n , n / log n > n k cho k < 1 và lớn n .n1k>lognnn/logn>nkk<1n


3

Đối với nhiều thuật toán, đôi khi xảy ra rằng các hằng số là khác nhau, khiến cho cái này nhanh hơn hoặc chậm hơn đối với các kích thước dữ liệu nhỏ hơn và không được sắp xếp tốt bởi độ phức tạp của thuật toán.

Phải nói rằng, nếu chúng ta chỉ xem xét kích thước dữ liệu siêu lớn , tức là. cái nào cuối cùng sẽ thắng, sau đó O(n^f)nhanh hơn O(n/log n)cho 0 < f < 1.

Một phần lớn của độ phức tạp thuật toán là để xác định thuật toán nào cuối cùng nhanh hơn, do đó biết rằng O(n^f)nhanh hơn so O(n/log n)với 0 < f < 1, thường là đủ.

Một quy tắc chung là nhân (hoặc chia) cho log ncuối cùng sẽ không đáng kể so với nhân (hoặc chia) n^fcho bất kỳ f > 0.

Để thể hiện điều này rõ ràng hơn, chúng ta hãy xem xét những gì xảy ra khi n tăng.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Thông báo nào giảm nhanh hơn? Đây là n^fcột.

Ngay cả khi fgần hơn 1, n^fcột sẽ chỉ bắt đầu chậm hơn, nhưng khi n tăng gấp đôi, tốc độ thay đổi của mẫu số sẽ tăng lên, trong khi mẫu số của n/log ncột dường như thay đổi với tốc độ không đổi.

Hãy để chúng tôi vẽ một trường hợp cụ thể trên biểu đồ

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Nguồn: Wolfram Alpha

Tôi đã chọn O(n^k)như vậy kkhá gần với 1 (at 0.9). Tôi cũng chọn các hằng số để ban đầu O(n^k)chậm hơn. Tuy nhiên, lưu ý rằng cuối cùng nó "chiến thắng" và mất ít thời gian hơn O(n/log n).


những gì về n / log n

Đó là một chút lỗi chính tả, đó là những gì tôi muốn nói lúc đầu. Dù sao, tôi đã thêm một biểu đồ phù hợp hơn cho thấy n^kcuối cùng sẽ nhanh hơn, ngay cả khi các hằng số được chọn sao cho nó ban đầu chậm hơn.

3

nfnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

Khi so sánh thời gian chạy, luôn hữu ích khi so sánh chúng bằng cách sử dụng các giá trị lớn của n. Đối với tôi, điều này giúp xây dựng trực giác về chức năng nào chậm hơn

Trong trường hợp của bạn, hãy nghĩ đến n = 10 ^ 10 và a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Do đó, O (n ^ a) nhanh hơn O (n / logn), khi 0 <a <1 tôi chỉ sử dụng một giá trị, tuy nhiên, bạn có thể sử dụng nhiều giá trị để xây dựng trực giác về hàm


1
Đừng viết O(10^9), nhưng quan điểm chính về việc thử một số con số để xây dựng trực giác là đúng.

Thất bại. Điều này LAF không đúng. Bạn đã thay thế một hằng số n duy nhất, có thể bị sai lệch. Nếu tôi chọn các hằng số khác nhau, tôi có thể làm cho bất kỳ thuật toán nào trông tốt hơn. Ký hiệu Big O được sử dụng để thiết lập xu hướng trong những gì sẽ nhanh hơn trong dài hạn. Để làm điều này, bạn phải có khả năng chỉ ra rằng nó nhanh hơn đối với n lớn, ngay cả khi nó chậm hơn khi n nhỏ hơn.

Cảm ơn. Đã thêm nhiều phần giá trị và để xem xét các số lớn hơn

Cần lưu ý rằng chỉ vì f (a)> g (a) cho một số hằng số a, không nhất thiết có nghĩa là O (f (x))> O (g (x)). Điều này rất hữu ích để xây dựng trực giác, nhưng không đủ để đưa ra một bằng chứng nghiêm ngặt. Để cho thấy mối quan hệ này được giữ vững, bạn phải thể hiện điều này đúng với TẤT CẢ n lớn, không chỉ một n lớn. Tương tự như vậy, bạn phải cho thấy nó đúng với tất cả các đa thức có mức độ tích cực <1.

1

fg

nα1(đăng nhậpn)α2(đăng nhậpđăng nhậpn)α3nβ1(đăng nhậpn)β2(đăng nhậpđăng nhậpn)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

Áp dụng cho ví dụ của bạn:

Ôi(n/đăng nhậpn)(1,-1,0)

Ôi(n2/3)(2/3,0,0)

Ôi(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

You could say: powers of n dominate powers of log, which dominate powers of log log.

Source: Concrete Mathematics, p. 441

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.