これらのパフォーマンスは何ですか?
BigInteger -> toString() // what is the runtime?
String -> toCharArray() // what is the runtime?
ありがとう。
これらのパフォーマンスは何ですか?
BigInteger -> toString() // what is the runtime?
String -> toCharArray() // what is the runtime?
ありがとう。
BigInteger
の文字列への変換はですO(N^2)
。ここN
で、 は結果の桁数です。内部表現の基数がターゲットの基数を割り切らない場合です。ターゲット基数がストレージ基数で割り切れる場合、変換には がかかりますO(N)
。
内部表現が base-256 の場合、base 10 への変換を検討してください。10 による除算はN
何回も発生する必要があります。毎回、BigInteger
表現のすべての要素が変更されます。表現の要素数は出力の桁数に比例するため、全体の変換にはO(N^2)
.
一方、base-256 の内部表現で big int を 16 進数に変換するO(N)
場合は、除算が不要なため、 がかかります。各サブエレメントは、残りのサブエレメントから分離して変換できます。サブエレメントの数は、出力の桁数に比例します。
各文字を出力にコピーする必要があるため、は文字String.toCharArray()
列内の文字数です。O(N)
N
toString() メソッドは、たまたまネイティブ メソッドである System.arrayCopy を使用して実装されています。
public char[] toCharArray() {
char result[] = new char[count];
getChars(0, count, result, 0);
return result;
}
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
// bounds checking
System.arraycopy(value, offset + srcBegin, dst, dstBegin,
srcEnd - srcBegin);
}
ネイティブメソッドはおそらく O(N) であるボンネットの下で memcpy を使用しているため、ランタイム O は実際の jvm 実装に依存していると思います。このネイティブ メソッドのソースを確認するには、オープン jdk ソースを参照してください。