如何有效地从数组中提取唯一值

How to efficiently extract unique values from array?

本文关键字:提取 唯一 数组 有效地      更新时间:2023-10-16

我想从(动态分配的)数组中提取唯一的值。我有这样的东西:

    [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::vectorstd::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