해시 확장 - 비트 맵
5037 단어 데이터 구조
비트 비트 비트 는 0 또는 1 로 설정 할 수 있 으 며, 40 억 개의 데 이 터 를 표시 하려 면 0.5GB 의 메모 리 를 신청 할 수 있다.저장 할 데이터 가 10 이면 10 번 째 비트 비트 를 1 로 설정 합 니 다.찾 으 려 는 데이터 가 100 이면 100 번 째 비트 위치의 상 태 를 보고 1 로 설명 하면 100 이 이 데이터 더미 에 존재 하 며 0 으로 설명 하면 존재 하지 않 습 니 다.이렇게 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트
비트 맵 의 가장 큰 장점 은 공간 을 절약 하 는 것 이다.그러나 데이터 가 존재 하 는 지 여 부 를 표시 할 뿐 데 이 터 를 저장 할 수 없다 는 것 이 가장 큰 단점 이다.
다음은 비트 맵 의 기본 동작 을 실현 하 겠 습 니 다.
1. 구조 정의
그 중에서 capacity 는 수용 할 수 있 는 요소 가 얼마나 되 는 지 를 나타 낸다. 이것 은 초기 화 할 때 길 이 를 정 한 다음 에 공간 을 신청 해 야 한다.그 후에 공간 이 너무 작다 고 생각하면 다시 확장 할 수 있다.
#pragma once
#include
#include //uint64_t
#include
#include
#define SHOW_NAME printf("
========================%s=======================
", __FUNCTION__);
typedef uint64_t BitmapType;//uint64_t , 8
typedef struct Bitmap
{
BitmapType* data;
uint64_t capacity;
}Bitmap;
2. 초기 화
//1.
void BitmapInit(Bitmap* bm, uint64_t capacity)//
{
if(bm == NULL)//
return;
bm->capacity = capacity;// (bit )
uint64_t size = bm->capacity/(sizeof(bm->data[0])*8) + 1;//
bm->data = (BitmapType*)malloc(sizeof(BitmapType)*size);
memset(bm->data, 0, sizeof(BitmapType)*size);//
return;
}
3. 소각
//2.
void BitmapDestroy(Bitmap* bm)
{
if(bm == NULL)
return;
bm->capacity = 0;
free(bm->data);
return;
}
4. 테스트 함수 - 어떤 비트 가 0 인지 1 인지 테스트 합 니 다.
//3. — 0
void GetOffset(uint64_t index, uint64_t* n, uint64_t* offset)//
{//n ,offset
*n = index / (sizeof(BitmapType)*8);
*offset = index % (sizeof(BitmapType)*8);
return;
}
int BitmapTest(Bitmap* bm, uint64_t index)// bit 1 1, 0 0
{//index bit
if(bm == NULL || index >= bm->capacity)//
return 0;
uint64_t n,offset;
GetOffset(index, &n, &offset);
uint64_t ret = bm->data[n] & (0x1ul << offset);// 0x1ul
return ret > 0 ? 1 : 0;
}
5. 비트 비트 비트 를 1 로 설정
//4. 1
void BitmapSet(Bitmap* bm, uint64_t index)
{
if(bm == NULL || index >= bm->capacity)//
return;
uint64_t n,offset;
GetOffset(index, &n, &offset);
bm->data[n] |= (0x1ul << offset);// 1 1
return;
}
6. 비트 비트 비트 를 0 으로 설정
//5. 0
void BitmapUnSet(Bitmap* bm, uint64_t index)
{
if(bm == NULL || index >= bm->capacity)//
return;
uint64_t n,offset;
GetOffset(index, &n, &offset);
bm->data[n] &= ~(0x1ul << offset);// 0 0
return;
}
7. 모든 비트 비트 비트 를 1 로 설정
//6. 1
void BitmapFill(Bitmap* bm)
{
if(bm == NULL)//
return;
uint64_t size = bm->capacity/(sizeof(bm->data[0])*8) + 1;
memset(bm->data, 0xff, sizeof(BitmapType)*size);
return;
}
8. 모든 비트 비트 비트 를 0 으로 설정
//7. 0
void BitmapEmpty(Bitmap* bm)
{
if(bm == NULL)//
return;
uint64_t size = bm->capacity/(sizeof(bm->data[0])*8) + 1;
memset(bm->data, 0x0, sizeof(BitmapType)*size);
return;
}
다음은 테스트 함수:
void Test()
{
SHOW_NAME;
Bitmap bm;
BitmapInit(&bm, 100);
printf("capacity: expected is 100, actual is %d
", bm.capacity);
printf("expected is 0, actual is %lu
", bm.data[0]);//uint64_t %lu
BitmapSet(&bm, 4);
printf("expected is 1, actual is %d
", BitmapTest(&bm, 4));
BitmapUnSet(&bm, 7);
printf("expected is 0, actual is %d
", BitmapTest(&bm, 7));
BitmapFill(&bm);
printf("expected is 1, actual is %d
", BitmapTest(&bm, 31));
BitmapEmpty(&bm);
printf("expected is 0, actual is %d
", BitmapTest(&bm, 27));
BitmapDestroy(&bm);
printf("expected is 0, actual is %d
", bm.capacity);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.