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


8

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



スプリット関数のアルゴがわからないので、@ gnatの重複質問ではないと思います
tezz

回答:


7

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

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

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

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

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

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


3

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.