破解编码面试的BitSet错误?

时间:2013-09-02 01:23:36

标签: algorithm bitset bitarray

以下是在问题10-4的解决方案中破解编码采访书中BitSet的实现。为什么分配大小/ 32的数组(大小/ 32 + 1)。我在这里遗漏了什么或这是一个错误吗?

如果我将33传递给BitSet的构造函数,那么我将只分配一个int,如果我尝试设置或得到32位,我将得到一个AV!

package Question10_4;

class BitSet {
    int[] bitset;

    public BitSet(int size) {
            bitset = new int[size >> 5]; // divide by 32
    }

    boolean get(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            return (bitset[wordNumber] & (1 << bitNumber)) != 0;
    }

    void set(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            bitset[wordNumber] |= 1 << bitNumber;
    }

}

2 个答案:

答案 0 :(得分:0)

从我从阅读你提到的解决方案(第205页)以及我对计算机编程的一点了解中可以得到的东西,在我看来,这是一个特殊的bitset实现,意味着采用32,000的参数在它的构造中(参见checkDuplicates函数。问题是关于检查数字从1到N的数组,其中N最多为32,000,只有4KB的内存)。

这样,创建了一个包含1000个元素的数组,每个元素用于位集中的32位。你可以在bitset类中看到得到一个位的位置,我们(floor)除以32得到数组索引,然后用mod 32得到特定的位位置。

答案 1 :(得分:0)

是的,书中的答案是不正确的。 正确答案:

bitset = new int[(size + 31) >> 5]; // divide by 32