在C ++中使用位数组查找数组的重复项

概念

我们有n个数字组成的数组,其中n最多为32,000。现在,给定的数组可能具有重复的条目,并且我们不知道n是什么。现在出现的问题是,只有4 KB的可用内存,如何显示或打印数组中所有重复的元素?

输入值

arr[] = {2, 6, 2, 11, 13, 11}

输出结果

2 11

2 and 11 appear more than once in given array.

输入值

arr[] = {60, 50, 60}

输出结果

60

方法

现在我们有4 KB的内存,表示我们可以寻址多达8 * 4 * 210位。应该注意,32 * 210位大于32000。因此我们可以生成一个32000位的位,其中每个位代表一个整数。

再次需要注意的是,如果我们需要生成一个32000位以上的位,那么我们可以轻松生成32000以上的位。实现此位向量,我们可以通过将位v设置为1来遍历数组,标记每个元素v。在这种情况下,当遍历重复元素时,我们将其打印出来。

示例

// C++ program to print all Duplicates in array

#include <bits/stdc++.h>

using namespace std;

//显示代表位数组的类

//整数数组

class BitArray{

   int *arr1;

   public:

   BitArray() {}

   //构造函数

   BitArray(int n1){

      //用于除以32。要存储n位,我们需要

      //n / 32 + 1整数(假设存储了

      //使用32位)

      arr1 = new int[(n1 >> 5) + 1];

   }

   //现在在给定位置获取一点值

   bool get(int pos1){

      //位置

      //整数。

      int index1 = (pos1 >> 5);

      //位数

      int bitNo1 = (pos1 & 0x1F);

      //确定给定位数的值

      //arr1 [index1]

      return (arr1[index1] & (1 << bitNo1)) != 0;

   }

   //用于在给定位置设置一点

   void set(int pos1){

      //确定位的位置索引

      int index1 = (pos1 >> 5);

      // Used to set bit number inarr1 [index1]

      int bitNo1 = (pos1 & 0x1F);

     arr1 [index1] |= (1 << bitNo1);

   }

   //显示主要功能以打印所有副本

   void checkDuplicates1(int arr1[], int n1){

      //用于创建具有32000位的位

      BitArray ba1 = BitArray(320000);

      //用于遍历数组元素

      for (int i = 0; i < n1; i++){

         //在位数组中显示索引

         int num1 = arr1[i];

         //现在,如果位数组中已经存在num-

         if (ba1.get(num1))

            cout << num1 << " ";

         //否则插入num-

         else

            ba1.set(num1);

      }

   }

};

//驱动程式码

int main(){

   int arr1[] = {2, 6, 2, 11, 13, 11};

   int n1 = sizeof(arr1) / sizeof(arr1[0]);

   BitArray obj1 = BitArray();

   obj1.checkDuplicates1(arr1, n1);

   return 0;

}

输出结果

2 11

以上是 在C ++中使用位数组查找数组的重复项 的全部内容, 来源链接: utcz.com/z/331236.html

回到顶部