Cari item yang setidaknya

11

Pertimbangkan set nilai (direpresentasikan sebagai array yang diurutkan tanpa duplikat, dan dengan ukuran yang diketahui (mis. Ukuran dapat diperoleh dalam O (1)). Nilai tersebut dapat diuji untuk kesetaraan dalam waktu O (1). Saya ingin untuk mendapatkan set nilai yang hadir dalam setidaknya k set yang berbeda di antara n .nkn

Algoritma yang jelas untuk melakukan ini adalah melalui semua set, menghitung jumlah kemunculan dari setiap nilai, dan mengembalikannya dengan jumlah yang lebih tinggi dari . Namun, dalam beberapa kasus, Anda dapat melakukan yang lebih baik: misalnya, ketika n = k = 2 dan ketika satu set S 1 jauh lebih kecil daripada set lainnya S 2 , lebih efisien untuk melihat semua item dari S 1 dan melakukan pencarian biner untuk masing-masing di S 2 : pendekatan pencarian biner biaya O ( | S 1 | log ( | S 2 |kn=k=2S1S2S1S2 sedangkan pendekatan naif menelan biaya O ( | S 1 | + | S 2 | ) yang lebih buruk ketika | S 1 | < < | S 2 | .HAI(|S1|catatan(|S2|))HAI(|S1|+|S2|)|S1|<<|S2|

Dengan pemikiran ini, dalam situasi apa kita bisa melakukan lebih baik daripada algoritma naif? (Jika ini adalah masalah yang terkenal, saya akan senang mengetahui nama biasanya dan memiliki referensi.)

a3nm
sumber
3
Ini datang di bawah kategori umum hasil "top-K", atau "pemukul berat". Yang terakhir lebih dekat dengan apa yang Anda cari. Sebagian besar pekerjaan dalam ruang ini berfokus pada set data besar dan batasan memori sublinear.
Suresh Venkat
9
Metode "mencari semua lokasi S1 dalam S2" yang Anda berikan dapat dibuat untuk dijalankan dalam waktu , selalu setidaknya sebagus linear naif algoritma waktu. HAI(|S1|catatan(|S2|/|S1|))
David Eppstein

Jawaban:

2

OK, saya pikir saya menemukan sesuatu yang relevan: makalah ini menyebutkan "masalah T-kejadian" di bagian III (hal. 2) yang merupakan masalah kita (di mana adalah apa yang kita sebut k ), tersembunyi di balik beberapa jargon khusus domain. Algoritma ScanCount yang mereka usulkan adalah pendekatan naif yang saya sarankan dalam pertanyaan saya. Algoritma MergeOpt adalah generalisasi dari trik pencarian biner. Proposal utama mereka (DivideSkip) adalah kombinasi dari trik pencarian biner ini dan trik yang berbeda (MergeSkip) untuk melewati beberapa nilai. Bahkan tampaknya secara eksperimental pendekatan cerdas jauh lebih baik daripada pendekatan naif (lihat kolom "Tidak ada filter" di halaman 8, filter tersebut heuristik untuk hal-hal khusus domain mereka).Tk

Ini dapat dikombinasikan dengan trik David Eppstein untuk membuat beberapa pencarian biner di lebih efisien, dan dengan ide menggunakan pencarian interpolasi daripada pencarian biner (sebuah ide dari makalah ini dari bidang yang sama ).S2

a3nm
sumber
1

Masalah Anda serupa dengan masalah penambangan data untuk menemukan item yang sering , juga dikenal sebagai pembelajaran aturan asosiasi . Jika saya mengerti dengan benar, masalah Anda mungkin berkurang hingga sering menemukan item kardinalitas 1 (yaitu, lajang) dengan dukungan > = k . Tentu saja, algoritma yang tersedia (seperti Apriori, Eclat, D-CLUB dll) untuk masalah ini juga memungkinkan menentukan itemset cardinality> 1.

Massimo Cafaro
sumber