これは、私が C++ で書いている diff ユーティリティ用です。
n 個の文字セット {"a"、"abc"、"abcde"、"bcd"、"de"}のリストがあります ( k = 5 種類の文字のアルファベットから取得)。文字セット {"a"、"bc"、"d"、"e"} の論理和によってリスト全体を構築できることを確認する方法が必要です。つまり、「b」と「c」は線形従属であり、文字の 1 つおきのペアは独立しています。
ビットいじりバージョンでは、上記の文字セットは {10000, 11100, 11111, 01110, 00011} として表されます。小さいセット {10000 、01100、00010、00001}。
言い換えれば、 {0,1} kのn 個の異なるビットベクトルのセットの「離散基底」を探していると思います。この論文では、一般的な問題は NP 完全であると主張していますが、幸いなことに、私は小さなケース ( k < 32)の解決策しか探していません。
基底を生成するための本当にばかげたアルゴリズムを思いつくことができます。例: k 2個の文字ペアのそれぞれについて、それらが依存していることを (O( n ) 検索によって) 実証してみてください。しかし、まだ見つけていない効率的なビット操作アルゴリズムがあるように感じます。誰もそれを知っていますか?
編集:結局のところ、この問題の解決策は本当に必要ありませんでした。しかし、簡単なビットいじりの解決策があるかどうかはまだ知りたいです。