首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 位圖去重排序:自定義 Bitset 實現 O(N) 時間 O(1) 空間

     編輯:關於C++

背景

對於已知範圍(如 0~600)的整數去重並升序輸出,位圖是極佳選擇:時間 O(N+M),空間 O(M/32)。本文展示一個模板化的 Bitset 實現。

核心設計

  • 以 long(32 位)為存儲單元,數組大小 _W = (_N-1)/32 + 1。
  • 提供 set(pos) 置位、test(pos) 測試、printf() 遍歷輸出所有置位下標。

完整代碼

#include <iostream>
using namespace std;

template <int _N>
class Bitset {
    static const int _W = (_N - 1) / 32 + 1;
    long A[_W] = {0};
public:
    void set(int pos) {
        A[pos / 32] |= (1L << (pos % 32));
    }
    bool test(int pos) const {
        return (A[pos / 32] >> (pos % 32)) & 1L;
    }
    void printf() const {
        for (int i = 0; i < _N; ++i)
            if (test(i)) cout << i << ' ';
    }
};

int main() {
    Bitset<600> bs;
    int data[] = {1,1,1,1,2,2,3,3,34,2,423,42,34,23,1,1,3,213,123,21,3,3,4,32,543,5,46,3,45,35,23,42,3};
    for (int x : data) bs.set(x);
    bs.printf(); // 輸出: 1 2 3 4 5 21 23 32 34 35 42 45 46 123 213 423 543
    return 0;
}

優勢分析

指標Bitsetstd::set排序+unique
時間O(N+M)O(N log N)O(N log N)
空間M/32 bytesO(N) 節點O(N)
適用場景數據範圍小、密集通用、範圍大通用

當最大值 ≤ 107 時,Bitset 通常是最快且最省內存的方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved