gpt4 book ai didi

c - 关于哈希函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:29 24 4
gpt4 key购买 nike

让我们考虑一个双向数组,声明如下:

#include <stdbool.h>

bool array[N1][N2];

我必须知道这个数组的每一行是否恰好有一个 true相同位置的值。

例如以下是可以的:

{ 
{ 1, 0, 1, 0 },
{ 1, 0, 0, 1 },
{ 0, 0, 1, 1 }
}

鉴于这是不正确的:

{ 
{ 1, 0, 1, 0 },
{ 1, 0, 1, 0 },
{ 0, 0, 1, 1 }
}

我已经试过了:

static uintmax_t hash(const bool *t, size_t n) 
{
uintmax_t retv = 0U;
for (size_t i = 0; i < n; ++i)
if (t[i] == true)
retv |= 1 << i;
return retv;
}

static int is_valid(bool n)
{
return n != 0 && (n & (n - 1)) == 0;
}

bool check(bool t[N1][N2])
{
uintmax_t thash[N1];

for (size_t i = 0; i < N1; ++i)
thash[i] = hash(t[i], N2);

for (size_t i = 0; i < N1; ++i)
for (size_t j = 0; j < N1; ++j)
if (i != j && !is_valid(thash[i] & thash[j]))
return 0;

return 1;
}

但它只适用于 N1 <= sizeof(uintmax_t) * CHAR_BIT .你知道解决它的最佳方法吗?

最佳答案

为什么不创建另一个大小为 N2(列数)的数组,将其全部设置为 true,然后 and 每行中的每一列。最后,检查您的新数组是否恰好有一个设置位。

bool array[N1][N2];  // this is initialized somehow
bool result[N2];
int i, j;

// initialize result array
for (j = 0; j < N2; ++j)
{
result[j] = 1;
}

// Now go through the array, computing the result
for (i = 0; i < N1; ++i)
{
for (j = 0; j < N2; ++j)
{
result[j] &= array[i][j];
}
}

// At this point, you can check the result array.
// If your array is valid, then result should have only one '1' in it.

关于c - 关于哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13183384/

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