“Parmak izi” setlerini bulma


11

Diyelim ki, her biri en sevdiğim kitapların listesi olan 10 kişi var. Belirli bir X için, X'in sadece X tarafından sevilen kitaplarının özel bir alt kümesini bulmak istiyorum, yani X'in özel alt kümesindeki tüm kitapları seven başka bir kişi yok. Bu özel altkümeyi X için benzersiz bir "parmak izi" olarak düşünüyorum.

Bu tür setleri bulmak için bir yaklaşım önerilerini takdir ediyorum. (Bu bir ev ödevi sorunu gibi görünse de, biyoloji araştırmalarımda çözmeye çalıştığım bir sorunla ilgilidir.)


1
Olası kitap sayısı / sayısı sınırlı mı? Bu "parmak izi" tanımlaması, her kitap bir kişinin favori listesine eklendikçe - anında yapılabilir mi yoksa önceden bir dizi liste veriliyor mu?
Paresh

Yanıtlar:


6

Parmak izinin mümkün olduğunca küçük olmasını istediğinizi varsayalım. O zaman bu Vuruş Seti problemidir: Her kişi için X tarafından sevilen ancak bu kişi tarafından değil tüm kitapların bir listesini yapın. Ardından amaç, her listeden en az bir kitap seçmektir. Sorun NP-zordur, bu nedenle polinom zamanında her zaman en iyi şekilde çözen bir algoritma bulmayı bekleyemezsiniz. Açgözlü algoritmanın kötü bir teorik en kötü durum sınırı vardır, ancak uygulamada genellikle oldukça iyi çalışır. En iyi şekilde çözmek istiyorsanız, bir Tamsayılı Doğrusal Programlama çözücüsü 1000 veya belki 10000 kitaba kadar olan örnekleri çözebilmelidir. Örneklerinizin boyutu ve yapısı hakkında daha fazla ayrıntı verirseniz, başka yaklaşımlar önerebiliriz.


+1 Tabii ki haklısın! :) Açgözlü algoritmamın kaçırdığı örnekler oluşturmak zor değil. Hata.
Patrick87

OP: Geri bildiriminiz için çok teşekkür ederim - orijinal açgözlü algoritma çözümü beni doğru yöne götürdü. Üzerinde çalıştığım toplam alan 100 kişi ve 1000 "kitap" ile ilgili.
Merbs

4

Bu özellikle akıllı bir algoritma değil, polinom ve bence işe yarayacak. Herhangi bir seti alın. Bu kümedeki her öğe için, içermeyen kalan kümelerin sayısını sayın ve hangi kümelerin içerdiğini hatırlayın. En yüksek sayıya sahip öğeyi seçin ve az önce seçtiğiniz öğeye sahip olmayan kümeleri yok sayarak kalan öğelerin sayılarını yeniden yapın. Kalan tüm setler göz ardı edilene kadar devam edin.

Örnek: let bir={1,2,3}B={2,3,4}C={2,4,6}D={1,3,5}c1=2c2=1c3=1BCc2=1c3=0D{1,2}{3,4}{6}{5} .

Bunu çok fazla düşünmedim, ama sezgisel olarak, işe yarayacak gibi görünüyor. Fikir, parmak izinin bir sonraki unsuru olarak en çok ortaya çıkarılan setleri kapsayan öğeyi hırsla ele almaktır.


Sorununuzu NP-Sert Vuruş Seti problemi olarak doğru bir şekilde tanımladığı Falk Huffner'ın cevabına bakın. Görünüşe göre cevabım sorun için her zamanki açgözlü yaklaşımı veriyor, ki bu kötü değil, aynı zamanda optimal değil.
Patrick87

0

MM[bÖÖk]fingerprint books bu kişiden biridir.

Python kodunda göstereyim:

%persons with books they like (it could also be a list or a set)
joe='ABCD'
andy='CDG'
frank='AHX'
anna='HAYZ'
matt='ACH'
%just transformation form variables, to names
names={joe:"Joe",andy:"Andy",frank:"Frank",anna:"Anna", matt:"Matt"}
%the map, from books to persons who like this book
books={}

%for each person
for p in names:
    %go through his liked books
    for book in p:
        %if book is already in the map, then append the person
        if book in books:
            books[book].append(names[p])
        else:
            %if not, then create a new book, and append the current person
            books[book]=[names[p]]

%create the fingerprint map (from person to books he likes)
fingerprint={}

%for each person create an empty list
for p in names:
    fingerprint[names[p]]=[]

%for each book in the map
for book in books:
    %if only one person likes this book, then it must be a part of his fingerprint
    if len(books[book])==1:
        fingerprint[books[book][0]].append(book)

print fingerprint

Kod yazdırılır:

{'Frank': ['X'], 'Matt': [], 'Andy': ['G'], 'Joe': ['B'], 'Anna': ['Y', 'Z']}

0

Bu OP (ilk başvuruda kayıt olmadı, bu yüzden şimdi düzgün yorum yapamam). Geri bildiriminiz için çok teşekkür ederim - orijinal açgözlü algoritma çözümü beni doğru yöne götürdü. Üzerinde çalıştığım toplam alan 100 kişi ve 1000 "kitap" ile ilgili.


Yorumunuzu Falk'a bildirilecek şekilde yerleştirdim.
Merbs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.