Big theta运行字符串连接的时间?

时间:2015-03-16 17:31:32

标签: java time concatenation big-o biginteger

我有一个赋值来创建我自己的类实现来处理无限大小的整数,然后将我的实现的运行时与Java的BigInteger的运行时进行比较。当我测量并绘制我的add函数的运行时它是一个抛物线,暗示一个大的θ运行时间为Ө(n ^ 2)。我没有嵌套循环所以我期望它是Ө(n)并且无法弄清楚它为什么不是。我怀疑可能是我使用

string += integer

在我的循环中的add方法中。我不太确定该操作是如何实现的,它是Ө(n)的运行时吗?如果没有,有人能说出为什么我的代码不是Ө(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;
}

0 个答案:

没有答案