Algoritma Grover digunakan, antara lain, untuk mencari item dalam daftar item yang tidak terurut panjangnya . Meskipun ada banyak pertanyaan di sini mengenai topik ini, saya masih merindukan intinya.
Mencari dalam daftar, cara klasik
Biasanya, saya akan merancang fungsi pencarian dengan cara ini
Jadi saya memberikan daftar dan item yang diinginkan sebagai input, dan saya menerima posisi dari item dalam daftar sebagai keluaran. Saya pikir saya sudah mengerti bahwa informasi tentang \ mathbf {y} tertanam dalam algoritma melalui gerbang oracle O , jadi fungsi kita menjadi
\ mathrm {search} _ \ mathbf {y} ([\ mathbf {x} _1, \ mathbf {x} _2, ..., \ mathbf {x} _n]) = i \ in \ mathbb {N} \ quad \ text {sedemikian rupa} \ mathbf {x} _i = \ mathbf {y}
Mari kita buat contoh praktis. Pertimbangkan mencari kartu as sekop 1 \ sekop
Daftar panjang adalah \ mathbf {x} _7 = 6 \ Clubsuit] .
Elemen yang dicari adalah . Saya harus mendapatkan . Setiap kartu dapat dikodekan dengan bit, daftar ini memiliki elemen sehingga kita membutuhkan bit untuk menyandikan daftar. Dalam hal ini, oracle akan mengimplementasikan fungsi:
Namun, input dari algoritma Grover bukanlah keadaan qubit.
(NB: Gambar deck dikocok diambil dari sini )
Grover dan oracle-nya
Beberapa sumber (mis. Di sini - dijelaskan secara grafis) mengatakan bahwa input dari algoritma berbeda: input adalah keadaan yang diambil dari ruang pencarian mana adalah jumlah elemen dari daftar. Setiap angka sesuai dengan posisi elemen dalam daftar.
Input sekarang menjadi vektor qubit , yang harus menjadi superposisi semua item di ruang pencarian .
Kita tahu
- sesuai dengan ;
- sesuai dengan ;
- sesuai dengan ;
- sesuai dengan yang merupakan elemen yang diinginkan;
- dan seterusnya...
Dalam hal ini kita memiliki
Tetapi dalam kasus ini, oracle kita harus mengimplementasikan fungsi
Membangun oracle mengharuskan kita untuk mengetahui bahwa ada di posisi 5. Apa gunanya menjalankan algoritma jika kita sudah mencari elemen untuk membangun oracle?
sumber
Jawaban:
Jika Anda memiliki 8 item dalam daftar (seperti pada contoh kartu Anda), maka input oracle adalah 3 (qu) bit. Jumlah kartu di dek (52) tidak relevan, Anda hanya perlu 3 bit untuk mengkodekan 8 kartu.
Anda dapat berpikir bahwa 3 bit mengkodekan posisi dalam daftar kartu yang Anda cari; maka Anda tidak tahu posisinya, tetapi oracle tahu. Jadi jika Anda mencari kartu as sekop, maka sang oracle tahu bahwa kartu as sekop adalah kartu ke-6 (atau penghitungan ke-5 dari nol) dan mengimplementasikan fungsi
PS: Lebih baik memikirkan algoritma Grover secara berbeda: Anda memiliki oracle yang mengimplementasikan fungsi boolean yang menghasilkan untuk kombinasi tunggal dari bit input, jika tidak menghasilkan nol, dan tugas Anda adalah menemukan kombinasi tersebut. Masalahnya memiliki kompleksitas yang sama dengan pencarian dalam daftar atau basis data yang tidak disortir, itulah sebabnya mengapa algoritma Grover biasanya digambarkan sebagai pencarian dalam database yang tidak disortir. Tetapi menerapkan algoritma untuk pencarian basis data dunia nyata memang menimbulkan pertanyaan yang berada di luar algoritma itu sendiri. Algoritma Grover hanya mencari apa yang diketahui oracle.1
sumber
Meskipun mungkin lebih mudah bagi kita untuk berpikir tentang fungsi oracle karena telah menghitung semua nilai-nilai ini, itu bukan apa yang dilakukannya. Dalam kasus yang Anda jelaskan, oracle memiliki 8 input yang mungkin (yaitu dikodekan dalam 3 (qu) bit), dan oracle melakukan semua perhitungan yang Anda butuhkan dengan cepat . Jadi, saat Anda mencoba mengevaluasi oracle untuk beberapa nilai , oracle mencari (dalam hal ini) kartu yang bernilai xx x sesuai dengan, dan kemudian memeriksa apakah kartu itu adalah kartu yang ditandai. Idenya adalah bahwa setiap kali Anda memanggil oracle, itu melewati proses itu sekali. Secara keseluruhan, Anda mengevaluasi fungsi beberapa kali sama dengan berapa kali Anda memanggil oracle. Tujuan dari setiap algoritma pencarian adalah untuk memanggil oracle itu beberapa kali mungkin.
Dalam hal ini terdengar sedikit melingkar (diberi input , temukan kartu mana yang sesuai dengan), ingatlah bahwa tabel pencarian Anda untuk x sesuai dengan kartu apa yang dapat dipesan yang merupakan pertanyaan pencarian yang berbeda, lebih sederhana, dan lebih cepat.x x
Perbedaan utama dalam contoh Anda dibandingkan dengan skenario penggunaan yang lebih realistis adalah:
Ruang pencarian biasanya besar. Tidak ada prospek realistis untuk mengkomputasi semua nilai. Memang, itulah tepatnya yang kami coba hindari.
Biasanya, kita tidak benar-benar mengatakan 'menemukan kartu as sekop'. Sebaliknya, ada yang non-sepele untuk dievaluasi untuk menguji apakah x adalah item yang 'ditandai' atau tidak. Fakta bahwa oracle dapat memakan waktu yang cukup lama untuk mengevaluasi, bahkan untuk satu entri, adalah apa yang membuat oracle menjadi bagian yang mahal untuk diimplementasikan (dan semua gerbang lainnya diberikan secara gratis) dan mengapa Anda perlu meminimalkan jumlah panggilan .f(x) x
Jadi, sungguh, cara pencarian klasik akan mengatasi masalah Anda adalah: pilih secara acak. Evaluasi y = f ( x ) . Jika y = 1 , kembalikan x , jika tidak ulangi. Sementara efek bersih dari f ( x ) adalah 'adalah input x 0 , entri yang ditandai?', Itu bukan perhitungan aktual yang dilakukannya.x y= f( x ) y= 1 x f( x ) x0
sumber
Pertanyaannya adalah akhirnya: "Apa gunanya mengeksekusi algoritma jika kita sudah mencari elemen untuk membangun oracle?"
Sementara seseorang membuat ulang oracle, itu mungkin bukan orang yang menggunakan oracle.
Kami bertanya pada oracle: apa jawaban yang sudah dimilikinya untuk pertanyaan yang sudah dimilikinya? Bahkan Mateus dan Omar akan menanyakan "oracle-for-a-alphabet-symbol" selama runtime, apa posisi simbol-simbolnya dalam string yang telah dikompilasi? Oracle akan memberikan jawaban atas pertanyaan kami setelah hanya satu kali konsultasi, tetapi dalam cerita ini, tidak bisa misalnya menuliskan jawaban sebagai string biner dan mengirimkannya kepada kami melalui saluran komunikasi klasik. Itu akan menyembunyikan jawabannya dalam superposisi bagi kita untuk menariknya keluar.
Saya membiarkan angan-angan atau kiasan melarikan diri dalam bagian berikutnya: kita tidak cukup mendengar jawaban pertama kali, dan kita harus meminta oracle untuk mengulangi jawaban yang sama berulang-ulang sampai kita yakin apa yang dikatakan oracle, kecuali kita mulai berhalusinasi dari kesalahan informasi dalam proses difusi jika kita bertanya terlalu banyak.
sumber
Mengingat oracle yang Anda berikan, pencarian itu memang tidak ada gunanya. Namun, oracle itu melewatkan titik algoritma Grover karena mencari kartu di setumpuk kartu bukanlah pencarian yang tidak terstruktur karena, seperti yang Anda nyatakan, Anda sudah mengetahui urutannya. Ergo, pencarian Anda terstruktur. Alasan oracle ini digunakan adalah karena itu menunjukkan bagaimana Grover dapat diterapkan tanpa harus membahas oracle yang akan membuat Grover berguna karena oracle tersebut akan lebih rumit daripada berharga. Oleh karena itu, ramalan yang lebih baik untuk menunjukkan manfaat Grover mungkin seperti:
Apa yang disiratkan oleh oracle ini adalah bahwa Anda memiliki pencarian 8-qubit di mana Anda mengambil empat qubit pertama dan menambahkannya ke empat qubit kedua dan membalikkan M jika penambahan menghasilkan 10 (1010 dalam biner). Perbedaan antara oracle ini dan yang Anda berikan adalah bahwa oracle ini menguji sebuah pola (apakah operan menambah 10) sedangkan Anda menguji kesetaraan (adalah indeks ini 5). Peramal ini jauh lebih sulit untuk dibangun tetapi memanfaatkan kekuatan sebenarnya dari Grover, yang pada dasarnya adalah pencarian dengan kekuatan besar di mana oracle Anda menentukan ruang pencarian.
sumber