Apakah O (mn) dianggap pertumbuhan "linear" atau "kuadratik"?

24

Jika saya memiliki beberapa fungsi yang kompleksitas waktunya adalah O ( mn ), di mana m dan n adalah ukuran dari dua inputnya, apakah kita akan menyebut kompleksitas waktunya "linear" (karena linear pada m dan n ) atau "kuadratik" ( karena ini adalah produk dari dua ukuran)? Atau sesuatu yang lain?

Saya merasa menyebutnya "linear" membingungkan karena O (m + n) juga linear tetapi jauh lebih cepat, tetapi saya merasa seperti menyebutnya "kuadrat" juga aneh karena linear dalam setiap variabel secara terpisah.

Mehrdad
sumber
7
Penting untuk mengatakan linear dalam hal apa . Jika, misalnya, kita memiliki grafik dengan m edge dan n simpul, O(m+n) linier dalam jumlah edge, tetapi (berpotensi) kuadratik dalam jumlah verteks.
Raphael
3
Saya pikir komentar Raphael tepat. "Linear" harus digunakan relatif terhadap sesuatu, seringkali ukuran input. Jika Anda mentransposisi suatu matriks O ( m n ) adalah "linear" karena input berukuran O ( m n ) . Jika Anda mencari kemunculan string karakter n dalam string karakter m , O ( m n ) tidak linier --- O ( m + n ) adalah. m×nO(mn)O(mn)nmO(mn)O(m+n)
SamM
3
Saya akan setuju dengan komentar @ Raphael juga, tetapi pada saat yang sama tidak jarang mendengar orang mengatakan kompleksitas waktu tertentu "linear" tanpa menyebutkan relatif terhadap apa. Dan dalam beberapa kasus itu tidak masalah, misalnya O (m + n) adalah linear relatif terhadap semua input, jadi saya tidak akan berpikir dua kali untuk menyebutnya linear seperti SamM juga lakukan di atas. Tapi itu menimbulkan pertanyaan: apa, jika ada, yang membuat O (mn) tidak linier?
Mehrdad
3
@Mehrdad: Saya pikir baseline adalah "dalam ukuran input, dengan asumsi input dikodekan sebagai string biner (pada pita mesin Turing)". Ukuran input ini kemudian merupakan fungsi dari dan m itu sendiri. SamM memberikan contoh yang bagus. nm
Raphael
1
Lihat juga people.cis.ksu.edu/~rhowell/asymptotic.pdf tentang notasi landau dalam berbagai variabel.
Jonas Kölker

Jawaban:

18

Dalam matematika, fungsi seperti ini disebut fungsi multilinear . Tetapi para ilmuwan komputer mungkin umumnya tidak akan tahu terminologi ini. Fungsi ini seharusnya tidak boleh disebut linear, baik dalam matematika atau ilmu komputer, kecuali Anda dapat mempertimbangkan salah satu dari dan n sebagai konstanta.mn

Peter Shor
sumber
Apa yang membuat mempertimbangkan salah satu dari dan n sebagai hal yang wajar? mn
user2768
11

Untuk menjelaskan diskusi dalam komentar, penting untuk mengukur pertumbuhan Anda.

Seperti disebutkan oleh @Kaveh, tidak linier di keduanya pada saat yang sama, tetapi linier jika yang satu adalah konstanta dan yang lainnya tumbuh.O(mn)

Di sisi lain, kemungkinan akan dianggap linier. Secara intuitif, jika m menggandakan, atau jika n menggandakan, atau bahkan jika keduanya m dan n menggandakan, m + n tidak bisa lebih dari dua kali lipat. Hal ini tidak benar dari m n ; jika m dan n keduanya ganda m n naik dengan 4. Inilah sebabnya mengapa dalam banyak konteks waktu berjalan ini akan dianggap kuadratik. Saya memberikan contoh ini dengan pencocokan string dalam beberapa paragraf.O(m+n)mnmnm+nmnmnmn

Tetapi biasanya ketika Anda menggunakan notasi Big- , Anda menggunakannya dalam referensi untuk sesuatu yang khusus. Karena kita sebagian besar ahli teori, umumnya ukuran input untuk masalah.O

Mari kita ambil Matrix Addition, misalnya. Menambahkan dua matriks membutuhkan O ( m n ) waktu. Tetapi setiap elemen dari input kami hanya disentuh satu kali, jadi ini biasanya akan disebut linear. Dengan kata lain, input kami berukuran O ( m n ) , jadi waktu berjalan O ( m n ) linier dalam ukuran input.m×nO(mn)O(mn)O(mn)

Sekarang mari kita lihat pencocokan string - yaitu, kita diberi string ukuran dan string ukuran n dan kami ingin melihat apakah ada kemunculan string yang lebih kecil di dalam string yang lebih besar. Kita dapat memeriksa ini secara naif dalam waktu O ( m n ) ; ini umumnya dianggap kuadrat. Mengapa? Jika m dan n dapat berupa apa saja, atur m = n . Maka waktu berjalan kami adalah O ( m 2 ) dan input kami berukuran 2 m .mnO(mn)mnm=nO(m2)2m

Di sisi lain, jika kita menggunakan algoritma Rabin-Karp , kita mendapatkan (rata-rata) waktu. Input kami terdiri dari kedua string, jadi input kami juga berukuran O ( m + n ) . Oleh karena itu, ini umumnya akan disebut sebagai linear.O(m+n)O(m+n)

Singkatnya: umumnya disebut linier untuk hal-hal seperti perkalian matriks karena linier dalam ukuran input, tetapi umumnya disebut kuadrat untuk hal-hal seperti pencocokan string karena input yang lebih kecil. Istilah mana yang sesuai tergantung pada konteks Anda menggunakannya.O(mn)

SamM
sumber
8

Jika Anda mengukur waktu berjalan di maka O ( m n ) adalah tidak fungsi linear di ( m , n ) . Jika tidak ada hubungan antara m dan n fungsi ini dapat tumbuh kuadrat secara umum.(m,n)O(mn)(m,n)mn

Namun itu adalah fungsi linear di masing-masing secara terpisah, yaitu jika Anda memperbaiki salah satunya dan melihat pertumbuhan dalam variabel lain maka itu adalah fungsi linier pada yang lain.

Kaveh
sumber
3

Untuk mengukur kompleksitas masalah dengan beberapa input , salah satu caranya adalah menemukan variabel dominan dan kemudian mengikat input lain berdasarkan pada variabel tersebut. Dengan pendekatan ini Anda bisa memiliki fungsi kompleksitas berdasarkan pada variabel tunggal .

Reza
sumber
2
Mungkin tidak ada variabel dominan, misalnya jika Anda memiliki jumlah node dan edge.
Raphael
0

L={w1#w2|wi(Σ{#}),}fmin{|w1|,|w2|}f(|w|)w=w1#w2LO(|w1||w2|)algoritma yang mengenali sebagai .LO(f(|w|)(|w|f(|w|))=O(f(|w|)|w|f(|w|)2)=O(f(|w|)|w|)

O(nlogn)

frafl
sumber