"फिंगरप्रिंट" सेट खोजना


11

मान लीजिए कि हमारे पास 10 लोग हैं, जिनमें से प्रत्येक की पसंदीदा पुस्तकें हैं। किसी दिए गए व्यक्ति X के लिए, मैं केवल X द्वारा पसंद की गई X की पुस्तकों का एक विशेष सबसेट ढूंढना चाहूंगा, अर्थात ऐसा कोई दूसरा व्यक्ति नहीं है जो X की सभी विशेष उप-पुस्तकों में पसंद करता हो। मैं इस विशेष उपसमुच्चय को एक्स के लिए एक अनूठा "फिंगरप्रिंट" मानता हूं।

मैं इस तरह के सेट खोजने के लिए एक दृष्टिकोण पर सुझाव की सराहना करता हूं। (जबकि यह एक होमवर्क समस्या की तरह पढ़ता है, यह मेरे जीवविज्ञान अनुसंधान में एक समस्या से संबंधित है जिसे मैं हल करने की कोशिश कर रहा हूं।)


1
संभव पुस्तकों की सीमा / संख्या परिमित है? क्या यह "फ़िंगरप्रिंट" पहचान मक्खी पर की जा सकती है - जैसा कि प्रत्येक पुस्तक को किसी व्यक्ति की पसंदीदा सूची में जोड़ा जाता है - या क्या आपको पहले से सूचियों का सेट दिया गया है?
परेश

जवाबों:


6

मुझे लगता है कि आप चाहते हैं कि फिंगरप्रिंट यथासंभव छोटा हो। फिर यह हिटिंग सेट समस्या है: प्रत्येक व्यक्ति के लिए, एक्स द्वारा पसंद की गई सभी पुस्तकों की एक सूची बनाएं लेकिन इस व्यक्ति द्वारा नहीं। फिर, लक्ष्य प्रत्येक सूची में से कम से कम एक पुस्तक का चयन करना है। समस्या एनपी-हार्ड है, इसलिए आप एक एल्गोरिथ्म को खोजने की उम्मीद नहीं कर सकते हैं जो हमेशा बहुपदीय समय में इसे बेहतर ढंग से हल करता है। लालची एल्गोरिथ्म एक बुरा सैद्धांतिक सबसे खराब मामला है, लेकिन अक्सर व्यवहार में काफी सभ्य काम करता है। यदि आप इसे बेहतर तरीके से हल करना चाहते हैं, तो एक पूर्णांक रैखिक प्रोग्रामिंग सॉल्वर 1000 या 10000 से अधिक पुस्तकों के उदाहरणों को हल करने में सक्षम होना चाहिए। यदि आप अपने उदाहरणों के आकार और संरचना पर अधिक विवरण देते हैं, तो हम अन्य दृष्टिकोण सुझा सकते हैं।


निश्चित रूप से आप सही हैं! :) मेरे लालची एल्गोरिथ्म की याद आती है, जहां उदाहरणों का निर्माण करना मुश्किल नहीं है। उफ़।
पैट्रिक87

ओपी: प्रतिक्रिया के लिए बहुत बहुत धन्यवाद - मूल लालची एल्गोरिथ्म समाधान मुझे सही दिशा में जा रहा है। कुल अंतरिक्ष मैं 100 व्यक्तियों की "पुस्तकों" के बारे में चिंताओं पर काम कर रहा हूं - यदि यह पूर्णांक प्रोग्रामिंग दृष्टिकोण के साथ व्यवहार्य है, तो मुझे इसके बारे में और सुनना अच्छा लगेगा।
मर्स

4

यह एक विशेष रूप से चालाक एल्गोरिथ्म नहीं है, लेकिन यह बहुपद है, और मुझे लगता है कि इसे काम करना चाहिए। कोई भी सेट लें। इस सेट में प्रत्येक तत्व के लिए, शेष सेटों की संख्या को गिनें जिनमें यह शामिल नहीं है और याद रखें कि किन सेटों में यह शामिल है। तत्व को उच्चतम गणना के साथ चुनें, और शेष तत्वों के लिए मायने रखता है, उन सेटों को अनदेखा करना जिनमें आपके द्वारा चुने गए तत्व की कमी है। तब तक जारी रखें जब तक कि सभी शेष सेट विचार से समाप्त नहीं हो जाते।

उदाहरण: , B = { 2 , 3 , 4 } , C = { 2 , 4 , 6 } , और D = { 1 , 3 , 5 } । फिर हमारे पास c 1 = 2 , c 2 = 1 , और c 3 = 1 है={1,2,3}बी={2,3,4}सी={2,4,6}डी={1,3,5}सी1=2सी2=1सी3=1। हम 1 चुनते हैं, सेट और सी को नष्ट करते हैं जिसमें यह शामिल नहीं था; गिनती को फिर से करना, हमारे पास सी 2 = 1 और सी 3 = 0 है । हम अगले तत्व के रूप में 2 चुनते हैं, और डी को विचार से हटा देते हैं । अब हम कर रहे हैं, और हमारे "फिंगरप्रिंट" सेट { 1 , 2 } है । EDIT: उदाहरण पूरा करने के लिए, आपको { 3 , 4 } , { 6 } , और { 5 } के रूप में बाहर आने के लिए अन्य फिंगरप्रिंट सेट प्राप्त करने चाहिए ।बीसीसी2=1सी3=0डी{1,2}{3,4}{6}{5}

मैंने इसे बहुत सोचा नहीं है, लेकिन सहज रूप से, ऐसा लगता है कि इसे काम करना चाहिए। विचार यह है कि लालची को फिंगरप्रिंट के अगले तत्व के रूप में लेना है जो उस आइटम को सेट करता है जो सबसे अधिक खुला सेट को कवर करता है।


फ़ॉक हफ़नर का जवाब देखें, जहां वह आपकी समस्या को एनपी-हार्ड हिटिंग सेट समस्या के रूप में सही ढंग से पहचानता है। ऐसा प्रतीत होता है कि मेरा उत्तर समस्या के लिए सामान्य लालची सन्निकटन देता है, जो बुरा नहीं है, लेकिन या तो इष्टतम नहीं है।
पैट्रिक87

0

[]fingerprint books

मुझे अजगर कोड पर प्रदर्शित करें:

%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

कोड प्रिंट:

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

0

यह ओपी है (प्रारंभिक सबमिशन पर पंजीकरण नहीं किया, इसलिए अब मैं ठीक से टिप्पणी नहीं कर सकता)। प्रतिक्रिया के लिए बहुत बहुत धन्यवाद - मूल लालची एल्गोरिथ्म समाधान मुझे सही दिशा में जा रहा है। कुल अंतरिक्ष मैं 100 व्यक्तियों की "पुस्तकों" के बारे में चिंताओं पर काम कर रहा हूं - यदि यह पूर्णांक प्रोग्रामिंग दृष्टिकोण के साथ व्यवहार्य है, तो मुझे इसके बारे में और सुनना अच्छा लगेगा।


मैंने आपकी टिप्पणी को इस तरह रखा कि फॉक को सूचित किया जाएगा।
मर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.