Sắp xếp các chức năng theo sự tăng trưởng tiệm cận


35

Giả sử tôi có một danh sách các chức năng, ví dụ

nloglog(n),2n,n!,n3,nlnn,

Làm thế nào để tôi sắp xếp chúng không có triệu chứng, tức là sau khi mối quan hệ được xác định bởi

fOgfO(g) ,

giả sử họ thực sự là cặp đôi có thể so sánh (xem thêm ở đây )? Sử dụng định nghĩa của O có vẻ khó xử và thường khó chứng minh sự tồn tại của hằng số phù hợp cn0 .

Đây là về các biện pháp phức tạp, vì vậy chúng tôi quan tâm đến hành vi tiệm cận là n+ , và chúng tôi giả định rằng tất cả các chức năng chỉ mất giá trị không âm (n,f(n)0 ).


4
Vì OP không bao giờ quay trở lại, tôi sẽ loại bỏ những thứ được bản địa hóa và đặt câu hỏi tham khảo về vấn đề này.
Raphael

Câu trả lời:


48

Nếu bạn muốn bằng chứng nghiêm ngặt, bổ đề sau thường là sự tôn trọng hữu ích. tiện dụng hơn các định nghĩa.

c=limnf(n)g(n)

  • c=0 fo(g) ,
  • c(0,)fΘ(g)
  • c=   fω(g) .

Với điều này, bạn sẽ có thể đặt hàng hầu hết các hàm sắp tới trong phân tích thuật toán¹. Như một bài tập, chứng minh điều đó!

Tất nhiên bạn phải có khả năng tính toán các giới hạn cho phù hợp. Một số thủ thuật hữu ích để phá vỡ các chức năng phức tạp thành các chức năng cơ bản là:

  • Thể hiện cả hai hàm là e và so sánh các số mũ; nếu tỷ lệ của chúng có xu hướng 0 hoặc , thì thương số ban đầu cũng vậy.
  • Tổng quát hơn: nếu bạn có hàm lồi, liên tục khác biệt và tăng nghiêm ngặt để bạn có thể viết lại thương số của mình dưới dạngh

    f(n)g(n)=h(f(n))h(g(n)) ,

    với vàgΩ(1)

    limnf(n)g(n)= ,

    sau đó

    limnf(n)g(n)= .

    Xem ở đây để có bằng chứng nghiêm ngặt về quy tắc này (bằng tiếng Đức).

  • Xem xét việc tiếp tục các chức năng của bạn trên thực tế. Bây giờ bạn có thể sử dụng quy tắc của L'Hôpital ; Hãy chú ý đến điều kiện của nó²!

  • Có một cái nhìn tương đương rời rạc, Stolz về Cesàro .
  • Khi giai thừa bật lên, sử dụng công thức của Stirling :

    n!2πn(ne)n

Nó cũng hữu ích để giữ một nhóm các mối quan hệ cơ bản mà bạn chứng minh một lần và sử dụng thường xuyên, chẳng hạn như:

  • logarit phát triển chậm hơn đa thức, nghĩa là

    (logn)αo(nβ) cho tất cảα,β>0 .

  • thứ tự đa thức:

    nαo(nβ) cho tất cảα<β .

  • đa thức tăng chậm hơn số mũ:

    nαo(cn) cho tất cả và .αc>1


Có thể xảy ra rằng bổ đề trên không được áp dụng vì giới hạn không tồn tại (ví dụ khi các hàm dao động). Trong trường hợp này, hãy xem xét đặc tính hóa sau của các lớp Landau bằng cách sử dụng các cấp trên / kém hơn :

Với chúng ta cócs:=lim supnf(n)g(n)

  • 0cs<fO(g)
  • cs=0fo(g) .

Với chúng ta cóci:=lim infnf(n)g(n)

  • 0<cifΩ(g)
  • ci=fω(g) .

