이러한 성능은 무엇입니까?자바에서 toCharArray() 및 toString()의 런타임은 무엇입니까?
BigInteger -> toString() // what is the runtime?
String -> toCharArray() // what is the runtime?
감사합니다.
이러한 성능은 무엇입니까?자바에서 toCharArray() 및 toString()의 런타임은 무엇입니까?
BigInteger -> toString() // what is the runtime?
String -> toCharArray() // what is the runtime?
감사합니다.
BigInteger
을 문자열로 변환하는 것은 O(N^2)
입니다. 여기에서 N
은 결과의 자릿수입니다. 내부 표현의 기준으로 대상 기본을 나눌 수 없습니다. 대상베이스가 스토리지베이스로 나눌 수있는 경우 변환은 O(N)
입니다.
내부 표현이 기본 256 인 경우 기본 10으로 변환하는 것을 고려하십시오. 십분의 일 나누기가 발생했습니다 N
번; 매번 BigInteger
표현의 모든 요소가 수정됩니다. 표현의 요소 수는 인쇄물의 자릿수에 비례하므로 전체 변환에는 O(N^2)
이 필요합니다.
반면에, 기본 256 내부 표현에서 큰 int의 16 진수로 변환하려면 O(N)
이 필요합니다.이 경우에는 나누기가 필요하지 않기 때문입니다. 각 하위 요소는 나머지 요소와 분리하여 변환 할 수 있으며 하위 요소의 수는 출력물의 자릿수에 비례합니다.
String.toCharArray()
까지는 O(N)
입니다. 여기에서 N
은 문자열의 문자 수입니다. 각 문자를 출력에 복사해야하기 때문입니다.
'toCharArray'가'O (N)'이 아닌'O (1)'이 아닌가? 어쨌든 문자 배열로 저장된 문자열이 아닌가? – arshajii
@ A.R.S. Java에서는 배열이 변경 가능하고 문자열은 변경되지 않습니다. 'toCharArray'는'O (N)'시간의 복잡성을 강요하는 길이'N'의 복사본을 만들어야합니다. – dasblinkenlight
오, 이제 원본을 보면 모든 문자를 새로운 배열로 복사한다는 것을 알 수 있습니다. – arshajii
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) 인 후드 방어 적이기를 사용하는 상상, 그래서 런타임 O는 실제 JVM 구현에 따라 달라집니다. 이 원시 메소드의 소스를 확인하려면 open jdk 소스를 살펴보십시오.
이 질문은 어떤 이점이 있습니까? –
질문에 많은 의미가 없습니다. 어떤 종류의 대답을 찾고 계십니까? –
n은 문자열의 문자 수입니다. 문자열을 크기 n의 배열로 변환하는 큰 O는 무엇입니까? – knd