Độ phức tạp thời gian Big-Oh có thể chứa nhiều hơn một biến không?


11

Ví dụ, tôi đang xử lý chuỗi yêu cầu phân tích hai chuỗi. Tôi không có thông tin nào về chiều dài của chúng có thể là bao nhiêu, vì vậy chúng đến từ hai gia đình riêng biệt. Có thể chấp nhận gọi độ phức tạp của thuật toán hoặc O ( n + m ) (tùy thuộc vào việc chúng ta sử dụng thuật toán ngây thơ hay tối ưu hóa)?Ôi(n*m)Ôi(n+m)

Trên một mạch tương tự, chúng ta hãy giả sử thuật toán mà chúng ta chọn thực sự yêu cầu hai giai đoạn - giai đoạn thiết lập trên chuỗi đầu tiên cho phép chúng ta xử lý bất kỳ số chuỗi nào khác mà không phải chịu chi phí ban đầu đó. Nó có được coi là thích hợp để nói rằng nó có cấu trúc theo sau bởi bất kỳ số lượng tính toán O ( m ) nào không?Ôi(n)Ôi(m)

Sẽ là thích hợp nếu chỉ gọi chúng là vì cả hai phép tính đều tuyến tính?Ôi(n)


Xem các nhận xét về câu trả lời này để có một nền tảng nhỏ - sự tôn trọng của tôi đối với @corsiKa vì đã dũng cảm hỏi một câu hỏi gây tranh cãi như vậy.
OldCurmudgeon

@OldCurmudgeon, tôi hiểu rồi. Tôi ghét phải lội vào chủ đề bình luận đó. Oldcurmudgeon, bạn đang tranh cãi về ký hiệu big-O mà không hiểu ký hiệu big-O? Thật khó xử. Ngoài ra, bạn và corsiKa đang tranh cãi về thời gian chạy mà không xác định các tham số m - một công thức để truyền thông sai. Gợi ý: một quy ước phổ biến khi xử lý chuỗi là đồng ý sử dụng m để sử dụng độ dài của một chuỗi và n cho độ dài của chuỗi khác - nhưng lý tưởng nhất có lẽ là tốt nhất để làm rõ điều này, vì nếu không, nó có thể gây nhầm lẫn (như minh họa ở đây). nmmn
DW

@DW Có thể OldCurmudgeon chỉ đơn giản là học một định nghĩa khác ở trường ... như tôi đã chỉ ra trong một bình luận bên dưới, có thể tránh được nhiều biến số, mặc dù tôi chưa bao giờ thực sự nghĩ đến việc làm nó cho đến bây giờ. Có lẽ điều này - hoặc một cái gì đó giống như nó - từng là tiêu chuẩn?
Patrick87

2
Tôi nghĩ rằng điều này có đủ câu trả lời ở đâyở đây .
Raphael

Câu trả lời:


14

Phải, tất nhiên. Điều này là tốt và hoàn toàn chấp nhận được. Thông thường và tiêu chuẩn để xem các thuật toán có thời gian chạy phụ thuộc vào hai tham số.

Chẳng hạn, bạn sẽ thường thấy thời gian chạy của tìm kiếm theo chiều sâu được biểu thị là , trong đó n là số đỉnh và m là số cạnh trong biểu đồ. Điều này là hoàn toàn hợp lệ. Ý nghĩa của điều này là tồn tại hằng số c và các số n 0 , m 0 sao cho thời gian chạy của thuật toán nhiều nhất là c ( n + m ) , với mọi n > n 0 , m > m 0Ôi(n+m)nmcn0,m0c(n+m)n>n0,m>m0. Nói cách khác, nếu thời gian chạy chính xác là , chúng ta nói rằng f ( n , m ) = O ( n + m ) nếu tồn tại c , n 0 , m 0 sao cho n > n 0m > m 0 ngụ ý f ( n , m ) c ( n + m )f(n,m)f(n,m)= =Ôi(n+m)c,n0,m0n>n0m>m0f(n,m)c(n+m).