Hơn nữa,

  • 0<ci,cs<fΘ(g)gΘ(f)
  • ci=cs=1fg .

Kiểm tra ở đâyở đây nếu bạn bị nhầm lẫn bởi ký hiệu của tôi.


¹ Nota bene: Đồng nghiệp của tôi đã viết một hàm Mathicala thực hiện thành công cho nhiều chức năng, vì vậy bổ đề thực sự làm giảm nhiệm vụ đối với tính toán cơ học.

² Xem thêm tại đây .


@Juho Không công khai, afaik, nhưng đó là điều cơ bản để tự viết; tính toán Limit[f[n]/g[n], n -> Infinity]và thực hiện phân biệt trường hợp
Raphael

20

Một mẹo khác: đôi khi áp dụng một hàm đơn điệu (như log hoặc exp) cho các hàm làm cho mọi thứ rõ ràng hơn.


5
Điều này nên được thực hiện một cách cẩn thận: , nhưng 2 2 nO ( 2 n ) . 2nO(n)22nO(2n)
Shaull

2
Biệt phái. Điều "áp dụng chức năng đơn điệu" dường như là một loại văn hóa dân gian không hoạt động nói chung. Chúng tôi đã làm việc với các tiêu chí đầy đủ và đã đưa ra những gì tôi đã đăng trong phiên bản mới nhất của câu trả lời của tôi .
Raphael

17

Skiena cung cấp một danh sách sắp xếp các mối quan hệ thống trị giữa các chức năng phổ biến nhất trong cuốn sách của mình, Hướng dẫn thiết kế thuật toán:

n!cnn3n2n1+ϵnlgnnn1/2
lg2nlgnlgnlglgnlglgnα(n)1

Ở đây α(n) biểu thị hàm Ackermann nghịch đảo .


Đó là một danh sách cụ thể kỳ lạ. Nhiều mối quan hệ (bất cứ điều gì có nghĩa là chính xác) có thể được tóm tắt thành một số ít lemmata tổng quát hơn.
Raphael

Đó là ký hiệu của anh ấy cho một mối quan hệ thống trị.
Robert S. Barnes

11

Mẹo: vẽ biểu đồ của các hàm này bằng cách sử dụng một cái gì đó như Wolfram Alpha để có cảm giác về cách chúng phát triển. Lưu ý rằng điều này không chính xác lắm, nhưng nếu bạn thử nó với số lượng đủ lớn, bạn sẽ thấy các mô hình tăng trưởng so sánh. Điều này tất nhiên là không thay thế cho một bằng chứng.

Ví dụ: thử: log log (log (n)) từ 1 đến 10000 để xem một biểu đồ riêng hoặc log log (log (n)) và log log (n) từ 1 đến 10000 để xem so sánh.


9
Chúng ta có nên thực sự khuyên dùng vodoo ?
Raphael

+1 để đề xuất vẽ biểu đồ của các hàm, mặc dù các biểu đồ được liên kết khá khó hiểu trừ khi bạn biết ý nghĩa của chúng.
Tsuyoshi Ito

1
Lấy một biểu đồ như một gợi ý những gì bạn có thể muốn chứng minh. Tất nhiên gợi ý đó có thể sai.
gnasher729

8

Tôi đề nghị tiến hành theo các định nghĩa của các ký hiệu khác nhau. Bắt đầu với một số cặp biểu thức tùy ý và xác định thứ tự của các biểu thức, như được nêu dưới đây. Sau đó, với mỗi phần tử bổ sung, tìm vị trí của nó trong danh sách được sắp xếp bằng cách sử dụng tìm kiếm nhị phân và so sánh như dưới đây. Vì vậy, ví dụ, hãy sắp xếp 2 nnloglogn2n , hai hàm đầu tiên của n, để bắt đầu danh sách.

