如何有效地从数组中提取唯一值
How to efficiently extract unique values from array?
我想从(动态分配的)数组中提取唯一的值。我有这样的东西:
[0] 0 int
[1] 1 int
[2] 2 int
[3] 2 int
[4] 2 int
[5] 5 int
[6] 6 int
[7] 6 int
[8] 8 int
[9] 9 int
[10] 10 int
[11] 8 int
[12] 12 int
[13] 10 int
[14] 14 int
[15] 6 int
[16] 2 int
[17] 17 int
[18] 10 int
[19] 5 int
[20] 5 int
我想要一个大小为12的数组,其中的每个记录都是另一个数组的唯一值。
我该怎么做?
编辑我忘了提到我不能使用STL容器(如std::vector
或std::list
)
使用您喜欢的排序算法(例如std::sort)对数组进行排序后,使用std::unique
编辑:如果没有STL,最简单的解决方案将是找到min&max值,并动态地分配一个CCD_。遍历数组,如果看到元素,请将相应的bool
元素设置为true
。用唯一元素的总数分配一个新的int
数组,并用bool
数组中的数据填充它。
推荐:对数组进行排序并删除连续的元素。实现快速排序并不太难,如果您处理的是整数,基数排序可能会更好。
您可以使用std::set
。将所有元素添加到其中,最后只会出现唯一的值。
首先需要对数组进行排序,然后对排序后的数组进行迭代,并检查上一个或下一个条目是否与当前条目相同。如果不是,则该值是唯一的。
编辑:我可能误解了这个问题。。。获得所需内容的一种方法是对数组进行迭代。对于每个值,检查值是否已存在于另一个数组中,如果不是,则将其复制到那里。这可能需要分两步完成,一步是获取唯一条目的数量(使用与现有条目大小相同的数组),另一步是获得正确大小的数组。
#include <iostream>
#include <stdlib.h>
using namespace std;
int cmpfun(const void * a, const void * b){
return (*(int*)a - *(int*)b);
}
int main(){
int n,i,j=0;
cout<<"Enter the number of elements in the array:n";
cin>>n;
int arr[n],arr_new[n];
for(i=0;i<n;i++)
cin>>arr[i];
qsort(arr, n, sizeof(int), cmpfun); /*Sorting the array; if you aren't allowed to use any library sorting method,
then I suggest to implement one sorting function on your own.*/
for(i=0;i<n;i++){
arr_new[j++]=arr[i];
// Excluding all duplicates
while(i<(n-1) && arr[i]==arr[i+1])
i++;
}
for(i=0;i<j;i++)
cout<<arr_new[i]<<" ";
return 0;}
主要目的是确保忽略重复项。因此,您应该首先对数组进行排序,然后在O(n)时间内遍历数组,忽略所有重复。遍历数组时,将所有唯一值(第一次遇到的值)复制到新数组中。
我发现唯一可能让您担心的是,旧数组中元素的相应顺序在新数组中没有保留。但是,如果您只关心查找唯一值,那么这种方法应该可以很好地工作。
您可以使用哈希集(unordered_set)来存储源数组的每个值。该集合将自动仅存储唯一值。然后,若你们真的需要一个数组而不是集合,你们可以创建一个大小合适的数组,并用集合中的元素填充它。
如果您知道最大值和最小值,您可以创建一个具有所有可能值的新数组,然后在动态数组中循环。对于每个值,将新数组的1作为该值的索引。例如:-假设您有类似1,2,2,4,6
的数据
如果范围是1到7
第二个阵列将像这个
1 2 3 4 5 6 7
1 1 0 1 0 1 0
算法的复杂度为2n
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 何时在引用或唯一指针上使用移动语义
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何设置一个范围来提取我想要获得的信息
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用 std::unique_copy 从向量中提取不区分大小写的唯一字符串
- 如何有效地从数组中提取唯一值
- 映射唯一的类和从值中提取子类