web-dev-qa-db-ja.com

Javaの文字列分割関数の複雑さは何ですか?

私の文字列はタイプ_"abacsdsdvvsg"_または_"a a a a a a a"_です
そしてString[] stringArray = s.split("");またはString[] stringArray = s.split(" ");を使用します
上記の分割の複雑さ(O(string length))はどうなるのだろうと思いますか?
PS:O(...)コードが指定されている場合の計算方法を知っています。ここでは、分割関数のアルゴリズムがわかりません。

8
tezz

複雑さは、分割に使用する正規表現によって異なります。 (はい、String.split(...)に指定する引数は正規表現です!)

あなたの例では、それはO(N)になります。ここでNは入力文字列の文字数です。

分割のアルゴリズムは、既存の正規表現の実装に基づいて、非常に単純です。概要は次のとおりです。

  1. 正規表現をコンパイルしてマッチャーを作成する
  2. 文字列を反復処理します:
    1. Matcher.find(...)を使用して、次の単語境界を検索します
    2. String.substringを使用して単語を抽出する
    3. 文字列のリストにWordを追加する
  3. 文字列のリストを文字列の配列に変換します。

「単語」間の区切りの検索は、正規表現(find呼び出し)に応じて、O(N)またはより複雑になります。リスト、結果配列、および部分文字列の構成は、最悪の場合O(N)になります。

正確な詳細はソースコードにあり、Googleを使用して見つけることができます。 (検索する "Java.lang.String" source、1つを選択し、Javaのバージョンにドリルダウンします。または、JDKインストールに含まれているソースコードのZipファイルでファイルを検索します)

7
Stephen C

そのO(n)は、1/0文字長の区切り文字で分割する特定の場合です。一般的に、O(n + k)はk文字の区切り文字で、 KMPアルゴリズムを使用して実装されます。Java文字列分割は、正規表現をセパレーターとしても受け入れます。この場合、その複雑さは、使用されるマッチングアルゴリズムによって異なります。1つの一般的な正規表現マッチングアルゴリズムは、トンプソンNFAアルゴリズムです。

3
VinyleEm