Tìm kiếm bộ vân tay


11

Giả sử chúng ta có 10 người, mỗi người có một danh sách những cuốn sách yêu thích. Đối với một người nhất định X, tôi muốn tìm một tập hợp con đặc biệt của các cuốn sách X chỉ thích bởi X, tức là không có người nào khác thích tất cả các cuốn sách trong tập hợp con đặc biệt của X. Tôi nghĩ rằng tập hợp con đặc biệt này là một "dấu vân tay" duy nhất cho X.

Tôi sẽ đánh giá cao các đề xuất về một cách tiếp cận để tìm các bộ như vậy. (Trong khi điều này đọc giống như một vấn đề bài tập về nhà, nó có liên quan đến một vấn đề trong nghiên cứu sinh học của tôi mà tôi đang cố gắng giải quyết.)


1
Là phạm vi / số lượng sách có thể là hữu hạn? Nhận dạng "dấu vân tay" này có thể được thực hiện nhanh chóng không - vì mỗi cuốn sách được thêm vào danh sách yêu thích của một số người - hoặc bạn có được cung cấp bộ danh sách trước không?
Paresh

Câu trả lời:


6

Tôi giả sử bạn muốn dấu vân tay càng nhỏ càng tốt. Sau đó, đây là vấn đề Đánh bộ : Đối với mỗi người, hãy lập danh sách tất cả các sách mà X thích nhưng không phải bởi người này. Sau đó, mục tiêu là chọn ít nhất một cuốn sách từ mỗi danh sách. Vấn đề là NP-hard, vì vậy bạn không thể tìm thấy một thuật toán luôn giải quyết nó một cách tối ưu trong thời gian đa thức. Thuật toán tham lam có một trường hợp xấu nhất về mặt lý thuyết, nhưng thường hoạt động khá tốt trong thực tế. Nếu bạn muốn giải quyết nó một cách tối ưu, bộ giải Lập trình tuyến tính Integer sẽ có thể giải quyết các trường hợp lên tới 1000 hoặc có thể 10000 cuốn sách. Nếu bạn cung cấp thêm chi tiết về kích thước và cấu trúc của các phiên bản của bạn, chúng tôi có thể đề xuất các phương pháp khác.


+1 Tất nhiên là bạn đúng! :) Không khó để xây dựng các ví dụ mà thuật toán tham lam của tôi bỏ lỡ. Giáo sư.
Patrick87

OP: Cảm ơn bạn rất nhiều vì đã phản hồi - giải pháp thuật toán tham lam ban đầu đã đưa tôi đi đúng hướng. Tổng không gian tôi đang làm việc liên quan đến 100 cá nhân và 1000 "cuốn sách" - nếu điều này khả thi với phương pháp lập trình số nguyên, tôi rất muốn nghe thêm về nó.
Merbs

4

Đây không phải là một thuật toán đặc biệt thông minh, nhưng nó là đa thức và tôi nghĩ nó nên hoạt động. Lấy bất kỳ bộ. Đối với mỗi phần tử trong bộ này, hãy đếm số lượng bộ còn lại không chứa nó và nhớ bộ nào chứa nó. Chọn phần tử có số đếm cao nhất và làm lại số đếm cho các phần tử còn lại, bỏ qua các bộ thiếu phần tử bạn vừa chọn. Tiếp tục cho đến khi tất cả các bộ còn lại đã được loại bỏ khỏi xem xét.

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}

Tôi đã không suy nghĩ nhiều về điều này, nhưng theo trực giác, có vẻ như nó nên hoạt động. Ý tưởng là tham lam lấy yếu tố tiếp theo của dấu vân tay đặt vật phẩm bao gồm các bộ không che chắn nhất.


Xem câu trả lời của Falk Huffner, nơi anh ấy xác định chính xác vấn đề của bạn là vấn đề Đặt NP-Hard Hits. Có vẻ như câu trả lời của tôi đưa ra sự gần đúng tham lam thông thường cho vấn đề, điều này không tệ, nhưng cũng không tối ưu.
Patrick87

0

MM[book]fingerprint books

Hãy để tôi chứng minh về mã python:

%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

Mã in:

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

0

Đây là OP (không đăng ký khi gửi lần đầu, vì vậy bây giờ tôi không thể nhận xét đúng). Cảm ơn bạn rất nhiều vì đã phản hồi - giải pháp thuật toán tham lam ban đầu đã đưa tôi đi đúng hướng. Tổng không gian tôi đang làm việc liên quan đến 100 cá nhân và 1000 "cuốn sách" - nếu điều này khả thi với phương pháp lập trình số nguyên, tôi rất muốn nghe thêm về nó.


Tôi đã đặt bình luận của bạn để Falk sẽ được thông báo.
Merbs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.