Apakah ada masalah yang algoritma yang paling terkenal menjalankan waktu

18

Saya belum pernah melihat algoritma dengan log di penyebut sebelumnya, dan saya bertanya-tanya apakah ada algoritma yang benar-benar berguna dengan formulir ini?

Saya mengerti banyak hal yang mungkin menyebabkan faktor log dikalikan dalam jangka waktu berjalan, misalnya algoritma pengurutan atau berbasis pohon, tetapi apa yang dapat menyebabkan Anda membaginya dengan faktor log?

Mike Izbicki
sumber
24
Mergesort, dengan . f(n)=nlog2n
Jeffε
12
@ Jɛ ff E snarky Mcsnarkster
Suresh Venkat
5
Urutan Radix - itu benar-benar . Apa yang terjadi adalah karena akses acak, Anda dapat menyimpan faktor log ....O(nlogn/logn)
Sariel Har-Peled
Saya ingin tahu apakah teorema hierarki DTIME, dapat digunakan sebagai argumen terhadap keberadaan algoritma tersebut, mengingat bahwa seseorang dapat melakukan beberapa trik penghematan ruang-biaya yang serupa dalam model RAM.
chazisop

Jawaban:

41

Jawaban yang biasa untuk "apa yang bisa menyebabkan Anda membelah dengan log?" adalah kombinasi dari dua hal:

  1. model perhitungan di mana operasi aritmatika waktu konstan pada bilangan bulat berukuran kata diperbolehkan, tetapi di mana Anda ingin menjadi konservatif tentang berapa lama kata-kata, sehingga Anda menganggap bit per kata (karena lebih sedikit dari itu dan Anda bahkan tidak bisa mengatasi semua memori, dan juga karena algoritma yang menggunakan pencarian tabel akan memakan waktu terlalu banyak untuk mengatur tabel jika kata-katanya lebih panjang), danO(logn)
  2. sebuah algoritma yang memampatkan data dengan mengemas bit menjadi kata-kata dan kemudian beroperasi pada kata-kata.

Saya pikir ada banyak contoh, tetapi contoh klasik adalah Algoritma Empat Rusia untuk urutan umum terpanjang dll. Ini sebenarnya berakhir menjadi , karena menggunakan ide bit-packing tetapi kemudian menghemat satu detik log factor menggunakan ide lain: mengganti blok operasi bit O ( log 2 n ) dengan pencarian tabel tunggal.O(n2/log2n)O(log2n)

David Eppstein
sumber
35

Kubus Rubik adalah contoh yang sangat alami (dan bagi saya, tak terduga). Sebuah n×n×n kubus memerlukan Θ(n2/logn) langkah untuk memecahkan. (Perhatikan bahwa ini adalah notasi theta, jadi itu adalah batas atas dan bawah yang ketat).

Ini ditunjukkan dalam makalah ini [1].

Mungkin perlu disebutkan bahwa kompleksitas penyelesaian contoh spesifik dari kubus Rubik terbuka, tetapi diperkirakan sebagai NP-hard (dibahas di sini misalnya) NP hard [2]. The Θ(n2/logn) algoritma menjamin solusi, dan menjamin bahwa semua solusi yang asimtotik optimal, tetapi mungkin tidak memecahkan kasus tertentu secara optimal. Definisi Anda tentang kegunaan mungkin atau mungkin tidak berlaku di sini, karena kubus Rubik umumnya tidak diselesaikan dengan algoritma ini (algoritma Kociemba umumnya digunakan untuk kubus kecil karena memberikan solusi cepat dan optimal dalam praktiknya).

[1] Erik D. Demaine, Martin L. Demaine, Sarah Eisenstat, Anna Lubiw, dan Andrew Winslow. Algoritma untuk Memecahkan Kubus Rubik. Prosiding Simposium Eropa Tahunan ke-19 tentang Algoritma (ESA 2011), 5-9 September 2011, halaman 689-700

[2] Erik D. Demaine, Sarah Eisenstat, dan Mikhail Rudoy. Memecahkan Rubik's Cube Optimally adalah NP-complete. Prosiding Simposium Internasional ke-35 tentang Aspek Teoritis Ilmu Komputer (STACS 2018), 28 Februari - 3 Maret 2018, halaman 24: 1-24: 13.

SamM
sumber
16

Contoh muncul dalam penyebut tanpa trik pengepakan bit adalah sebuah makalah baru-baru ini oleh Agarwal, Ben Avraham, Kaplan dan Sharir pada komputasi jarak Fréchet yang terpisah antara dua rantai poligonal dalam waktu O ( n 2 log log n / log n ) . Meskipun saya tidak terbiasa dengan detail algoritme, satu trik umum adalah mempartisi input menjadi potongan-potongan yang relatif kecil dan kemudian menggabungkan jawaban secara cerdik (tentu saja ini terdengar seperti membagi dan menaklukkan, tetapi Anda tidak mendapatkan log di penyebut dengan beberapa trik pintar)lognO(n2loglogn/logn)

Suresh Venkat
sumber
5
Ini adalah contoh yang lebih kompleks dari teknik "Empat Rusia" yang dijelaskan dalam jawaban David.
Jeffε
13

Tidak persis seperti yang Anda minta, tetapi situasi "di alam liar" di mana faktor log muncul dalam penyebut adalah kertas " Kerikil dan Program Percabangan untuk Evaluasi Pohon " oleh Stephen Cook, Pierre McKenzie, Dustin Wehr, Mark Braverman, dan Rahul Santhanam.

