String
にすべての一意の文字が含まれているかどうかを判断する方法の実装には、時間の複雑さがあります。平均ケースBig Oとソートの影響
基本、強引、アプローチが見文字のHashSet
を維持する時にString
1文字を反復処理することです。反復の各文字について、Set
に既にそれが含まれているかどうか確認し、そうであればfalse
を返します。 String
全体が検索された場合は、true
を返します。これは最悪の場合の複雑さとしてO(n)
になります。平均的なケースは何でしょうか? O(n/2)
?
String
をchar
の配列にソートすることで最適化しようとすると、それは多かれ少なかれ効率的でしょうか?並べ替えは通常O(n log n)
で、O(n)
より悪くなりますが、ソートされたString
は、重複した文字をはるかに早く検出することができます(特に長い文字列の場合)。
最悪のケースはO(n^2 log n)
ですが、平均的なケースが良いですか?もしそうなら、それは何ですか?
簡単なコメントとして、 'O(n/2)'のようなものはありません。定数を削除するためには常に丸められます。 – Shirkam
答えは「文字」と呼ばれるものによって決まります。あなたが256文字を言うなら、長さ257以上の任意の文字列に対しては答えはイエスであるので、256要素以下しかチェックする必要はないので、複雑さはO(1)です。キャラクタセットのサイズが「非常に大きい」(入力のサイズよりもはるかに大きい)場合、文字は本質的に繰り返されないので、重複を見つけ出し、約0の確率で救済されます。 –
@ n.m。あなたはその半分が間違っています。厳密に言えば、この比較時間コストは文字列の長さに依存するのでO(n)です。小さなデータセットの場合、一定の時間に減らすことは可能ですが、実際の表記法としてはカウントできません。 – Shirkam