Đúng, hoàn toàn phù hợp và chấp nhận được khi nói rằng giai đoạn đầu tiên mất thời gian và giai đoạn thứ hai mất thời gian O ( m ) .Ôi(n)Ôi(m)

Quan trọng: đảm bảo bạn xác định m là gì. Bạn không thể nói "đây là thuật toán thời gian O ( n ) " mà không chỉ định n là gì . Nếu n không được chỉ định trong báo cáo vấn đề, bạn cần chỉ định nó. Chẳng hạn, xem các thuật toán đồ thị, trong đó chúng ta thường xác định n = # các đỉnh và m = # của các cạnh.nmÔi(n)nnn= =m= =

Theo như bạn có thể gọi chúng là thời gian, không, tất nhiên là không - trừ khi bạn bằng cách nào đó biết rằng m = O ( n ) . Tất nhiên, nếu bạn biết rằng m = O ( n ) , thì nó tuân theo m + n = O ( n ) , do đó thuật toán thời gian O ( m + n ) cũng là thuật toán thời gian O ( n ) . Nhưng nếu không có gì đảm bảo rằng m = O (Ôi(n)m= =Ôi(n)m= =Ôi(n)m+n= =Ôi(n)Ôi(m+n)Ôi(n) , sau đó bạn không thể gọi nó làthuật toán thời gian O ( n ) .m= =Ôi(n)Ôi(n)

Đây là công cụ cơ bản. Bạn sẽ tìm thấy nó trên tất cả các sách giáo khoa thuật toán.


1
@OldCurmudgeon, tỷ lệ cược là bạn sẽ tìm thấy các ví dụ về điều này trong nhiều sách giáo khoa thuật toán tiêu chuẩn. Những gì bạn đã xem? Bạn đã thử xem chương về tìm kiếm theo chiều sâu (ví dụ mà tôi đã đề cập trong câu trả lời của mình) chưa?
DW

2
@OldCurmudgeon Trong phiên bản bài tập CLRS của tôi 3.1-8 trình bày chính xác định nghĩa này về chú thích cho các hàm của nhiều biến. Và giới hạn trên của nó về thời gian chạy của dfs là O ( V + E ) cho đồ thị ( V , E ) . ÔiÔi(V+E)(V,E)
Kirill

2
@Kirill Quan điểm của tôi là nó có thể hiểu được, tại một số thời điểm trong quá khứ, nó được coi là thông lệ để chỉ xem xét tổng chiều dài, đến mức làm khác đi có thể được coi là một lỗi. Nếu bạn chấm điểm bài kiểm tra của học sinh và học sinh đó đã sử dụng tổng chiều dài đầu vào làm biến số cho độ phức tạp thời gian của DFS, bạn có coi đó là lỗi không xem xét hai chiều (V và E) không? Điều gì là sự thật và những gì mọi người sẵn sàng thừa nhận, không phải lúc nào cũng giống nhau. n
Patrick87

1
Tôi đồng ý trong trường hợp mọi người sử dụng ký hiệu Landau theo cách này, nhưng hầu như không ai biết ý nghĩa thực sự của nó (trừ khi bạn kết nối các tham số theo chức năng). Xem thêm bài viết được liên kết trong câu trả lời của A. Schulz tại đây bắt đầu bằng cách nói rằng việc sử dụng "cơ bản" và "phổ biến" là sai.
Raphael

1
@ Patrick87 Lý thuyết phức tạp sử dụng, theo định nghĩa của nhiều lớp nổi tiếng, chủ yếu là độ dài đầu vào (với các ngoại lệ đáng chú ý). Phân tích thuật toán là - khi được thực hiện nghiêm túc - quan tâm đến việc tìm hiểu điều gì đó về việc sử dụng tài nguyên thực tế (theo như mô hình cho phép) để các tham số khác trở nên thú vị hơn khi vẽ toàn bộ bức tranh (chính xác hơ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.