การค้นหาชุด "ลายนิ้วมือ"


11

สมมติว่าเรามี 10 คนแต่ละคนมีรายการหนังสือที่ชื่นชอบ สำหรับบุคคลที่ได้รับ X ฉันต้องการค้นหาชุดย่อยพิเศษของหนังสือของ X ที่ X ชื่นชอบโดย X เท่านั้นนั่นคือไม่มีบุคคลอื่นที่ชอบหนังสือทั้งหมดในชุดย่อยพิเศษของ X ฉันคิดว่าเซตย่อยพิเศษนี้เป็น "ลายนิ้วมือ" ที่ไม่ซ้ำกันสำหรับ X

ฉันขอขอบคุณข้อเสนอแนะเกี่ยวกับวิธีการค้นหาชุดดังกล่าว (แม้ว่าสิ่งนี้จะอ่านได้เหมือนปัญหาการบ้าน แต่เกี่ยวข้องกับปัญหาในการวิจัยทางชีววิทยาที่ฉันพยายามแก้ไข)


1
ช่วง / จำนวนหนังสือที่เป็นไปได้มี จำกัด หรือไม่ สามารถระบุเอกลักษณ์ "ลายนิ้วมือ" นี้ได้ทันที - ในขณะที่หนังสือแต่ละเล่มถูกเพิ่มลงในรายการโปรดของบางคน - หรือคุณได้รับชุดรายการล่วงหน้าหรือไม่?
Paresh

คำตอบ:


6

ฉันคิดว่าคุณต้องการให้ลายนิ้วมือเล็กที่สุดเท่าที่จะทำได้ นี่คือปัญหาชุด Hitting : สำหรับแต่ละคนให้ทำรายการหนังสือทั้งหมดที่ X ชอบ แต่ไม่ใช่คนคนนี้ จากนั้นเป้าหมายคือการเลือกหนังสืออย่างน้อยหนึ่งเล่มจากแต่ละรายการ ปัญหาคือ NP-hard ดังนั้นคุณไม่สามารถคาดหวังได้ว่าจะหาอัลกอริทึมที่สามารถแก้ปัญหาได้ดีที่สุดในเวลาพหุนาม อัลกอริทึมโลภมีขอบเขตกรณีเลวร้ายที่สุดทางทฤษฎีที่ไม่ดี แต่มักจะใช้งานได้ค่อนข้างดีในทางปฏิบัติ หากคุณต้องการแก้ปัญหาอย่างเหมาะสมที่สุดตัวแก้ปัญหาการเขียนโปรแกรมเชิงเส้นของ Integer ควรจะสามารถแก้ปัญหาอินสแตนซ์ของหนังสือได้มากถึง 1,000 หรือ 10,000 เล่ม หากคุณให้รายละเอียดเพิ่มเติมเกี่ยวกับขนาดและโครงสร้างของอินสแตนซ์ของคุณเราสามารถแนะนำวิธีอื่น ๆ


+1 แน่นอนคุณพูดถูก! :) ไม่ยากที่จะสร้างตัวอย่างที่อัลกอริทึมความโลภของฉันคิดถึง อุ่ย
Patrick87

OP:ขอบคุณมากสำหรับความคิดเห็น - โซลูชันอัลกอริทึมโลภดั้งเดิมทำให้ฉันไปในทิศทางที่ถูกต้อง พื้นที่ทั้งหมดที่ฉันทำงานเกี่ยวกับบุคคล 100 คนและ "หนังสือ" 1,000 เล่ม - ถ้าเป็นไปได้ด้วยวิธีการเขียนโปรแกรมจำนวนเต็มฉันชอบที่จะได้ยินมากขึ้นเกี่ยวกับเรื่องนี้
Merbs

4

นี่ไม่ใช่อัลกอริทึมที่ฉลาดเป็นพิเศษ แต่เป็นพหุนามและฉันคิดว่ามันน่าจะใช้ได้ ใช้ชุดใด ๆ สำหรับแต่ละองค์ประกอบในชุดนี้ให้นับจำนวนชุดที่เหลือซึ่งไม่ได้มีอยู่และจำได้ว่าชุดใดมีอยู่ เลือกองค์ประกอบที่มีจำนวนสูงสุดและทำซ้ำองค์ประกอบที่เหลือโดยไม่สนใจชุดที่ขาดองค์ประกอบที่คุณเพิ่งเลือก ทำต่อไปจนกว่าชุดที่เหลือทั้งหมดจะถูกตัดออกจากการพิจารณา

A={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}

ฉันไม่ได้คิดอะไรมากมาย แต่สังหรณ์ใจดูเหมือนว่ามันจะใช้ได้ดี ความคิดคือการโลภอย่างเอาเป็นเอาตายเป็นองค์ประกอบถัดไปของลายนิ้วมือตั้งค่ารายการที่ครอบคลุมชุดเปิดมากที่สุด


ดูคำตอบของ Falk Huffner ซึ่งเขาระบุปัญหาของคุณได้อย่างถูกต้องว่าเป็นปัญหาชุด NP-Hard Hitting ดูเหมือนว่าคำตอบของฉันจะให้การประมาณความโลภตามปกติซึ่งไม่เลว แต่ก็ไม่เหมาะสมเช่นกัน
Patrick87

0

MM[book]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

นี่คือ OP (ไม่ได้ลงทะเบียนในการส่งครั้งแรกดังนั้นตอนนี้ฉันไม่สามารถแสดงความคิดเห็นได้อย่างถูกต้อง) ขอบคุณมากสำหรับความคิดเห็น - โซลูชันอัลกอริทึมโลภดั้งเดิมทำให้ฉันไปในทิศทางที่ถูกต้อง พื้นที่ทั้งหมดที่ฉันทำงานเกี่ยวกับบุคคล 100 คนและ "หนังสือ" 1,000 เล่ม - ถ้าเป็นไปได้ด้วยวิธีการเขียนโปรแกรมจำนวนเต็มฉันชอบที่จะได้ยินมากขึ้นเกี่ยวกับเรื่องนี้


ฉันแสดงความคิดเห็นของคุณเพื่อที่จะได้รับการแจ้งเตือน Falk
Merbs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.