0

次のアルゴリズムの問​​題に遭遇しました(src: http://www.careercup.com/question?id=15029889 )

問題: c = 'a'<br> w = “apple”<br> c は w をカバーしますが、w が c を含む場合。
c_set = {'a', 'b', 'c', 'g'}
w_set = {'apple', 'ibm', 'cisco', 'google'}
c_set は w_set をカバーします。 c_set のいくつかの c。
c_set と w_set が与えられた場合、w_set は c_set によってカバーされているか?
フォローアップ: w_set が固定されている場合、たとえば本、c_set がこの w_set をカバーしているかどうかを判断するにはどうすればよいですか?

考えられる解決策の 1 つは
、26 ビット (文字ごとに 1 ビット) を使用して w_set 内の各単語を表し、c_set
に対して同様のビットマスクを形成する場合、カバレッジをチェックする解決策は、
「c_set_bitmask & word_i_bitmask」を実行することです。
これが各単語でゼロでない場合、すべての単語をカバーしています。


私の質問は、 w_set が本などの静的 であることを考えると、これよりも良いことはできないかということです。

4

1 に答える 1

0

考えられる解決策の 1 つは、O(nlogk) ~ O(n) です。ここで、n = w_set 内の「文字」の総数、k = c_set 内の文字数です。max(k) = 26. したがって、k は一定であると仮定できます。

アルゴリズムはナイーブに見えますが、O(n) よりも優れたソリューションはありません。どのアルゴリズムでも、少なくとも w_set 内のすべての文字をスキャンして c_set に存在するかどうかを確認する必要があるためです。

c_set を辞書順でソートします。(O(klogk)) ~ 定数
w 内の各単語をスキャンし、c_set 内の文字のバイナリ検索を実行します。(O(nlogk)) ~ O(n)。

于 2013-10-15T05:58:09.587 に答える