The Hamming jarak antara dua string dengan panjang yang sama adalah jumlah posisi di mana yang sesuai simbol yang berbeda.
Membiarkan P
menjadi string biner panjang n
dan T
menjadi string biner panjang 2n-1
. Kita dapat menghitung n
jarak Hamming antara P
dan setiap n
substring T
dengan panjang dari kiri ke kanan dan menempatkannya ke dalam array (atau daftar).
Contoh urutan jarak Hamming
Biarkan P = 101
dan T = 01100
. Urutan jarak Hamming yang Anda dapatkan dari pasangan ini adalah 2,2,1
.
Definisi kedekatan
Sekarang mari kita perhatikan dua urutan jarak Hamming tersebut. Katakan x = (0, 2, 2, 3, 0)
dan y = (2, 1, 4, 4, 2)
sebagai contoh. Kami mengatakan bahwa x
dan y
adalah close
jika y <= x <= 2*y
atau jika x <= y <= 2*x
. Di sini, perkalian skalar dan ketidaksetaraan diambil secara elemen. Artinya, untuk dua urutan A
dan B
, A <= B iff A[i] <= B[i]
untuk semua indeks i
.
Perhatikan bahwa urutan jarak Hamming membentuk urutan parsial dengan cara membandingkannya. Dengan kata lain, banyak pasangan urutan tidak lebih besar atau sama atau lebih kecil dari atau sama satu sama lain. Sebagai contoh (1,2)
dan (2,1)
.
Jadi menggunakan contoh di atas, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
tetapi (0, 2, 2, 3, 0)
tidak lebih besar dari (2, 1, 4, 4, 2)
. Juga (2, 1, 4, 4, 2)
tidak lebih kecil dari atau sama dengan 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Akibatnya x
dan y
tidak dekat satu sama lain.
Tugas
Untuk meningkatkan n
mulai dari n=1
, pertimbangkan semua pasangan yang mungkin dari string biner P
panjang n
dan T
panjang 2n-1
. Ada 2^(n+2n-1)
pasangan seperti itu dan karenanya banyak urutan jarak Hamming. Namun banyak dari sekuens tersebut akan identik. Tugasnya adalah menemukan ukuran rangkaian urutan Hamming terbesar sehingga tidak ada dua urutan yang saling berdekatan.
Kode Anda harus menampilkan satu nomor per nilai n
.
Skor
Skor Anda secara umum adalah tertinggi yang dicapai n
kode Anda di komputer saya dalam 5 menit (tapi baca terus). Waktunya adalah total waktu berjalan, bukan hanya waktu untuk itu n
.
Untuk memberikan skor untuk jawaban yang tidak optimal, karena menemukan jawaban yang optimal kemungkinan akan sulit, kita akan membutuhkan sistem penilaian yang agak halus. Skor Anda adalah nilai tertinggi di n
mana tidak ada orang lain yang memposting jawaban yang benar lebih tinggi untuk ukuran apa pun yang lebih kecil dari sama dengan ini. Misalnya, jika Anda menghasilkan 2, 4, 21
dan orang lain mengeluarkan 2, 5, 15
maka Anda hanya akan skor 1
karena orang lain memiliki jawaban yang lebih baik n = 2
. Jika Anda menghasilkan 2, 5, 21
maka Anda akan mencetak skor 3
tidak peduli apa yang orang lain hasilkan karena semua jawaban itu optimal. Jelas jika Anda memiliki semua jawaban optimal maka Anda akan mendapatkan skor untuk tertinggi yang n
Anda posting. Namun, bahkan jika jawaban Anda tidak optimal, Anda masih bisa mendapatkan skor jika tidak ada orang lain yang bisa mengalahkannya.
Contoh jawaban dan contoh yang berhasil
(Jawaban ini belum dicentang. Verifikasi independen akan diterima dengan penuh syukur.)
Terima kasih untuk produk ETH:
- n = 1 memberi 2.
- n = 2 memberi 5.
- n = 3 memberi 21.
Mari kita lihat n = 2
lebih detail. Dalam hal ini daftar lengkap urutan jarak Hamming (diwakili oleh tuple di sini) adalah:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Kita bisa melihat bahwa (0,0)
itu tidak dekat dengan tuple lainnya. Bahkan jika kita mengambil (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
maka tidak satupun dari mereka tupel yang dekat dengan apa pun yang lain. Ini memberi skor 5
untuk n = 2
.
Untuk n = 3
daftar lengkap urutan jarak Hamming yang berbeda adalah:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
Dari 48
sekuens tersebut, kita dapat memilih satu set ukuran 21
sehingga tidak ada pasangan dalam set yang dekat satu sama lain.
Bahasa dan perpustakaan
Anda dapat menggunakan bahasa dan perpustakaan yang tersedia yang Anda suka. Jika memungkinkan, alangkah baiknya untuk dapat menjalankan kode Anda, jadi harap sertakan penjelasan lengkap tentang cara menjalankan / kompilasi kode Anda di Linux jika memungkinkan.
Mesin saya Pengaturan waktu akan dijalankan pada mesin 64-bit saya. Ini adalah instalasi ubuntu standar dengan RAM 8GB, Prosesor Delapan-Core AMD FX-8350 dan Radeon HD 4250. Ini juga berarti saya harus dapat menjalankan kode Anda.
Jawaban utama
- Skor 4 untuk 2, 5, 21, 83, 361 oleh Christian Sievers. C ++
- Skor 5 untuk 2, 5, 21, 83, 372 oleh fəˈnɛtɪk. Javascript
Jawaban:
C ++ menggunakan perpustakaan igraph
Terima kasih atas kesempatan yang bagus untuk mempelajari perpustakaan baru!
Program ini sekarang menghitung dengan
2, 5, 21, 83, 361
cepat. Anda dapat mengontrol pencetakan node denganPRINTNODES
konstanta.Grafik yang digunakan memiliki tepi ekstra antara node yang sesuai dengan vektor jarak di mana satu dekat (tetapi tidak sama) dengan yang lainnya terbalik. Yang mempercepat perhitungan, dan setiap set independen yang ditemukan tentu saja juga salah satu dari grafik asli. Juga, bahkan jika itu tidak sepenuhnya ditegakkan, set independen yang dihitung ditutup dalam pembalikan. Saya percaya selalu ada set independen maksimal dengan properti itu. Setidaknya ada satu untuk
n<=4
. (Saya yakin saya dapat menunjukkan bahwa 83 itu optimal.)Untuk mengkompilasi di debian, instal
libigraph0-dev
dan lakukang++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o ig ig.cpp -ligraph
.Deskripsi lama:
Perpustakaan igraph memiliki fungsi untuk menghitung ukuran maksimal dari set vertex independen dari grafik. Ini dapat menangani masalah ini hingga
n=3
kurang dari satu detik dan tidak berakhir dalam beberapa harin=4
.Jadi yang saya lakukan adalah menguraikan grafik menjadi komponen yang terhubung, dan biarkan perpustakaan menangani yang kecil (kurang dari
MAXDIRECT
node). Untuk komponen lain, saya memilih titik dan menghapusnya. Dalam kasus terbaik, ini membagi grafik menjadi beberapa komponen, tetapi biasanya tidak. Bagaimanapun, komponen (mungkin hanya satu) lebih kecil, dan kita dapat menggunakan rekursi.Jelas pemilihan titik penting. Saya hanya mengambil satu tingkat maksimal. Saya menemukan bahwa saya mendapatkan hasil yang lebih baik (tetapi hanya untuk
n=4
) ketika saya menggunakan daftar simpul terbalik. Itu menjelaskan bagian ajaib dariconstruct
fungsi tersebut.Mungkin bernilai sambil meningkatkan seleksi. Tetapi tampaknya lebih penting untuk mempertimbangkan kembali node yang dihapus. Saat ini, saya tidak pernah melihat mereka lagi. Beberapa dari mereka mungkin tidak terhubung ke node yang dipilih. Masalahnya adalah saya tidak tahu node mana yang membentuk set independen. Untuk satu, menghapus node menambah jumlah node yang tersisa. Itu bisa ditangani dengan melampirkan attribtes kepada mereka. Tapi lebih buruknya, perhitungan angka kemerdekaan hanya memberikan angka ini. Alternatif terbaik yang ditawarkan perpustakaan adalah untuk menghitung semua set independen terbesar, yang lebih lambat (berapa banyak tampaknya tergantung pada ukuran grafik). Namun, ini sepertinya cara yang harus segera ditempuh. Jauh lebih samar, saya juga berpikir mungkin berguna untuk mempertimbangkan jika kita dapat menggunakan cara khusus grafik didefinisikan.
Kasus
n=6
mungkin dapat dijangkau (sama sekali, tidak harus dalam 5 menit) jika saya mengganti rekursi dengan loop menggunakan antrian untuk komponen yang tersisa.Saya menemukan hal menarik untuk melihat komponen grafik. Sebab
n=4
, ukurannya adalah168, 2*29, 2*28, 3, 4*2, 4*1
. Hanya yang terbesar tidak bisa ditangani secara langsung.Sebab
n=5
, ukurannya adalah1376, 2*128, 2*120, 119, several <=6
.Saya perkirakan ukuran ganda tersebut sesuai dengan grafik isomorfik, tetapi menggunakan ini tampaknya tidak bernilai sementara karena selalu ada satu komponen yang mendominasi terbesar:
Sebab
n=6
, komponen terbesar berisi11941
node (dari total15425
), dua komponen terbesar berikutnya memiliki ukuran596
.Sebab
n=7
, angka-angka ini adalah107593 (125232), 2647
.sumber
g++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o sievers sievers.cpp -ligraph
. Itu penting di mana-ligraph
.set
saya gunakan untuk menghindari duplikat, tapi saya bahkan tidak berpikir tentang pemesanan mereka ketika saya menulis kode itu. Loop dalam mulaii+1
hanya menghindari melihat pasangan dan juga versi bertukar yang tidak diperlukan, dan merupakan cara termudah untuk menghindari loop (tepi(a,a)
). Itu tidak tergantung pada urutan di mana node datang, saya tidak peduli apakah saya mendapatkan(a,b)
atau(b,a)
.Javascript, Seq: 2,5,21,
8183,37267,349Berhasil meningkatkan nilai untuk 4 dengan menggunakan penghapusan acak elemen pada awal pencarian saya. Anehnya, menghapus 20 elemen dengan lebih dari 6 koneksi lebih cepat daripada menghapus 5 elemen dengan lebih dari 8 koneksi ...
Urutan ini mungkin tidak optimal untuk 5 dan mungkin tidak optimal untuk 4. Tidak ada node yang dekat dengan yang lain di set.
Kode:
Cobalah online!
Cuplikan yang dapat ditambahkan akhir program untuk menunjukkan apa urutan jarak Hamming setiap urutan jarak Hamming yang dipilih
Penjelasan:
Pertama, kode menghasilkan semua jarak hamming unik dari substring.
Selanjutnya, kode mengubah daftar ini menjadi grafik yang tidak terarah
Akhirnya, kode siklus melalui grafik ini, menghapus simpul dengan koneksi paling banyak setiap siklus sebelum mengembalikan node yang sekarang akan memiliki koneksi lebih sedikit daripada maksimum saat ini. Setelah selesai dengan siklus ini, ia menghasilkan jumlah node yang tersisa
Set:
1:
2:
3:
4:
5:
sumber