删除数组中的重复条目 (C++)
Removing duplicate entries in an array (C++)
我遇到了一个问题,理论上应该从数组中删除所有重复值的函数不起作用。以下是它的工作原理:
- 我有两个数组,然后我用随机数填充它们介于 0 和 50 之间(含 0 和 50)。
- 我使用排序函数按顺序对数组值进行排序
- 然后我运行重复数据删除功能
- 我再次按顺序对数组值进行排序
- 然后我输出两个数组中的值
数据删除函数中的循环运行了 19 次,无论它找到多少重复条目,这非常奇怪。此外,它仍然提供重复项。
有什么想法吗?谢谢!
int* dedupe(int array[ARRAY_SIZE]) //remove duplicate array values and replace with new values.
{ bool dupe = false;
while(dupe!=true)
{
for(int j=0; j<ARRAY_SIZE; j++)
{ if(array[j] == array[j+1])
{ array[j] = rand();
array[j] = array[j] % 51;
dupe = false;
}
else { dupe = true; // the cout part is for debugging
cout << dupe << endl; }
}
} return array;
}
int main()
{
int a[9], b[9];
srand(time(0));
populate(b);
populate(a);
sort(a,ARRAY_SIZE);
sort(b,ARRAY_SIZE);
dedupe(a);
dedupe(b);
sort(a,ARRAY_SIZE);
sort(b,ARRAY_SIZE);
for(int i=0; i<10; i++)
{ cout << "a[" << i << "] = " << a[i] << "tt" << "b[" << i << "] = " << b[i] << endl; }
return 0;
}
到目前为止,没有任何建议可以解决问题。有谁知道解决方案?
你不会从 for 循环中返回... 因此,它每次应该运行 ARRAY_SIZE 次。
您要解决的问题与您提供的算法并不真正匹配。您并不真正想要删除重复项,而是保证数组中的所有元素都是不同的,区别在于通过删除重复项,数组中的元素数将小于数组的大小,但您想要一个完整的数组。
我不知道完美的解决方案是什么(算法上),但一个简单的答案是创建一个有效范围内所有值的数组(因为范围很小),对其进行洗牌,然后拾取前 N 个元素。将此视为使用卡片来选择值。
const int array_size = 9;
void create_array( int (&array)[array_size] ) {
const int max_value = 51;
int range[max_value];
for ( int i = 0; i < max_value; ++i ) {
range[i] = i;
}
std::random_shuffle( range, range+max_value );
std::copy_n( range, array_size, array );
}
这不是最有效的方法,但它很简单,并且对于少量元素,应该不会出现任何性能问题。更复杂的方法是使用范围内的随机元素初始化数组,排序并删除重复项(实际上是删除,这意味着数组在最后不会满),然后继续生成数字并检查它们是否是新的相对于先前生成的数字。
最简单的方法是与线性时间的所有其他值进行比较,但在 9 个元素的数组上,线性时间足够小,无关紧要。
你做错了 数组[j] = 兰德(); 数组[j] = 数组[j] % 51
它将始终具有 1 到数组大小!!
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '