Bagaimana seseorang dapat menemukan sudut dari unit cube di
terdekat dengan titik di dalam kubus?
Gunakan metrik L1, sehingga dalam 4d | - 0000 | = , | - 0001 | =
( di sebelah kanan) dan seterusnya.d + 1 R d x x ∑ x i x x 3 + x 2 + x 1 + ( 1 - x 0 ) x 0
Untuk formulasi alternatif, flip pertama > 1/2 dan urutkan, sehingga 1/2; dengan simetri, suatu algoritma untuk kasus ini dapat melakukan di dalam kubus.
Tentukan , .
Lalu kami ingin sudut dengan sudut terkecil .x i 0 ≤ x d - 1 ≤ … x 1 ≤ x
Dalam 4d misalnya, dengan x i
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0 or 0 0 1 1
0 1 * *
1 0 0 0
or 0 1 0 1
Namun dalam 5d, 6d ... pohon-pohon di sudut yang meningkat terlihat (bagi saya) semakin berantakan.
Heuristik untuk perkiraan-terdekat akan baik-baik saja.
Jawaban:
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]d S d+1 {0,1}d x S S
Bukti. Pertama mempertimbangkan kasus yang x memiliki koordinat sama untuk 1 / 2 .x 1/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 .a S aj a a x |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,b S j aj=0 bj=1 xj<1/2 bj b S b x xj>1/2 aj di 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 .a S a b a b S
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. QEDx 1/2 S
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.S x a aj=0 xj≤1/2 S x S d+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 ) .x d+1 O(d2) d d O(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) h i ai=1 d x a a O(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.d y1≤y2≤⋯≤yd d+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| Y yi ( 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/2 yi∈Y xi>1/2 yi∉Y Y x a(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 diarahkanY yi (h,c) h c Y Y→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+1 O(d) O(dlogd)
sumber
Ini sama dengan bertanya, di antara sekumpulan item d non-negatif berbobot, untuk himpunan bagian d + 1 dari berat total minimum. Seseorang dapat membentuk semua himpunan bagian dari item menjadi pohon, di mana induk dari subset dibentuk dengan menghapus item terberatnya (dengan ikatan yang diputus secara sewenang-wenang tetapi konsisten); solusi d + 1 akan membentuk subtree dari pohon ini yang terhubung pada akarnya (set kosong).d d+1 d+1
Jadi, seseorang dapat mencari pohon ini untuk item d + 1 terkecil dengan bentuk algoritma Dijkstra di mana kami mempertahankan antrian subset prioritas dan menghapusnya dalam urutan prioritas. Kami mulai dengan item yang dipilih pertama menjadi set kosong. Kemudian, pada setiap langkah, kami mempertahankan sebagai antrian algoritma sebagai antrian prioritas yang berisi anak berikutnya yang tidak dipilih untuk setiap subset yang sudah dipilih. Ketika kami memilih himpunan S , kami menghapusnya dari antrian prioritas, dan kami menambahkan ke antrian prioritas dua himpunan bagian baru: anak pertamanya (himpunan dibentuk dengan menambahkan elemen lebih berat berikutnya daripada elemen terberat di S ) dan saudara kandung berikutnya (himpunan dibentuk dengan menghapus elemen terberat dalam S dan menambahkan elemen lebih berat berikutnya yang sama).d+1 S S S
Setelah mengurutkan item berdasarkan bobotnya, mudah untuk mewakili setiap set secara implisit (sebagai elemen terberatnya ditambah pointer ke set induknya), menjaga berat total dari setiap set, dan menemukan anak pertama dan saudara kandung berikutnya yang dibutuhkan oleh algoritma dalam waktu konstan per set. Oleh karena itu total waktu didominasi oleh penyortiran awal dan oleh operasi antrian prioritas, yang mengambil total waktu O ( d log d ) .O(dlogd)
Bahkan ini dapat ditingkatkan, jika barang sudah diurutkan berdasarkan bobotnya. Lihat hubungan "anak pertama" dan "saudara berikutnya" dari algoritma sebelumnya sebagai anak-anak kiri dan kanan dalam pohon biner himpunan bagian. Pohon ini adalah heap-ordered (total berat meningkat dari induk ke anak) sehingga kami dapat menerapkan algoritma untuk menemukan node bobot minimum d + 1 dalam pohon biner yang di-heap [GN Frederickson. Algoritma yang optimal untuk seleksi dalam min-heap. Informasi dan Komputasi, 104: 197–214, 1993]. Total waktu, setelah langkah penyortiran, adalah O ( d ) .d+1 O(d)
sumber
Dalam praktiknya, bobot sering didistribusikan secara seragam, kira-kira ~ 1 2 3 ... Kemudian heuristik sederhana dimulai dengan:
yang d bit tunggal, misalnya 10000000 01000000 ... 00000001
⌈ l n 2 d ⌉ kombinasi bit-rendah 00000011 00000101 00000110 00000111
kombinasi beberapa bit dari ⌈ l n 2 d ⌉ berikutnya , mis. 00001001 00001010 00001100. Yang terbaik d + 1 dari kandidat ini bekerja cukup baik dalam praktiknya, setidaknya untuk yang kecil d .
sumber