一組のブール値を他の多くのブール値と比較する方法(順序問題)

私は余暇に取り組んでいるプロジェクトに問題があります。私はGoogle App Engine(Java版)を使用していますが、この質問はそのプラットフォームに固有の問題ではなく、問題を解決できる場合は他の言語/プラットフォームも検討します。

以下は、この問題を示しています。

何千ものレシピを持つデータストアと、各レシピの原料があるとします。 (このイラストレーションのために、測定値は忘れてください)私は手元にある成分のリストを入力し、少なくともXX%の成分を持つすべてのレシピを素早く取り出すことができるようにしたいと思います75%)を得た。私はいくつかの正確さとスピードのためにいくつかの結果を犠牲にしても構わないが、ある程度の精度を求めたい。私は「迅速な結果」を得た後、より完全な比較をすることができます。

ソリューションの私の試み:レシピのデータベースを分析し、200の一般的な食物成分(卵、小麦粉、塩、砂糖、ローズマリーなど)のリストを作成します。レシピのほとんどすべての成分は、このマスターリストに含まれています:

Common Food Ingredients: [ eggs , flour , salt , sugar , cinnamon ... ]

次に、私は個々のレシピを調べ、成分をこのマスターリストと比較し、各レシピに対して200個のブール値を設定します。

Recipe #106: [ T , T , F , T , F ... ]
Recipe #107: [ F , T , T , T , F ... ]

私はレシピにこの情報を保存します。 (これまでは、すべてのデータ準備作業を行っていました。これは、私が世界中で行っています。)

さて、私は手元にある食材のリストを入力します。私はマスターリストと同じ比較を行います:

My ingredients on hand: [ F , F , T , T , F ... ]

そして、これは私が立ち往生したところです。このブール値のセットとレシピのセットを迅速に比較するには、どうすれば成分の75%以上を持つレシピを特定できるでしょうか?

Or (and this would be the holy grail), during the data preparation, instead of storing the set of booleans themselves with each recipe, is there a calculation I can perform that will give me a single value I can later filter off of? (E.g., "SELECT * FROM recipes WHERE master_list_boolean_metric <= 29")

それとも私はこれについて間違った方法をとっていますか?私が避けたいのは、各レシピと私の "手持ちの"成分のリストの間で、成分ごとに成分をゆっくりと比較することです。

または、おそらくこれを迅速に行うことはできないでしょうか?

0

1 答え

BitSet を使用してください。

各成分を1ビットとして保存し、あなたが持っている成分とANDしてから、カーディナリティ()をフィルタリングします。

1
追加された
これを行うことの難しさは、データストアから各レシピのビットセット(何千も成長しているもの)を取り出し、ループ内でそれぞれの成分のBitSetと比較する必要があることです。私はこれが、どれくらい多くのレシピを持っているかによって、パフォーマンスが集中する可能性があると思います。
追加された 著者 coffee dude,