Hashmap 整数中设置位计数的查找表

Hashmap 整数中设置位计数的查找表,hashmap,bit,lookup-tables,Hashmap,Bit,Lookup Tables,试图解决这个受欢迎的面试问题- 有两种方法我能掌握- 布莱恩·克尼汉算法- 查找表 我假设当人们说使用查找表时,他们指的是一个以整数为键,以设置位数为值的哈希映射 如何构造这个查找表?我们是否使用Brian的算法来计算第一次遇到整数时的位数,将其放入哈希表,然后下次遇到该整数时,从哈希表中检索值 PS:我知道可用于执行popcount(Integer.bitCount())的硬件和软件api,但在这个采访问题中,我们不允许使用这些方法 整数可以直接用于索引数组; e、 因此,您只有一个简单的无

试图解决这个受欢迎的面试问题-

有两种方法我能掌握-

  • 布莱恩·克尼汉算法-

  • 查找表

  • 我假设当人们说使用查找表时,他们指的是一个以整数为键,以设置位数为值的哈希映射

    如何构造这个查找表?我们是否使用Brian的算法来计算第一次遇到整数时的位数,将其放入哈希表,然后下次遇到该整数时,从哈希表中检索值


    PS:我知道可用于执行popcount(Integer.bitCount())的硬件和软件api,但在这个采访问题中,我们不允许使用这些方法

    整数可以直接用于索引数组; e、 因此,您只有一个简单的无符号8位整数数组,其中包含0x0001、0x0002、0x0003的设置位计数。。。并通过
    数组[number\u to\u test]
    进行查找


    您不需要实现哈希函数来将16位整数映射到您可以排序的对象,这样您就可以拥有查找函数了

    整数可以直接用于索引数组; e、 因此,您只有一个简单的无符号8位整数数组,其中包含0x0001、0x0002、0x0003的设置位计数。。。并通过
    数组[number\u to\u test]
    进行查找


    您不需要实现哈希函数来将16位整数映射到您可以排序的对象,这样您就可以拥有查找函数了

    要回答您关于如何计算此表的问题:

    int table[256]; /* For 8 bit lookup */
    for (int i=0; i<256; i++) {
        table[i] = table[i/2] + (i&1);
    }
    
    int表[256];/*用于8位查找*/
    
    对于(int i=0;i回答您关于如何计算此表的问题:

    int table[256]; /* For 8 bit lookup */
    for (int i=0; i<256; i++) {
        table[i] = table[i/2] + (i&1);
    }
    
    int table[256];/*用于8位查找*/
    
    对于(int i=0;i我到处寻找答案,但无法得到令人满意的解释

    让我们从理解左移位的概念开始。当我们将一个数字向左移位时,我们将该数字乘以2,然后向右移位将其除以2

    例如,如果我们想从数字10(01010)生成数字20(二进制10100)然后我们必须将数字10向左移动1。我们可以看到10和20中的设置位的数量是相同的,只是20中的位相对于数字10向左移动了一个位置。因此,从这里我们可以得出结论,n中的设置位的数量与n/2中的设置位的数量相同(如果n是偶数)

    在奇数情况下,如21(10101),除最后一位外,所有位都将与数字20相同,在21的情况下,最后一位将设置为1,从而为奇数增加一个设置位

    让我们把这个公式推广一下

    number of set bits in n is number of set bits in n/2 if n is even
    number of set bits in n is number of set bit in n/2 + 1 if n is odd (as in case of odd number last bit is set. 
    
    更通用的公式是:

    BitsSetTable256[i] = (i & 1) +  BitsSetTable256[i / 2];
    

    其中BitsetTable256是我们为位计数构建的表。对于基本情况,我们可以将BitsetTable256[0]=0;表的其余部分可以使用自下而上的方法使用上述公式进行计算。

    我到处寻找答案,但无法得到满意的解释

    让我们从理解左移位的概念开始。当我们将一个数字向左移位时,我们将该数字乘以2,然后向右移位将其除以2

    例如,如果我们想从数字10(01010)生成数字20(二进制10100)然后我们必须将数字10向左移动1。我们可以看到10和20中的设置位的数量是相同的,只是20中的位相对于数字10向左移动了一个位置。因此,从这里我们可以得出结论,n中的设置位的数量与n/2中的设置位的数量相同(如果n是偶数)

    在奇数情况下,如21(10101),除最后一位外,所有位都将与数字20相同,在21的情况下,最后一位将设置为1,从而为奇数增加一个设置位

    让我们把这个公式推广一下

    number of set bits in n is number of set bits in n/2 if n is even
    number of set bits in n is number of set bit in n/2 + 1 if n is odd (as in case of odd number last bit is set. 
    
    更通用的公式是:

    BitsSetTable256[i] = (i & 1) +  BitsSetTable256[i / 2];
    

    其中BitsetTable256是我们为位计数构建的表。对于基本情况,我们可以设置BitsetTable256[0]=0;表的其余部分可以使用自下而上的方法使用上述公式进行计算。

    感谢您澄清这一点。您能解释一下如何首先确定所述整数的“设置位计数”吗?我问这个问题的原因是,用于确定查找表的popcount的方法会增加时间补偿“整个系统的词汇。”这取决于你是如何理解面试问题的。但是如果你不认为程序大小是问题复杂程度的一部分,你只需把你的程序预先计算出来就可以了。但是这就是这些问题的全部要点:你能讨论这些要点吗?我真的叹息了WebSI。tes喜欢你提到的那个,因为他们认为谷歌对待面试就像你所在城市对待驾照问题一样:不是这样的。可能有多个可以接受的答案,面试的目的是了解你了解多少(而不是背诵).非常正确。不幸的是,现在面试情况更糟了,筛选面试是自动化的,没有人工护航(hackerrank、Codibility等)。关于发货查找表的内容非常有趣。我当时的工作假设是我必须从头开始做所有事情。我会记住这一点。谢谢!)您还必须认识到,一个具有2^16个1字节长度的条目的表实际上是可以忽略的,如果您真的很老练,您可以使用四分之一大小的表(仅存储偶数的位的集合数[因为下面的奇数只多了一个],并且只使用四位存储数字)谢谢你的澄清。你能解释一下如何首先确定所述整数的“设置位计数”吗?我问这个问题的原因是,用于确定查找表的popcount的方法增加了时间复杂性