O (mn) có được coi là tăng trưởng tuyến tính hay không?


24

Nếu tôi có một số hàm có độ phức tạp thời gian là O ( mn ), trong đó mn là kích thước của hai đầu vào của nó, chúng ta sẽ gọi độ phức tạp thời gian của nó là "tuyến tính" (vì nó tuyến tính ở cả mn ) hoặc "bậc hai" ( vì nó là sản phẩm có hai kích cỡ)? Hay cái gì khác?

Tôi cảm thấy gọi nó là "tuyến tính" là khó hiểu vì O (m + n) cũng tuyến tính nhưng nhanh hơn nhiều, nhưng tôi cảm thấy việc gọi nó là "bậc hai" cũng kỳ lạ bởi vì nó là tuyến tính trong mỗi biến riêng biệt.


7
Điều quan trọng là phải nói tuyến tính trong những gì . Ví dụ, nếu chúng ta có một đồ thị có cạnh và đỉnh thì là tuyến tính theo số cạnh, nhưng (có khả năng) bậc hai theo số đỉnh. n O ( m + n )mnO(m+n)
Raphael

3
Tôi nghĩ rằng nhận xét của Raphael là tại chỗ. "Tuyến tính" phải được sử dụng liên quan đến một cái gì đó, thường là kích thước của đầu vào. Nếu bạn hoán vị ma trận ma trận là "tuyến tính" do đầu vào có kích thước . Nếu bạn đang tìm kiếm sự xuất hiện của một chuỗi ký tự trong chuỗi ký tự , không phải là tuyến tính --- sẽ là. O ( m n ) O ( m n ) n m O ( m n ) O ( m + n )m×nO(mn)O(mn)nmO(mn)O(m+n)
SamM

3
Tôi cũng đồng ý với nhận xét của @ Raphael, nhưng đồng thời, không có gì lạ khi nghe mọi người nói rằng độ phức tạp thời gian cụ thể là "tuyến tính" mà không đề cập đến những gì liên quan. Và trong một số trường hợp, điều đó không thành vấn đề, ví dụ O (m + n) là tuyến tính liên quan đến tất cả các yếu tố đầu vào, vì vậy tôi sẽ không nghĩ hai lần về việc gọi nó là tuyến tính như SamM cũng đã làm ở trên. Nhưng điều đó đặt ra câu hỏi: cái gì, nếu có, làm cho O (mn) không tuyến tính?
Mehrdad

3
@Mehrdad: Tôi nghĩ đường cơ sở là "ở kích thước đầu vào, giả sử đầu vào được mã hóa dưới dạng chuỗi nhị phân (trên băng máy Turing)". Kích thước đầu vào này sau đó là một hàm của m . SamM đưa ra ví dụ tốt. nm
Raphael

1
Xem thêm people.cis.ksu.edu/~rhowell/asymptotic.pdf về ký hiệu Landau trong nhiều biến.
Jonas Kölker

Câu trả lời:


18

Trong toán học, các hàm như thế này được gọi là các hàm đa tuyến . Nhưng các nhà khoa học máy tính có lẽ thường không biết thuật ngữ này. Hàm này chắc chắn không được gọi là tuyến tính, trong toán học hoặc khoa học máy tính, trừ khi bạn có thể coi một trong các n là hằng số một cách hợp lý .mn


Điều gì làm cho việc xem xét một trong n là một hằng số hợp lý? mn
dùng2768

11

Để làm sáng tỏ cuộc thảo luận trong các bình luận, vấn đề là bạn đang đo lường sự tăng trưởng liên quan đến vấn đề gì.

Như được đề cập bởi @Kaveh, không phải là tuyến tính trong cả hai cùng một lúc, nhưng là tuyến tính nếu một là hằng số và một số khác phát triển.O(mn)

Mặt khác, có thể sẽ được coi là tuyến tính. Theo trực giác, nếu m nhân đôi, hoặc nếu n nhân đôi, hoặc thậm chí nếu cả mn nhân đôi, m + n không thể nhiều hơn gấp đôi. Điều này không đúng với m n ; nếu mn cả hai m m n tăng lên 4. Đây là lý do tại sao trong nhiều bối cảnh, thời gian chạy này sẽ được coi là bậc hai. Tôi đưa ra một ví dụ về điều này với kết hợp chuỗi trong một vài đoạn.O(m+n)mnmnm+nmnmnmn

Nhưng thông thường khi bạn đang sử dụng ký hiệu Big- , bạn đang sử dụng nó để tham khảo một cái gì đó cụ thể. Vì chúng tôi chủ yếu là các nhà lý thuyết, nên nhìn chung kích thước của vấn đề.O

Hãy lấy Ma trận bổ sung, ví dụ. Thêm hai ma trận mất thời gian O ( m n ) . Nhưng mỗi yếu tố đầu vào của chúng tôi chỉ được chạm một lần, vì vậy điều này thường được gọi là tuyến tính. Nói cách khác, đầu vào của chúng tôi có kích thước O ( m n ) , vì vậy thời gian chạy của O ( m n ) là tuyến tính theo kích thước của đầu vào.m×nO(mn)O(mn)O(mn)

Bây giờ chúng ta hãy xem kết hợp chuỗi - cụ thể là, chúng ta được cung cấp một chuỗi có kích thước và một chuỗi có kích thước n và chúng ta muốn xem liệu có sự xuất hiện của chuỗi nhỏ hơn trong chuỗi lớn hơn không. Chúng ta có thể kiểm tra điều này một cách ngây thơ trong thời gian O ( m n ) ; điều này thường được coi là bậc hai. Tại sao? Nếu mn có thể là bất cứ thứ gì, đặt m = n . Sau đó, thời gian chạy của chúng tôi là O ( m 2 ) và đầu vào của chúng tôi có kích thước 2 m .mnO(mn)mnm=nO(m2)2m

Mặt khác, nếu chúng ta sử dụng thuật toán Rabin-Karp , chúng ta sẽ có (trung bình ) thời gian . Đầu vào của chúng tôi bao gồm cả hai chuỗi, vì vậy đầu vào của chúng tôi cũng có kích thước O ( m + n ) . Do đó, điều này thường được gọi là tuyến tính.O(m+n)O(m+n)

Tóm lại: thường được gọi là tuyến tính cho những thứ như nhân ma trận vì nó tuyến tính theo kích thước của đầu vào, nhưng nó thường được gọi là bậc hai cho những thứ như khớp chuỗi vì đầu vào nhỏ hơn. Thuật ngữ nào phù hợp tùy thuộc vào ngữ cảnh bạn đang sử dụng.O(mn)


8

Nếu bạn đang đo thời gian chạy trong sau đó O ( m n )không một hàm tuyến tính trong ( m , n ) . Nếu không có mối quan hệ giữa mn , hàm này có thể phát triển bậc hai nói chung.(m,n)O(mn)(m,n)mn

Tuy nhiên, đây là một hàm tuyến tính trong mỗi hàm riêng biệt, tức là nếu bạn sửa một trong số chúng và xem sự tăng trưởng của biến khác thì đó là hàm tuyến tính trong một biến khác.


3

Để đo lường mức độ phức tạp của các vấn đề với nhiều đầu vào , một cách là tìm biến chi phối và sau đó ràng buộc các đầu vào khác dựa trên biến đó. Với phương pháp này, bạn có thể có hàm phức tạp dựa trên một biến duy nhất .


2
Có thể không có biến chi phối, ví dụ nếu bạn có số lượng nút và cạnh.
Raphael

0

Cho một số ngôn ngữ và một hàm f rằng đó là phút { | w 1 | , | w 2 | } f ( | w | ) cho mỗi w = w 1 # w 2L bạn có thể ước tính thời gian chạy của một O ( | w 1 || w 2 | ) thuật toán mà nhận LL={w1#w2|wi(Σ{#}),}fmin{|w1|,|w2|}f(|w|)w=w1#w2LO(|w1||w2|)L .O(f(|w|)(|w|f(|w|))=O(f(|w|)|w|f(|w|)2)=O(f(|w|)|w|)

Điều này có nghĩa là bạn có được thời gian tuyến tính, nếu phần nhỏ hơn của đầu vào của bạn không đổi (so với toàn bộ đầu vào), một cái gì đó ở giữa (như ) nếu đó là thời gian chạy tuyến tính và bậc hai nếu nó tuyến tính.O(nlogn)

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.