C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でビット配列を使用して配列の重複を検索する


コンセプト

n個の数値の配列があります。nは最大32,000です。これで、指定された配列に重複するエントリが含まれる可能性があり、nが何であるかがわかりません。ここで、使用可能なメモリが4キロバイトしかない場合、配列内の重複するすべての要素をどのように表示または印刷するのかという疑問が生じます。

入力

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キロバイトのメモリができました。これは、最大8 * 4 *210ビットをアドレス指定できることを示しています。32*210ビットは32000より大きいことに注意してください。したがって、32000ビットのビットを生成できます。各ビットは1つの整数を表します。 。

ここでも、32000ビットを超えるビットを生成する必要がある場合は、32000を超えるビットを簡単に生成できることに注意してください。このビットベクトルを実装すると、ビットvを1に設定することで、各要素vにフラグを付けて、配列を反復処理できます。この場合、重複する要素をトラバースすると、それが出力されます。

// C++ program to print all Duplicates in array
#include <bits/stdc++.h>
using namespace std;
// Shows a class to represent an array of bits using
// array of integers
class BitArray{
   int *arr1;
   public:
   BitArray() {}
   // Constructor
   BitArray(int n1){
      // Used to divide by 32. To store n bits, we require
      // n/32 + 1 integers (Assuming int is stored
      // using 32 bits)
      arr1 = new int[(n1 >> 5) + 1];
   }
   // Now get value of a bit at given position
   bool get(int pos1){
      // Used to divide by 32 to find position of
      // integer.
      int index1 = (pos1 >> 5);
      // Now determine bit number in arr[index]
      int bitNo1 = (pos1 & 0x1F);
      // Determine value of given bit number in
      // arr1[index1]
      return (arr1[index1] & (1 << bitNo1)) != 0;
   }
   // Used to set a bit at given position
   void set(int pos1){
      // Determine index of bit position
      int index1 = (pos1 >> 5);
      // Used to set bit number in arr1[index1]
      int bitNo1 = (pos1 & 0x1F);
      arr1[index1] |= (1 << bitNo1);
   }
   //Shows main function to print all Duplicates
   void checkDuplicates1(int arr1[], int n1){
      // Used to create a bit with 32000 bits
      BitArray ba1 = BitArray(320000);
      // Used to traverse array elements
      for (int i = 0; i < n1; i++){
         // Shows index in bit array
         int num1 = arr1[i];
         // Now if num is already present in bit array
         if (ba1.get(num1))
            cout << num1 << " ";
         // Otherwise or else insert num
         else
            ba1.set(num1);
      }
   }
};
// Driver code
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

  1. STLを使用したC++の配列製品

    これは、配列製品を見つけるためのC++プログラムの例です。 アルゴリズム Begin Initialize the values of array. Call used defined function accumulate to return the product of array. Print the solution. End. サンプルコード #include <iostream> #include <numeric> using namespace std; int ProductOfArray(int p[], int n) { &nbs

  2. Pythonでビット配列を使用して配列の重複を検索する

    n個の異なる数値の配列があるとします。 nは最大で32,000にすることができます。配列に重複するエントリがある可能性があり、nの値がわかりません。 4キロバイトのメモリしかない場合、アレイ内のすべての重複をどのように表示しますか? したがって、入力が[2、6、2、11、13、11]の場合、2と11が指定された配列に複数回表示されるため、出力は[2,11]になります。 これを解決するには、次の手順に従います- 1バイト配列型のデータ構造bit_arrを作成します。次のメソッドがあります コンストラクターの定義これにはnが必要です arr:=サイズの配列(n / 2 ^ 5)+