私の文字列はタイプ_"abacsdsdvvsg"
_または_"a a a a a a a"
_です
そしてString[] stringArray = s.split("");
またはString[] stringArray = s.split(" ");
を使用します
上記の分割の複雑さ(O(string length)
)はどうなるのだろうと思いますか?
PS:O(...)コードが指定されている場合の計算方法を知っています。ここでは、分割関数のアルゴリズムがわかりません。
複雑さは、分割に使用する正規表現によって異なります。 (はい、String.split(...)に指定する引数は正規表現です!)
あなたの例では、それはO(N)
になります。ここでN
は入力文字列の文字数です。
分割のアルゴリズムは、既存の正規表現の実装に基づいて、非常に単純です。概要は次のとおりです。
Matcher.find(...)
を使用して、次の単語境界を検索します「単語」間の区切りの検索は、正規表現(find
呼び出し)に応じて、O(N)
またはより複雑になります。リスト、結果配列、および部分文字列の構成は、最悪の場合O(N)
になります。
正確な詳細はソースコードにあり、Googleを使用して見つけることができます。 (検索する "Java.lang.String" source
、1つを選択し、Javaのバージョンにドリルダウンします。または、JDKインストールに含まれているソースコードのZipファイルでファイルを検索します)
そのO(n)は、1/0文字長の区切り文字で分割する特定の場合です。一般的に、O(n + k)はk文字の区切り文字で、 KMPアルゴリズムを使用して実装されます。Java文字列分割は、正規表現をセパレーターとしても受け入れます。この場合、その複雑さは、使用されるマッチングアルゴリズムによって異なります。1つの一般的な正規表現マッチングアルゴリズムは、トンプソンNFAアルゴリズムです。