2

このことを考慮:

セットA:1 2 3 4
セットB:3 4 5 6
セットC:4 5 6 7
セットD:1

Dを他の部分と比較して、結果として最も関連性の高い一連の数値を取得したいと思います。結果は次の順序になります:4(DはAと共通の番号を持ち、4はAにあり、BとCにもあるため)、3(DはAと共通の番号を持ち、3はAとBにあるため)、 2(DはAと共通の番号を持ち、2もAにあるため)、5、6、7。

PHP / MySQLでこれを効率的に行うためのアルゴリズムはありますか?車輪の再発明をしたくありません。また、データベースには最終的に膨大な数のセットが含まれることになります。

4

2 に答える 2

2

1つの例では、完全な仕様は作成されていません。たとえば、セットのコレクションも含まれている場合、あなたの答えはどのように異なりますか?

set E: 1 2 3
set F: 1   3

D?との交差が空でないセットの中で、3が最も頻繁に発生する値になります。だからここに私の仮定があります:

与えられたターゲットセット(D元の例では):

  1. 「重複するセット」(ターゲットセットとの交差が空でないセット)の値は、それらの重複するセットにない値よりも関連性が高くなります。
  2. ステートメント1の制約の下で、関連性は発生頻度によって決定されます。

元の例では、Aと重複してDいるため、ユニバース{1、2、3、4、5、6、7}は重複する{1、2、3、4}と重複しない{5、6、7}に分割されます。 。値の頻度は{1:2、2:1、3:2、4:3、5:2、6:2、7:1}です。これらの事実を組み合わせると、重複する周波数{1:2、2:1、3:2、4:3}と重複しない周波数{5:2、6:2、7:1}が得られ、4、3の順序が生成されます。 1、2の後に5、6、7が続きます(1に関連性を割り当てていないことに気付きました。意図的に行う場合は、最終的な順序からターゲットセットの値を削除する最後のステップになる可能性があります。)

私の調整した例では、周波数は{1:4、2:3、3:4、4:3、5:2、6:2、7:1}になります。これにより、重複する周波数{1:4、2:3、3:4、4:3}と重複しない周波数{5:2、6:2、7:1}が得られ、1、3、2の順序が生成されます。 4の後に5、6、7が続きます。

このアルゴリズムの擬似コードは次のとおりです。

  1. 初期化overlappinguniverseて空のセットにfrequencyし、空のハッシュにします。

  2. sセットのコレクション内の各セット(tターゲットセット以外):

    2.1。universeとの和集合sに設定universe

    2.2。sと交差する場合t、少なくとも1つの要素があります。

    2.2.1. Set `overlapping` to the union of `overlapping` and `s`
    

    2.3。の各要素eについてs

    2.3.1. If 'e' is a key in `frequency`
    
        2.3.1.1. Then increase the value (count) for `e` in `frequency` by 1
        2.3.1.2. Else initialize the value (count) for `e` in `frequency` to 1
    
  3. nonOverlappingとの差universeに設定overlapping

  4. 結果の最初の部分として、の要素をuniverse値で並べ替えます。frequency

  5. 結果に、の要素を追加します。nonOverlappingこれも、の値で並べ替えられますfrequency

(の要素を削除するつもりだった場合はt、4の後処理ステップとして実行します。)

于 2009-12-09T13:19:01.527 に答える
1

SQLでは、setsというテーブルがあり、2つの列があり、要素はe、セット名はsであると想定します。

select e,count(*) as c from sets where s in
(select s from sets where e in (select e from sets where s='D') group by s)
group by e order by c desc

説明:

(select e from sets where s='D')

グループDの要素を選択します。

(select s from sets where e in (select e from sets where s='D') group by s)

以前に選択したグループと共通のメンバーを持つすべてのグループを選択します。

次に、これらのセットからすべての要素を選択し、出現数順に並べます(joelが提案したように)

于 2009-12-09T13:49:38.083 に答える