C\#비트 맵 BitArray 사용
비트 맵
먼저 문 제 를 살 펴 보 자.만약 에 1 천만 개의 정수 가 있다 면 정수 범 위 는 1 억 에서 1 억 사이 에 있 는데 어떻게 특정한 정수 가 이 1 천만 개의 정수 에 있 는 지 신속하게 확인 할 수 있 을 까?
얼핏 보면 문 제 를 찾 는 것 이 고 순환,2 분 검색 은 모두 일반적인 사고 이다.
좋 은 답 은 저장 구조 와 알고리즘 의 완벽 한 결합 이다.문제 의 특징 과 조건 을 바탕 으로 우리 가 다른 사고방식 을 가지 고 있 는 지 여부 다.
문제 에 대해 우 리 는 고등학교 배열 조합의 사 고 를 사용한다.1 억 개의 번호 가 있 는 빈 바구니 가 있 는데 우 리 는 이 1 천만 개의 숫자 가 있 는 공 을 꺼 내 해당 하 는 바구니 에 넣는다.
마지막 으로 모든 바 구 니 는 두 가지 상태 가 있다.공이 있 는 지 없 는 지,우 리 는 어떤 숫자 가 존재 하 는 지 확인 하려 면 해당 바구니 가 비어 있 는 지 를 봐 야 한다.
비트 맵 이 무엇 입 니까?모든 사람 이 특정한 상 태 를 저장 하고 대량의 데 이 터 를 저장 하 며 데이터 가 존재 하 는 지 여 부 를 판단 하 는 데 사용 된다.비트 맵 의 공간 은 데이터 의 최대 값 에 의 해 결정 된다.
비트 맵 이라는 데이터 구 조 는 메모리 의 사용량 을 크게 절약 할 수 있다.
우 리 는 길이 가 1 억 인 bit 배열 을 만 들 고 공의 위 치 를 1 로 표시 하 며 공 없 는 위 치 는 기본적으로 0 으로 기록 해 야 한다.이렇게 해서 우 리 는 숫자 를 압축 된 치밀 한 배열 색인 으로 바 꾸 었 고 1 억 bit 배열 은 16M 공간 이 되 지 않 았 다.
어떤 위치 에 공이 있 는 지 확인 하려 면 O(1)의 시간 복잡 도 만 필요 하 다.
상용 속성
Count BitArray 에 인 스 턴 스 를 포함 하 는 개수
IsReadOnly 에서 값 을 가 져 옵 니 다.이 값 은 BitArray 가 읽 기만 하 는 지 여 부 를 표시 합 니 다.
Item BitArray 의 특정 위치 값 가 져 오기 또는 설정
Length BitArray 에서 요소 의 수 를 가 져 오 거나 설정 합 니 다.
상용 방법
And 지정 한 BitArray 에 해당 하 는 요소 와 and 연산 하기
Or 비트 또는 연산
Xor 비트 별 또는 연산
모든 요 소 를 되 돌리 지 않 음
Get 특정 위치의 값 가 져 오기
Set 특정 위치 값 설정
SetAll 은 BitArray 의 모든 요 소 를 지정 한 값 으로 설정 합 니 다.
public sealed class BitArray : ICollection, IEnumerable, ICloneable
{
public BitArray(BitArray bits); // BitArray BitArray
public BitArray(bool[] values); //
public BitArray(byte[] bytes); //
public BitArray(int length); // ,
public BitArray(int[] values); // int
public BitArray(int length, bool defaultValue); //
public int Count { get; } //
public bool IsReadOnly { get; } //
public bool IsSynchronized { get; } // BitArray ,
public int Length { get; set; } //
public object SyncRoot { get; }
public bool this[int index] { get; set; } // ,
public BitArray And(BitArray value); //
public object Clone(); // BitArray 。
public void CopyTo(Array array, int index); // BitArray
public bool Get(int index); //
public IEnumerator GetEnumerator(); // BitArray
public BitArray Not(); //
public BitArray Or(BitArray value); //
public void Set(int index, bool value); //
public void SetAll(bool value); //
public BitArray Xor(BitArray value); //
}
C\#전문 적 인 비트 맵 배열 이 있 습 니 다:BitArray
using System;
using System.Collections;
namespace Bitmap
{
class Program
{
static void Main(string[] args)
{
var input = Console.ReadLine();
var num = int.Parse(input);
var bitmap = InitBitMap();
if (bitmap.Get(num))
{
Console.WriteLine($" {num}");
}
else
{
Console.WriteLine($" {num}");
}
}
public static BitArray InitBitMap()
{
var myBA1 = new BitArray(10000);
var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
foreach (int element in arr1)
{
myBA1[element] = true;
}
return myBA1;
}
}
}
BitArray 는 비트 값 을 관리 하 는 빈 틈 없 는 배열 로,그 중에서 true 는 비트 가 열 려 있 음(1),false 는 비트 가 닫 혀 있 음(0)을 나타 내 는 인용 형식 으로 System.Collections 네 임 스페이스 에 있 습 니 다.이상 은 소 칼 시험 일 뿐 입 니 다.우 리 는 원 제 를 대상 으로 다시 한 번 발산 합 니 다.어떻게 상기 1 천만 숫자 에서 중복 되 는 숫자 를 찾 습 니까?
아니면 바구니 에서 공 을 넣 는 사고 인지 이번 에는 두 줄 의 바구니,즉 두 개의 비트 맵 을 원 합 니 다.비트 AND 연산(동시에 True,결과 가 True)을 이용 하여 두 줄 의 바구니 에 모두 공이 있 는 위 치 를 찾 아야 합 니 다.
using System;
using System.Collections;
namespace Bitmap
{
class Program
{
static void Main(string[] args)
{
var bitmap = InitBitMap();
for (int i = 0; i < bitmap.Length; i++)
{
if(bitmap[i] == true)
{
Console.WriteLine(i);
}
}
}
public static BitArray InitBitMap()
{
var myBA1 = new BitArray(10000);
var myBA2 = new BitArray(10000);
var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
foreach (int element in arr1)
{
if (myBA1[element] == false)
{
myBA1[element] = true;
}
else
{
myBA2[element] = true;
}
}
myBA1 = myBA1.And(myBA2);
return myBA1;
}
}
}
마지막 알림:보물 구성 요소 Redis 천연 지원 비트 맵C\#비트 맵 BitArray 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#비트 맵 BitArray 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.