Masalah evaluasi pohon (TEP) adalah: diberi pohon -ary yang dianotasi dengan nilai dalam { 1 , ... , k } pada daun dan fungsi { 1 , ... , k } d{ 1 , ... , k } pada node internal , evaluasi pohonnya. Di sini setiap simpul internal mendapatkan nilai fungsi yang dianotasinya pada nilai anak-anaknya. Ini adalah masalah yang mudah, dan intinya adalah untuk menunjukkan bahwa itu tidak dapat diselesaikan dalam ruang logaritmik (ketika ketinggian pohon adalah bagian dari input). Untuk itu, kami tertarik dengan ukuran program percabangan yang menyelesaikan TEP.d{1,,k}{1,,k}d{1,,k}

Dalam Bagian 5, batas-batas ketat disajikan untuk pohon-pohon dengan tinggi 3, baik untuk TEP dan untuk masalah terkait BEP, di mana outputnya diciutkan menjadi dengan cara sewenang-wenang. Untuk TEP batasnya adalah Θ ( k 2 d - 1 ) , sedangkan untuk BEP batasnya adalah Θ ( k 2 d - 1 / log k ) , yaitu Anda mendapatkan penghematan log k .{0,1}Θ(k2d1)Θ(k2d1/logk)logk

Yuval Filmus
sumber
12

Meskipun ini bukan tentang runtime, saya pikir layak menyebutkan hasil klasik dari Hopcroft, Paul, dan Valiant: [1], karena masih dalam semangat "apa yang bisa menyebabkan Anda menyimpan faktor log."TIME[t]SPACE[t/logt]

Itu memberi banyak contoh masalah yang batas atasnya paling dikenal dalam kompleksitas ruang memiliki log dalam penyebut. (Tergantung pada sudut pandang Anda, saya akan berpikir bahwa membuat contoh ini sangat menarik - teorema yang menakjubkan! - atau sangat tidak menarik - mungkin tidak "benar-benar berguna".)

[1] Hopcroft, Paul, dan Valiant. Tepat waktu versus ruang . J. ACM 24 (2): 332-337, 1977.

Joshua Grochow
sumber
8

Algoritma yang paling dikenal untuk menghitung jarak edit (alias Levenshtein) antara dua string dengan panjang membutuhkan waktu O ( ( n / log n ) 2 ) :nO((n/logn)2)

William J. Masek, Mike Paterson: A String Algoritma Komputasi Edit Lebih Jauh. J. Comput. Syst. Sci. 20 (1): 18-31 (1980).

KIA
sumber
4
Sekali lagi, ini adalah variasi dari algoritma Empat Rusia, saya pikir.
David Eppstein
7

muncul sebagai batas yang benar untuk masalah yang dipertimbangkan oleh Greg dan Paul Valiant (tidak ada koneksi ke trik bit):Θ(n/logn)

Gregory Valiant, dan Paul Valiant, The Power of estimators linier, 2011. Dalam Simposium IEEE Tahunan ke-52 tentang Yayasan Ilmu Komputer, FOCS 2011.

Jelani Nelson
sumber
7

Berikut adalah contoh lain dari ikatan ketat yang memiliki faktor log. (Ini adalah Teorema 6.17 dari Kompleksitas Fungsi Boolean: Kemajuan dan Batas oleh Stasys Jukna.)

Θ(n2/logn)n

mpoly(m)n:=O(mlogm)O(logm) bits. So an upper bound that looks natural in terms of m, like Θ(m2logm), becomes Θ(n2/logn) when expressed in terms of n, where n is the number of bits in the input.

Robin Kothari
sumber
2

Finding the prime factors of n by trial division when the list of primes is already given. There are θ(nlog(n)) primes less than n so if these primes are given to you, then trial division of n by each of them takes θ(nlog(n)) time (assuming division is a constant-time operation)

dspyz
sumber
3
In fact, it's enough to look at the roughly 2n/logn primes below n. But there are far better algorithms out there.
Yuval Filmus
-2

somewhat similar to JG's answer & "thinking outside the box", this seems like a related/relevant/apropos/fundamental negative result. based on diagonalization with a universal TM, there exists a O(f(n)) DTIME language that cannot run in O(f(n)logf(n)) DTIME, due to the time hierarchy theorem. so this applies to a linear DTIME algorithm that exists, f(n)=n, that runs impossibly in O(nlogn) DTIME.

vzn
sumber
2
on a TM, DTIME(n/logn) is trivial as it doesn't allow the machine to read the whole input. also, the DTIME notation makes the big-oh notation unnecessary.
Sasho Nikolov
?? there is still theory for sublinear time algorithms...
vzn
3
sublinear algorithms make sense in oracle & random access models. DTIME is standardly defined w.r.t. multitape TM, and that's the definition used in the hierarchy theorem for DTIME.
Sasho Nikolov
1
No, @SashoNikolov, DTIME(n/logn) is not trivial. Compare "Are the first n/lgn bits of the input all zeros?" with "Do the first n/lgn bits of the input encode a satisfiable boolean formula?"
Jeffε
5
@JɛffE: You cannot test “Are the first n/lgn bits of the input all zeros?” in O(n/logn) time on a TM, since you do not know what n is without first reading the whole input, which takes time n. It is a standard fact that if f(n)<n, then DTIME(f(n)) contains only languages the membership in which can be determined from the first k bits of input for a constant k (and therefore are computable in constant time).
Emil Jeřábek supports Monica