51908


数の集合同士で最も被っているデータの集合を知りたいです。

上手く言葉で説明できないので例を挙げて説明させていただきます。

例えば、会社のイベントの参加者の比較をし、一番参加者が被っている会社を知りたいとします。  
A社の主催者のA1,A2,A3...(平均100個)のイベントがあったとして、これと同じような形式のイベントがB,C...社(1000社以上)にもあります。  
そして一つのイベント毎に平均1000人ぐらいの参加者がいます。そして参加者はすべてのイベントに参加可能です。  
また参加者毎の一意な識別番号は入手出来ています。

この時にA社のイベントに参加している参加者層と最も被っている別の会社が何処かを求めたいです。

また可能なら同じ会社のイベントに複数参加した者には、その会社の常連として考えて何かしらの重みを持たせたいです。ただ具体的な方法はイメージ出来ていません。

言語はRubyで書いており、データはSqliteで管理しています。

この様な場合、どの様なアルゴリズム、ないしはツールを使って求めればいいのでしょうか？  
抽象的な質問で申し訳ないのですが、ご回答いただけると助かります。


CC BY-SA 4.0
2018-12-16T09:58:31.363
51255
2019-01-12T06:51:15.660
2019-01-11T03:20:39.470
3060
15186
question
ruby sqlite
数の集合同士で最も被っているデータの集合を知りたい


単に参加者の重複を知りたければSet, 重複に重みを持たせたければHashを使います。

[code]

    a = [['佐藤', '田中', '遠藤'],
         ['佐藤', '中田', '鈴木'],
         ['佐藤', '遠藤', '松本']]
    
    # イベントの参加者データから、延べ人数のデータを出力する
    def calc_total_number(event_data)
        res = {}
        event_data.each do |e|
            e.each do |person|
                res[person] = res.fetch(person, 0) + 1
            end
        end
        return res
    end
    
    print calc_total_number(a)
    
[/code]

実行結果

[code]

    {"佐藤"=>3, "田中"=>1, "遠藤"=>2, "中田"=>1, "鈴木"=>1, "松本"=>1}
    
[/code]


CC BY-SA 4.0
2019-01-12T06:51:15.660
51908
2019-01-12T06:51:15.660
31654
51255
answer