首頁 >後端開發 >C++ >使用C++編寫的查詢在範圍內具有第K位元設定的陣列元素數量的程式碼

使用C++編寫的查詢在範圍內具有第K位元設定的陣列元素數量的程式碼

PHPz
PHPz轉載
2023-09-01 23:13:131304瀏覽

使用C++編寫的查詢在範圍內具有第K位元設定的陣列元素數量的程式碼

在本文中,我們將討論一個問題,即找到給定範圍內具有第k位元設定的元素的數量,例如−

Input : arr[] = { 4, 5, 7, 2 }
Query 1: L = 2, R = 4, K = 4
Query 2: L = 3, R = 5, K = 1
Output :
   0
   1

我們將透過一種蠻力的方法來解決這個問題,並看看這種方法是否適用於更高的約束條件。如果不適用,那麼我們試著思考一種新的高效方法。

蠻力方法

在這種方法中,我們只需遍歷範圍並檢查每個元素的第k位是否設置,如果是,則增加計數。

範例

#include<bits/stdc++.h>
using namespace std;
#define MAX_BITS 32
bool Kset(int n, int k) { // to check if kth bit is set
   if (n & (1 << (k - 1)))
   return true;
   return false;
}
int query(int L, int R, int K, int arr[]) {
   int count = 0; // counter to keep count of number present in the range
   for (int i = L; i <= R; i++) { // traversing the range
      if (Kset(arr[i], K)) {
         count++;
      }
   }
   return count;
}
int main() {
   int arr[] = { 4, 5, 7, 2 }; // given array
   int n = sizeof(arr) / sizeof(arr[0]); // size of our array
   int queries[][3] = { // given L, R and k
      { 2, 4, 4 },
      { 3, 5, 1 }
   };
   int q = sizeof(queries) / sizeof(queries[0]); // number of queries

   for (int i = 0; i < q; i++) {
      int L = queries[i][0] - 1;
      int R = queries[i][1] - 1;
      int K = queries[i][2];

      cout << query(L, R, K, arr) << "\n";
   }
   return 0;
}

輸出

0
1

上述方法的時間複雜度為O(N*Q),其中N是陣列的大小,Q是給定的查詢數量;如您所見,這種方法對於更高的約束條件不適用,因為它將花費太多時間,所以現在我們將嘗試製作一個高效的程序。

高效的方法

在這種方法中,我們將維護一個二維前綴和數組,該數組將保持每個索引位置使用的位數,並且我們可以在O( 1)的複雜度中計算出答案。

範例

#include<bits/stdc++.h>
using namespace std;
#define bits 32 // number of bits

int P[100000][bits+1];

bool Kset(int n, int k) {
   if (n & (1 << (k - 1)))
      return true;
   return false;
}
void prefixArray(int n, int arr[]) { // building the prefix array
   for (int i = 0; i <= bits; i++) {
      P[0][i] = 0; // setting every bits initial count = 0
   }
   for (int i = 0; i < n; i++) {
      for (int j = 1; j <= bits; j++) {
         bool flag = Kset(arr[i], j);
         if (i) // we add previous count to the latest count(0)
            P[i][j] = P[i - 1][j];
         if (flag) { // if jth bit is set so we increase the count
            P[i][j]++;
         }
      }
   }
}
int query(int L, int R, int K) {
   if (L) // if L not equal to 0 then we return the prefix at R subtracted with prefix at L-1
      return P[R][K] - P[L - 1][K];
   else
      return P[R][K];
}
int main() {
   int arr[] = { 8, 9, 1, 3 }; // given array
   int n = sizeof(arr) / sizeof(arr[0]); // size of given array
   int queries[][3] = {
      { 1, 3, 4 },
      { 2, 4, 1 }
   };
   prefixArray(n, arr); // calling the function to create prefix array
   int q = sizeof(queries) / sizeof(queries[0]); // number of queries

   for (int i = 0; i < q; i++) {
      int L = queries[i][0] - 1;
      int R = queries[i][1] - 1;
      int K = queries[i][2];
      cout << query(L, R, K) << "\n";
   }
   return 0;
}

輸出

2
3

由於我們正在維護幫助我們以O(1)的時間複雜度找到答案的前綴數組,所以我們的時間複雜度大大降低到了O(N),其中N是給定數組的大小。

上述程式碼的解釋

在這個程式中,我們為陣列的每個索引維護一個前綴計數器,用於計算該索引之前使用的每個位數。現在,我們已經儲存了每個位數的前綴計數,所以對於第k位的計數,我們需要用第R索引處的第k位的前綴計數減去第L-1索引處的第k位的前綴數,這就是我們的答案。

結論

在本文中,我們解決了一個問題,即解決具有第K位元設定的範圍內數組元素的查詢。我們也學習了這個問題的C 程序以及我們解決這個問題的完整方法(普通和高效)。我們可以用其他語言(如C、Java、Python和其他語言)編寫相同的程式。希望您會覺得這篇文章有幫助。

以上是使用C++編寫的查詢在範圍內具有第K位元設定的陣列元素數量的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除