Waktu O ( d 3 log d )O(d3logd)
lemma: Perbaiki x ∈ [ 0 , 1 ] d . Lalu ada himpunan S yang berisi d + 1 sudut { 0 , 1 } d yang paling dekat dengan x dan sedemikian sehingga S terhubung (artinya subgraf dari hypercube yang diinduksi oleh S terhubung).x∈[0,1]dSd+1{0,1}dxSS
Bukti.
Pertama mempertimbangkan kasus yang x memiliki koordinat sama untuk 1 / 2 .x1/2
Mengingat setiap sudut sebuah di S , membalik koordinat suatu j dari suatu tidak akan meningkatkan jarak dari suatu ke x jika | a j - x j | ≥ 1 / 2 . aSajaax|aj−xj|≥1/2
Pertimbangkan dua sudut a , b dalam S yang berbeda setidaknya dalam satu koordinat j , dan asumsikan WLOG bahwa a j = 0 dan b j = 1 . Jika x j < 1 / 2 kemudian membalik b j di b memberikan titik lain di S (karena mengurangi jarak dari b ke x ). Atau, jika x j > 1 / 2 kemudian membalik sebuah ja,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajdi sebuah memberikan titik di S . Mengulangi proses ini untuk setiap berbeda koordinat dalam sebuah dan b memberikan jalan yang menghubungkan suatu dan b dalam S .aSababS
Jika x memiliki koordinat sama untuk 1 / 2 , kemudian, dalam memilih S , ikatan istirahat antara titik yang berjarak sama dengan mendahulukan mereka dengan lebih nol koordinat. Maka argumen yang sama akan berhasil. QEDx1/2S
Oleh lemma, Anda dapat menggunakan Dijkstra seperti algoritma untuk menemukan S . Mulailah dengan sudut yang paling dekat dengan x ( a dengan a j = 0 jika x j ≤ 1 / 2 ). Kemudian berulang kali menambah S sudut yang terdekat dengan x antara mereka yang berdekatan dengan beberapa titik dalam S . Berhenti ketika d + 1 poin telah ditambahkan. Sxaaj=0xj≤1/2SxSd+1
Naif (menggunakan min-heap untuk menemukan titik terdekat di samping x di setiap iterasi), saya kira ada d + 1 iterasi, dan setiap iterasi membutuhkan O ( d 2 ) bekerja untuk menghasilkan d tetangga dari node ditambahkan (masing-masing yang memiliki representasi ukuran d ), memberikan run time O ( d 3 log d ) .xd+1O(d2)ddO(d3logd)
Waktu O ( d 2 log d )O(d2logd)
Mewakili setiap sudut sebuah implisit sebagai pasangan ( h , d ) , di mana h adalah hash dari himpunan indeks i sehingga sebuah i = 1 , dan d adalah jarak dari x ke sebuah . Dari sudut tertentu a , pasangan untuk semua sudut tetangga dapat dihasilkan dalam waktu O ( d ) (total). Ini membawa run time ke O ( d 2 log d ) .a(h,d)hiai=1dxaaO(d)O(d2logd)
Lebih cepat?
Untuk mempermudah diskusi, mari kita ulangi masalahnya sebagai berikut. Dengan urutan d angka non-negatif y 1 ≤ y 2 ≤ ⋯ ≤ y d , cari himpunan himpunan biaya minimum d + 1 , di mana biaya himpunan bagian adalah jumlah dari angka-angka di dalamnya. dy1≤y2≤⋯≤ydd+1 (Untuk melihat hubungan dengan masalah sebelumnya, mengambil y i = | x i - 1 / 2 | ; maka setiap bagian Y dari y i 's berkorespondensi ke sudut sebuahyi=|xi−1/2|Yyi( Y ) dari hypercube, di mana sebuah i ( y ) adalah 1 jika ( x i ≤ 1 / 2 dan y i ∈ Y ) atau ( x i > 1 / 2 dan y i ∉ Y ); dan biaya Y adalah jarak dari x ke a ( y ) .)a(y)ai(y)xi≤1/2yi∈Yxi>1/2yi∉YYxa(y)
Inilah ide umum untuk algoritma yang lebih cepat. Mungkin seseorang bisa mengetahui cara membuatnya bekerja.
Tentukan grafik yang diarahkan implisit di mana setiap node adalah subset Y dari y i 's. Node mulai adalah set kosong. Mewakili node secara implisit sebagai pasangan ( h , c ) di mana h adalah hash dari subset dan c adalah biayanya. Untuk setiap himpunan bagian Y , tentukan himpunan bagian himpunan tetangga entah bagaimana sehingga (i) jika Y → Y ′ adalah tepi terarah maka biaya ( Y ′ ) ≥ biaya ( Y ) , dan (ii) untuk setiap himpunan bagian Y ′ , ada tepi diarahkanYyi(h,c)hcYY→Y′(Y′)≥(Y)Y′Y → Y ′ dari beberapa himpunan bagian Y di mana biaya ( Y ) ≤ biaya ( Y ′ ) . Kemudian jalankan Dijkstra pada grafik implisit ini mulai dari simpul awal.Y→Y′Y(Y)≤(Y′)
Pilih ujung-ujungnya (entah bagaimana) sehingga (i) dan (ii) keduanya bertahan, dan jumlah derajat dari simpul d + 1 termurah adalah O ( d ) . (Ini selalu mungkin, misalnya, mengambil sisi-sisinya menjadi pohon-pohon di jalur pohon terpendek yang berakar di awal). Tetapi bisakah seseorang mendefinisikan grafik semacam itu tanpa pengetahuan a-priori tentang pohon jalur terpendek? Jika demikian, ini dapat menyebabkan algoritma O ( d log d ) -time (?).d+1O(d)O(dlogd)