一、lowbit算法
lowbit算法,也叫做lowbit函數,是一種運用位運算快速計算數列中二進制末尾0個數的算法。它可以應用於樹狀數組、二叉樹等數據結構中。
二、lowbit函數的作用
lowbit函數可以返回一個數二進制表示下最後一個1的位置到結尾有多少個0,即返回x的二進制表示中最後一個1對應的值。
int lowbit(int x){
return x & (-x);
}
比如說:對於6(110),lowbit(6)返回的是2(010)
三、與lowbit函數相關的應用
1、樹狀數組
樹狀數組,又稱為二叉索引樹,是一種可以動態維護數組前綴和的數據結構,由於其高效的查詢和修改效率,在競賽和數據結構中得到廣泛應用。
使用樹狀數組實現前綴和用到了lowbit函數,對於一個數組a,其對應的樹狀數組是樹的節點代表區間的和,節點編號對應區間的結束位置。
int n;
int c[N], a[N];
int lowbit(int x) { return x & (-x); } //lowbit函數
void update(int x, int k)//更新操作
{
for(; x <= n; x += lowbit(x))
c[x] += k;
}
int getSum(int x)//求區間和操作
{
int res = 0;
for(; x; x -= lowbit(x))
res += c[x];
return res;
}
2、二叉樹
用樹的形式來存儲有層級關係的數據結構,即樹形結構。lowbit算法可以用於計算二叉樹中節點的數量、前k小的節點等問題。
例如:在二叉樹中查詢第k小的節點,可以先用lowbit函數計算該節點所處的層級,然後利用樹的深度優先遍歷或廣度優先遍歷統計每一層的節點數量。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int countNodes(TreeNode* root) {
if (!root) return 0;
int leftDepth = 0, rightDepth = 0;
TreeNode* leftNode = root->left, *rightNode = root->right;
while (leftNode) leftDepth++, leftNode = leftNode->left;//統計左子樹的深度
while (rightNode) rightDepth++, rightNode = rightNode->right;//統計右子樹的深度
if (leftDepth == rightDepth) return pow(2, leftDepth) - 1;//如果左右子樹深度相等,說明是滿二叉樹,直接返回節點數量
return countNodes(root->left) + countNodes(root->right) + 1;//否則遞歸計算左右子樹的節點數
}
3、離散化
離散化指的是將一個數列中的數映射到另一個值域內的過程,常用於解決範圍較大,數值較多的排序問題。
而在離散化時,lowbit函數主要用於計算數字的二進制末尾0的個數,用於壓縮表格,以便於優化表格的存儲和查詢效率。
const int N = 100010;
int n;
int a[N], tr[N];//tr數組存放樹狀數組
int lowbit(int x) { return x & -x; }
void add(int x, int c)//在x位置加c
{
for(int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}
int sum(int x)//求前x項的和
{
int res = 0;
for(int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
int find(int x)//找到第k個元素
{
int l = 1, r = n;
while (l > 1;
if(sum(mid) >= x) r = mid;
else l = mid + 1;
}
return l;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) add(i, a[i]);
int k = find(5);//找到第5個元素
printf("%d", k);//輸出6
return 0;
}
四、總結
lowbit算法是一種運用位運算快速計算數列中二進制末尾0個數的算法,可以應用於樹狀數組、二叉樹等數據結構中。本文從lowbit算法的定義和作用入手,講述了lowbit函數的具體實現方法,以及在樹狀數組、二叉樹、離散化等場景中的應用。通過學習本文,相信讀者對lowbit算法有了更深刻的理解,能夠更好地應用於實際編程中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/199381.html