这种二元加法解决方案的空间复杂性是多少?

时间:2015-03-30 01:11:02

标签: java string algorithm time-complexity space-complexity

我正在处理来自 Facebook Software Engineer

的面试问题

问题:编写一个函数,给出两个二进制数字作为字符串返回二进制数的总和

这是我在Java中的解决方案(经测试,它可以工作!!!)

private static String sum(String bin1, String bin2)
{
    int dec1 = binToDec(bin1);
    int dec2 = binToDec(bin2);
    int sumTo = dec1 + dec2;
    StringBuilder bin = new StringBuilder();
    do {
        bin.append(sumTo%2);
        sumTo = sumTo/2;
    }while(sumTo > 0);

    return bin.reverse().toString();
}
private static int binToDec(String bin) 
{
    int result = 0;
    int len = bin.length();
    for(int rep = len-1; rep >= 0; rep--) {
        int multiplyBy = bin.charAt(rep) == '1' ? 1 : 0;
        result += multiplyBy * Math.pow(2, len-1-rep);
    }
    return result;
}

我试图分析总和的时间和空间复杂性。我知道由于二进制转换,算法的时间复杂度只是 O(logn)

像往常一样,我在空间复杂性方面遇到了困难。我知道空间复杂度只取决于我从堆中分配的内存,在这种情况下是表示二进制和结果的字符串

我知道字符串连接是一项昂贵的操作,因为它需要复制1个字符,然后复制2个字符,然后最后登录字符。我知道传统的字符串连接在O(n 2 )空间中运行。这会是一样的吗?

我自己尝试进行计算

1 + 2 + 3 +.... logn-1 + logn <BR>
logn + logn-1 + ....1<BR>
 logn(logn + 1)/2

得到 logn(logn + 1) / 2 的最终结果 这将是 O((logn) 2 。这个算法的空间复杂度是否合适?或者它只是 O(n 2 ,因为这两个函数属于同一个族?

1 个答案:

答案 0 :(得分:0)

在重新审视这个问题后,我应该更清楚地使用变量。

我算法的时间复杂度为 O(log 2 m + n 1 + n 2 Big O Summation其中 m 是二进制数之和的十进制表示。 n 1 n 2 分别是位数,或bin1和bin2的长度。

对于Space Complexity,您必须考虑算法分配的所有内存 - 从堆栈和堆中。

在分析我在stack中使用的空间量时,我注意到我没有进行递归调用,该空间将是 O(1)。类似地,当分析我在堆中使用的空间量时,它也将是 O(1),因为无论输入如何,我总是分配相同的空间量(3个int),使用没有数据结构。

因此,我的解决方案的空间复杂性是 O(1)