位圖:用一個bit來標記某個元素對應的值,鍵值就是該元素。最大的好處就是節省了內存空間。
應用場景:在海量數據中找出重複出現的元素或者去除重複出現的元素或者判斷指定數是否在該海量數據中,例如,給40億個未排序不重複的unsinged int的整數,判斷某個數是否在這40億的數據中,或者判斷這40億數據中哪些數是重複的。
基本原理:
1.給定數n,n所對應的字節位置:n/8;n所對應的位位置:n%8。例如數據12,12/8=1;12%8=4;即數據12對應的位在第一個字節的第四位上面,在該位上面置1
2.給定待排序的數組,對每個數據進行位的置1,同時建立一個temp數組,若某個數據出現了第二次,則temp數組對應位加1,即temp數組中的每個元素統計對應位置的重複出現個數。
3.排序時,按照從1開始到該數據的最大值進行循環,即從低位開始依次檢查每一位,若給位爲1則輸出數據,即爲排序後的數據,若爲0則檢查下一位。
代碼:
#include <bitset>
using namespace std;
void BitSort(int list[], int n)
{
const int Max_Num = 20;
bitset<Max_Num + 1> bitmap;
int max = 0;
//找出待排序的數組中最大值
for (int i = 0; i < n; i++)
{
if (list[i] > max)
{
max = list[i];
}
}
int *temp = new int[max+1];
memset(temp, 0, sizeof(int)*(max + 1));
for (int i = 0; i < n; i++)
{
if (bitmap.test(list[i]))//若對應位爲1則表示數有重複
{
temp[list[i]] += 1;//temp數組統計重複數字的個數
}
bitmap.set(list[i]); //將指定位置置1
}
int j=0;
for (int i = 0; i < Max_Num; i++)
{
if (bitmap.test(i))
{
list[j++] = i;
if (temp[i]>0)
{
list[j++] = i;
--temp[i];
}
}
}
}
時間複雜度: