Katakanlah kita memiliki 10 orang, masing-masing dengan daftar buku favorit. Untuk orang tertentu X, saya ingin menemukan subset khusus dari buku X yang hanya disukai oleh X, yaitu tidak ada orang lain yang menyukai semua buku dalam subset khusus X. Saya menganggap subset khusus ini sebagai "sidik jari" unik untuk X.
Saya akan menghargai saran tentang pendekatan untuk menemukan set tersebut. (Walaupun ini terbaca seperti masalah pekerjaan rumah, ini terkait dengan masalah dalam penelitian biologi yang saya coba selesaikan.)
algorithms
sets
edron79
sumber
sumber
Jawaban:
Saya berasumsi Anda ingin sidik jari menjadi sekecil mungkin. Maka ini adalah masalah Hitting Set : Untuk setiap orang, buat daftar semua buku yang disukai oleh X tetapi tidak oleh orang ini. Kemudian, tujuannya adalah untuk memilih setidaknya satu buku dari setiap daftar. Masalahnya adalah NP-hard, jadi Anda tidak bisa berharap untuk menemukan algoritma yang selalu menyelesaikannya secara optimal dalam waktu polinomial. Algoritma serakah memiliki teori buruk terburuk terikat, tetapi sering bekerja cukup baik dalam praktiknya. Jika Anda ingin menyelesaikannya secara optimal, pemecah Integer Linear Programming harus dapat memecahkan contoh hingga 1000 atau mungkin 10.000 buku. Jika Anda memberikan detail lebih lanjut tentang ukuran dan struktur instans Anda, kami dapat menyarankan pendekatan lain.
sumber
Ini bukan algoritma yang sangat pintar, tetapi jumlahnya banyak, dan saya pikir itu harus bekerja. Ambil satu set. Untuk setiap elemen dalam set ini, hitung jumlah set yang tersisa yang tidak mengandungnya dan ingat set mana yang berisi itu. Pilih elemen dengan jumlah tertinggi, dan ulangi jumlah untuk elemen yang tersisa, abaikan set yang tidak memiliki elemen yang baru saja Anda pilih. Lanjutkan sampai semua set yang tersisa dihilangkan dari pertimbangan.
Contoh: misalkan , , , dan . Kemudian kita memiliki jumlah , , dan . Kami memilih 1, menghilangkan set dan yang tidak mengandungnya; mengulangi penghitungan, kita memiliki dan . Kami memilih 2 sebagai elemen berikutnya, dan menghapus dari pertimbangan. Kita sekarang selesai, dan set "sidik jari" kami adalah . Sunting: untuk melengkapi contoh, Anda harus mendapatkan set sidik jari lainnya untuk keluar sebagai ,A={1,2,3} B={2,3,4} C={2,4,6} D={1,3,5} c1=2 c2=1 c3=1 B C c2=1 c3=0 D { 3 , 4 } { 6 } { 5 }{1,2} {3,4} {6} , dan .{5}
Saya belum banyak memikirkan hal ini, tetapi secara intuitif, sepertinya ini seharusnya berhasil. Idenya adalah dengan rakus mengambil sebagai elemen berikutnya dari sidik jari mengatur item yang mencakup set yang paling terbuka.
sumber
Mungkin saya tidak mengerti pertanyaan dengan benar (berdasarkan jawaban yang agak rumit), tetapi begini. Anda cukup membaca semua orang, dan membaca semua buku mereka, yang mereka sukai. Anda membuat struktur data (lebih disukai Hash Map ), di mana kuncinya adalah buku dan nilainya adalah daftar orang-orang yang menyukai buku ini. Anda mengisi struktur data ini dengan cara yang intuitif (untuk setiap pasangan orang / buku, Anda menambahkan orang ke daftar ). Kemudian Anda pergi melalui tombol peta dan di mana panjang daftar sama dengan satu, maka buku ini adalah salah satu dari orang tertentu ini.M [ b o o k ]M M[book]
fingerprint books
Biarkan saya menunjukkan pada kode python:
Kode dicetak:
sumber
Ini adalah OP (tidak mendaftar pada pengiriman awal, jadi sekarang saya tidak bisa berkomentar dengan benar). Terima kasih banyak atas umpan baliknya - solusi algoritma serakah yang asli membuat saya bergerak ke arah yang benar. Total ruang yang saya kerjakan menyangkut 100-an individu dan 1000-an "buku" - jika ini layak dengan pendekatan pemrograman bilangan bulat, saya ingin mendengar lebih banyak tentang hal itu.
sumber