Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串连接的大θ运行时?_Java_Time_Concatenation_Big O_Biginteger - Fatal编程技术网

Java 字符串连接的大θ运行时?

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

我有一个任务来创建我自己的类实现来处理无限大小的整数,然后将我的实现的运行时与Java的BigInteger的运行时进行比较。当我测量并绘制add函数的运行时间时,它是一条抛物线,这意味着一个很大的θ运行时间为}n^2。我没有嵌套的循环,所以我希望它是}n,但我不知道为什么不是。我怀疑这可能是我用的

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。