Kompleksitas waktu penambahan

11

Wikipedia mencantumkan kompleksitas waktu penjumlahan sebagai , di mana adalah jumlah bit.nnn

Apakah ini batas bawah teori yang kaku? Atau apakah ini hanya kompleksitas dari algoritma tercepat yang dikenal saat ini. Saya ingin tahu, karena kompleksitas penjumlahan, menggarisbawahi semua operasi aritmatika lainnya dan semua algoritma yang menggunakannya.

Apakah secara teori tidak mungkin, untuk mendapatkan algoritma tambahan yang berjalan di ? Atau apakah kita terikat pada kompleksitas linier sebagai tambahan.o(n)

Tobi Alafin
sumber

Jawaban:

17

Jika algoritme Anda menggunakan secara asimptot kurang dari waktu, maka algoritma tidak memiliki cukup waktu untuk membaca semua digit angka yang ditambahkannya. Anda bayangkan Anda menangani angka yang sangat besar (disimpan misalnya dalam file teks 8MB). Tentu saja, penambahan dapat dilakukan dengan sangat cepat dibandingkan dengan nilai angkanya; ini berjalan dalam waktu , jika adalah nilai penjumlahan.nO(log(N))N

Ini tidak berarti Anda dapat mempercepat sedikit; jika prosesor Anda menangani 32 bit setiap operasi, maka Anda menggunakan waktu , tetapi itu masih dan bukan .n32O(n)o(n)

Pengganti Vinkhuijzen
sumber
Apakah membaca semua data secara teoritis diperlukan. Untuk penambahan dua angka dan . Menghitung , dapat dilakukan dalam operasi , melalui pemindahan gigi. Menambahkan . Pertimbangkan itu. Mungkin Anda tidak menemukan taksiran yang lebih cepat untuk penjumlahan, perbaiki taksiran itu sampai benar Dalam kurang dari operasi ? ab,a:ab,a+b2a2aO(1)0n
Tobi Alafin
3
Ya, ini adalah kebutuhan teoritis, karena: setiap bit input digunakan secara non-sepele dalam output , di mana secara non-sepele yang saya maksud bukanlah fungsi identitas. Dalam contoh Anda , apakah dapat dihitung dalam waktu tergantung pada model komputasi: jika menambahkan adalah operasi waktu konstan, maka ya. Jika Anda memiliki akses RAM, Anda perlu waktu untuk menulis alamat bit jika Anda sudah mengetahui panjang , atau waktu jika Anda harus membaca semua untuk mencari tahu. Dalam contoh ini , banyak bit output adalah fungsi sepele dari bit input.2a2aO(1)0O(log(n))aO(n)a2a
Lieuwe Vinkhuijzen
Saya memiliki algoritma yang menemukan panjang di . Ini menggunakan pencarian biner. O ( log n )aO(logn)
Tobi Alafin
3
@TobiAlafin Jika model Anda mendukung pengalamatan RAM, maka pencarian biner Anda berjalan dalam langkah , benar. Pada Mesin Turing, dan dalam file teks yang tidak dimuat ke memori utama, ini membutuhkan waktu . Dalam kedua kasus tersebut, untuk menjawab pertanyaan Anda, dengan atau tanpa RAM yang ditujukan untuk mempercepat pencarian, algoritme Anda harus melihat semua bit input untuk menghitung . Misalkan tidak, dan pada input bit, ia tidak memeriksa bit ke- . Kemudian saya bisa membalik sedikit itu, dan itu akan memberikan jawaban yang salah. O ( n ) a + b 42 6O(logn)O(n)a+b426
Lieuwe Vinkhuijzen
1
Pada dasarnya semua operasi adalah , untuk alasan ini. Satu-satunya pengecualian adalah jika Anda berurusan dengan struktur data yang dipesan dengan cara tertentu: mis. Anda tidak harus mengunjungi seluruh BST untuk memeriksa apakah mengandung nilai tertentu, tetapi ini benar hanya karena invarian yang datang dengan BST. Ω(n)
Bakuriu
7

Agar analisis kompleksitas masuk akal secara formal, Anda harus menentukan model komputasi formal tempat algoritma dalam objek dieksekusi, atau, paling tidak, model biaya , yang menentukan apa operasi dasar dan biaya mereka.

Dalam sebagian besar konteks, operasi aritmatika diasumsikan memakan waktu . Ini biasanya masuk akal, karena kami tertarik pada kompleksitas algoritme terlepas dari jumlah yang terlibat. Ini disebut model biaya seragam .Θ(1)

Jika angka dapat tumbuh tanpa batas, atau kami tertarik untuk menganalisis operasi itu sendiri, operasi aritmatika dianggap memiliki biaya , sebanding dengan ukuran input.Θ(|x|)

Sekarang, dapatkah operasi memiliki biaya yang kurang dari itu? Mungkin, namun Anda harus mendefinisikan secara formal model komputasi di mana itu bisa terjadi.

quicksort
sumber
1
Sebagai contoh tambahan, pengangkut carry-forward membutuhkan, di bawah asumsi penyederhanaan yang sesuai, waktu untuk menghitung jumlah dari dua angka bit. nΘ(logn)n
Fabio Somenzi
3

Input untuk penambahan adalah dua angka acak . Karena mereka arbitrer, Anda harus membaca setiap bit, dan oleh karena itu algoritmenya adalah .Ω(n)

Bayangkan algoritma Anda berhasil menambahkan 1010100110 dan 0010010110 tanpa membaca setiap bit. Agar algoritma Anda dapat menambahkan input sewenang-wenang , saya harus dapat membalik salah satu bit ini secara acak, dan algoritme masih menampilkan penambahan yang benar (namun berbeda). Tetapi jika algoritma Anda tidak membaca setiap bit, bagaimana ia bisa tahu bahwa input yang dibalik berbeda dari input asli?

murrdpirate
sumber
Apa yang saya pikirkan adalah cara untuk memperkirakan jumlah dalam kurang dari operasi. n
Tobi Alafin
Benar. Anda hanya perlu mendefinisikan apa arti "perkiraan" dalam algoritma Anda. Bergantung pada definisi itu, menambahkan dua bit paling signifikan bisa menjadi jumlah perkiraan, yang dapat dilakukan dalam waktu (n) waktu. Ketika Anda menyebutkan algoritma "penambahan", saya pikir kita semua menganggap bahwa jawabannya harus tepat.
murrdpirate