gpt4 book ai didi

c - C 中巨大的位数组/位图声明

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:46 24 4
gpt4 key购买 nike

我正在尝试编写一个布隆过滤器来存储大约 80,000 个字符串...现在我猜测每个字符串的长度可以是 2 个字。要存储 80,000 个字符串……我需要 80,000*2 = 16kBytes?

如果我必须存储 16kB = 16*1000*8 = 128,000 位,我至少需要 2^17=131,072 的位图。这是我现在拥有的

int main() {

char *str = "hello world";
int c = sizeof(unsigned char);
/*
* declare the bit array
*/
unsigned char bit_arr[128000/c];
/*
* couple of hash functions
*/
unsigned int bkd = bkdrhash(str, strlen(str));
unsigned int rsh = rshash(str, strlen(str));
unsigned int jsh = jshash(str, strlen(str));

/*
* logic to set bit
* Access the bitmap arr element
* And then set the required bits in that element
*/
bit_arr[bkd/c] & (1 << (bkd%c));
bit_arr[rsh/c] & (1 << (rsh%c));
bit_arr[jsh/c] & (1 << (jsh %c));

是否有更好/最佳的方法来做到这一点?

谢谢

最佳答案

你的数学有问题。 80k * 2 = 160K。正如 Chris Dodd 所说,这些在普通台式机甚至智能手机上都非常小。如果您的应用程序是嵌入式的,或者您有其他大量分配,那么情况可能会有所不同。 iPhone 默认有 1 兆字节的堆栈和 1/2 兆字节的辅助线程。

在总线为 N 位宽的机器上,使用 N 位宽的整数可能具有显着优势。如此抽象远离单词大小:

#define WORD_BYTES 4
#define BYTE_BITS 8
#define WORD_BITS (BYTE_BITS * WORD_BYTES)
#define BITSET_BITS (1u << 17)
#define BITSET_WORDS (BITSET_BITS / WORD_BITS)
typedef unsigned int WORD;
typedef WORD BITSET[BITSET_WORDS];
typedef WORD *BITSET_REF;
#define bit(N) (1u << (N))

/* Allocate a bitset on the heap and return a reference to it. */
BITSET_REF new_bitset(void)
{
return safe_malloc(sizeof(BITSET));
}

/* Arrange for these functions to be inlined by the compiler rather
than using fancy macros or open coding. It will be better in
the long run. */
int is_set(BITSET_REF bitset, int n)
{
return (bitset[n / WORD_BITS] | bit(n % WORD_BITS)) != 0;
}

void set(BITSET_REF bitset, int n)
{
bitset[n / WORD_BITS] |= bit(n % WORD_BITS);
}

void clear(BITSET_REF bitset, int n)
{
bitset[n / WORD_BITS] &= ~bit(n % WORD_BITS);
}

关于c - C 中巨大的位数组/位图声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com