Chúng tôi sử dụng thuộc tính để viết lại biểu thức đầu tiên là n log log n = ( 2 log n ) log log n = 2 log n log log n . Sau đó chúng ta có thể tiến hành sử dụng định nghĩa để chỉ ra rằng n log log n = 2 log n log log no ( 2 n ) , vì với bất kỳ hằng số c > 0n=2lognnloglogn=(2logn)loglogn=2lognloglognnloglogn=2lognloglogno(2n)c>0, có một sao cho n n 0 , c ( n log log n ) = c ( 2 log n log log n ) < 2 n .n0nn0c(nloglogn)=c(2lognloglogn)<2n

Tiếp theo, chúng tôi thử . Chúng tôi so sánh nó với 2 n , yếu tố lớn nhất chúng tôi đã đặt cho đến nay. Vì 3 n = ( 2 log 3 ) n = 2 n log 3 , nên chúng tôi tương tự chỉ ra rằng 2 no ( 3 n ) = o ( 2 n log 3 ) .3n2n3n=(2log3)n=2nlog32no(3n)=o(2nlog3)

V.v.


2

Ở đây một danh sách từ Wikipedia , Thấp hơn trong bảng lớp phức tạp lớn hơn;

NameRunning TimeConstant timeO(1)Inverse Ackermann timeO(a(n))Iterated logarithmic timeO(logn)Log-logarithmicO(nlogn)Logarithmic timeO(logn)Polylogarithmic timepoly(logn)Fractional powerO(nc),where 0<c<1Linear timeO(n)"n log star n" timeO(nlogn)Quasilinear timeO(nlogn)Quadratic timeO(n2)Cubic timeO(n3)Polynomial timepoly(n)=2O(logn)Quasi-polynomial time2O(poly(logn))Sub-exponential time (first definition)O(2nϵ),ϵ>0Sub-exponential time (second definition)2o(n)Exponential time(with linear exponent)2O(n)Exponential time2poly(n)Factorial timeO(n!)

poly(x)=xO(1)


1
2nlogno(n!)

1
Tôi đặt cái này để tên của các lớp phức tạp có thể được nói trực tiếp ở đây. Vâng, Landau nói nhiều hơn về một loại thuật toán cụ thể trong Mật mã học.
kelalaka

1
Tôi phản đối một số quan điểm của @ Raphael. Tôi đã là một nhà toán học và một người hướng dẫn trong nhiều năm. Tôi tin rằng, ngoài việc chứng minh những điều đó, một cái bàn lớn như thế này làm tăng trực giác của mọi người một cách dễ dàng và đáng kể. Và tên của các lớp không triệu chứng giúp mọi người ghi nhớ và giao tiếp rất nhiều.
Apass.Jack

1
@ Apass.Jack Theo kinh nghiệm giảng dạy của tôi, khi được đưa ra một bảng, nhiều sinh viên sẽ học nó bằng trái tim và không đặt hàng wrt bất kỳ chức năng nào không có trong bảng. Lưu ý rằng hiệu ứng đó dường như chiếm nhiều câu hỏi liên quan đến tăng trưởng tiệm cận xuất hiện trên trang web này. Điều đó nói rằng, tất nhiên chúng ta sẽ sử dụng lemmata ngụ ý bởi bảng nếu nó làm cho bằng chứng dễ dàng hơn, nhưng điều đó xuất hiện sau khi học cách chứng minh bảng. (Để nhấn mạnh điểm đó, những người đến đây không cần giúp đọc nội dung trên bàn. Họ cần trợ giúp để chứng minh mối quan hệ.)
Raphael

1
@kelalaka "Vâng, Landau nói nhiều hơn về một loại thuật toán cụ thể trong Mật mã học." - điều đó thậm chí không có ý nghĩa. Ký hiệu Landau là một cách viết tắt để mô tả các thuộc tính của các hàm toán học. Nó không có gì để làm với các thuật toán chứ đừng nói đến mật mã, mỗi lần.
Raphael
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.