Java 字符串连接的大θ运行时?
我有一个任务来创建我自己的类实现来处理无限大小的整数,然后将我的实现的运行时与Java的BigInteger的运行时进行比较。当我测量并绘制add函数的运行时间时,它是一条抛物线,这意味着一个很大的θ运行时间为}n^2。我没有嵌套的循环,所以我希望它是}n,但我不知道为什么不是。我怀疑这可能是我用的Java 字符串连接的大θ运行时?,java,time,concatenation,big-o,biginteger,Java,Time,Concatenation,Big O,Biginteger,我有一个任务来创建我自己的类实现来处理无限大小的整数,然后将我的实现的运行时与Java的BigInteger的运行时进行比较。当我测量并绘制add函数的运行时间时,它是一条抛物线,这意味着一个很大的θ运行时间为}n^2。我没有嵌套的循环,所以我希望它是}n,但我不知道为什么不是。我怀疑这可能是我用的 string += integer 在循环内的add方法中。我不太清楚该操作是如何实现的,它是一个运行时吗?如果不是,有人能发现为什么我的代码不是}n吗 这是我的add方法及其调用的构造函数 p
string += integer
在循环内的add方法中。我不太清楚该操作是如何实现的,它是一个运行时吗?如果不是,有人能发现为什么我的代码不是}n吗
这是我的add方法及其调用的构造函数
public HugeInteger(String val) throws IllegalArgumentException{
String temp = "";
boolean leading = true;
//check valid input
for(int i=0; i<val.length(); i++){
if(val.charAt(i) < '0' || val.charAt(i) > '9') //checks if each digit is a number from 0 to 9
if(i!=0 || val.charAt(i) != '-') //doesn't throw if the digit is a '-' at the first character of string
throw new IllegalArgumentException("Input string must be a number");
}
//remove leading zeros
for(int i=0; i<val.length(); i++){
if(!leading || val.charAt(i) != '0')
temp += val.charAt(i);
if(val.charAt(i) > '0' && val.charAt(i) <= '9') //reached first non-zero digit
leading = false;
}
if(temp == "") //this happens when the input was just a string of zeros
temp = "0";
val = temp;
if(val.charAt(0) != '-'){ //no negative sign
digits = new int[val.length()];
for(int i=0; i<val.length(); i++){
digits[i] = (int)(val.charAt(val.length()-1-i) - 48); //in ASCII the char '0' == 48
}
negative = false;
}
else{
digits = new int[val.length() - 1];
for(int i=1; i<val.length(); i++){ //for loop starts after the '-' sign
digits[i-1] = (int)(val.charAt(val.length()-i) - 48); //in ASCII the char '0' == 48
}
negative = true;
}
}
public HugeInteger add(HugeInteger h){
int carry = 0;
int size = digits.length>h.digits.length?digits.length:h.digits.length; //choose larger # of digits
String sum = "";
String sumFlipped = "";
int bigger = 0;
boolean swapped = false;
int temp;
int sign = 1;
int hsign = 1;
//assign sign based on negative or not
if(negative && !h.negative)
sign = -1;
if(!negative && h.negative)
hsign = -1;
//compare magnitudes. 1 means this is biger and -1 means h is bigger
if(digits.length>h.digits.length)
bigger = 1;
else if(digits.length<h.digits.length)
bigger = -1;
else{ //same length
for(int i=0; i<digits.length; i++){ //both digits arrays are same length
if(digits[digits.length-1-i] > h.digits[h.digits.length-1-i]){
bigger = 1;
break;
}
if(digits[digits.length-1-i] < h.digits[h.digits.length-1-i]){
bigger = -1;
break;
}
}
}
//positive number must be bigger than negative number for long subtraction
//if not, swap signs
if(bigger == 1 && negative && !h.negative){ //this is bigger and negative
swapped = true;
sign *= -1;
hsign *= -1;
}
if(bigger == -1 && !negative && h.negative){ //h is bigger and negative
swapped = true;
sign *= -1;
hsign *= -1;
}
for(int i=0; i<size; i++){
if(i>=digits.length)
temp = h.digits[i]*hsign + carry;
else if(i>=h.digits.length)
temp = digits[i]*sign + carry;
else
temp = digits[i]*sign + h.digits[i]*hsign + carry;
if(temp>9){ //adds the digit to the string, then increments carry which is used in next iteration
temp -= 10;
sum += temp;
carry = 1;
}
else if(temp<0){
temp += 10;
carry = -1;
sum += temp;
}
else{
sum += temp;
carry = 0;
}
}
if(carry == 1)
sum += 1;
if(negative && h.negative || swapped)
sum += '-';
//flip string around
for(int i=0; i < sum.length(); i++){
sumFlipped += sum.charAt(sum.length() - 1 - i);
}
HugeInteger sumHugeInteger = new HugeInteger(sumFlipped);
return sumHugeInteger;
}
你的代码看起来像是开着的。你能展示一下你是如何测量你的运行时间的,以及你输入的平均大小是多少吗?字符串的长度是String+=char,这使得整个循环在^2上。改用StringBuilder。