gpt4 book ai didi

c++ - 在二进制二维数组中查找唯一行

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:48 24 4
gpt4 key购买 nike

打印唯一的行号。

以下是我的实现:

#include <iostream>
#include <cmath>

int rowsToInt(int m[][5], int row, int cloumLen) {
int sum = 0;
// m[row][column]
for (int i = 0; i < cloumLen; i++) {
sum += m[row][i]*(std::pow(2,i));
}
return sum;
}

void removeDuplicate(int m[][5], int row, int column) {
if (!m) {
return;
}

int tracker = 0;
int mask = 1;
int value;

for (int i = 0; i < row; i++) {
value = rowsToInt(m, i, column); // 3
if (((mask << (value - 1)) & tracker) == 0) {
// print unique row
std::cout << "row: " << i << " is unique" << std::endl;

// set that bit to 1
tracker = tracker ^ (mask << (value - 1));
}
}
}

int main() {
int array[5][5] = {
{0,1,0,0,1},
{1,0,1,1,0},
{0,1,0,0,1},
{1,1,1,0,0},
{1,1,0,1,1}
};
removeDuplicate(array, 5, 5);
return 0;
}

输出是:

row: 0 is unique
row: 1 is unique
row: 3 is unique
row: 4 is unique

运行时间是多少?我认为它是 O(row*column);因为每一行然后每一列元素都被访问了。

这是最佳运行时间吗?

最佳答案

你的方法好像有问题:

  • 函数 rowsToInt转换 5 int 的子数组到 0 之间的值和 31假设这些值是严格的二进制(0 或 1)。

  • 在函数中 removeDuplicates ,您将这些值用作表达式中的移位计数器:(mask << (value-1))其中 mask是一个 int具有值(value) 1 .这是一种跟踪到目前为止看到的行的巧妙方法,但表达式会为 value == 0 调用未定义的行为。 .

您应该使用 unsigned long 解决这个问题输入 tracker , 保证至少有 32 位,并且 (1UL << value)定义和不同的值 031 .

复杂度确实是O(rows * cols),但算法本质上限于cols <= 5 ,所以当 cols 时很难谈论复杂性不能任意增长。

此外,使用 pow(2, i)计算二进制值的效率非常低。

这是一个更简单的版本:

#include <iostream>
#include <cmath>

int rowsToInt(int m[][5], int row, int cloumLen) {
int sum = 0;
// m[row][column]
for (int i = 0; i < cloumLen; i++) {
sum += m[row][i] << i;
}
return sum;
}

void removeDuplicate(int m[][5], int row, int column) {
if (!m) {
return;
}

unsigned long tracker = 0;

for (int i = 0; i < row; i++) {
int value = rowsToInt(m, i, column); // 3
if (((1UL << value) & tracker) == 0) {
// print unique row
std::cout << "row: " << i << " is unique" << std::endl;
// set that bit to 1
tracker |= 1UL << value;
}
}
}

int main() {
int array[7][5] = {
{0,1,0,0,1},
{1,0,1,1,0},
{0,1,0,0,1},
{1,1,1,0,0},
{1,1,0,1,1},
{0,0,0,0,0},
{0,0,0,0,0},
};
removeDuplicate(array, 7, 5);
return 0;
}

关于c++ - 在二进制二维数组中查找唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38556583/

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