C#

2014-03-07 3 views
1

에 비트 [] 배열을 정의하는 중 현재 소수/소수점 계산기 용 솔루션을 작업 중입니다. algorythm은 이미 효과적이고 효율적으로 작동하고 있습니다 (처음 9소수의 경우 0,359 초). 여기에 모든 선언 상부 영역의 일부입니다 C#

const uint anz = 50000000; 


uint a = 3, b = 4, c = 3, d = 13, e = 12, f = 13, g = 28, h = 32; 
bool[,] prim = new bool[8, anz/10]; 
uint max = 3 * (uint)(anz/(Math.Log(anz) - 1.08366)); 
uint[] p = new uint[max]; 

가 지금은 다음 단계로 이동 ULONG을 사용하고 싶었 대신 UINT의 큰 영역을 커버의 것, (당신은 이미 볼 수 있습니다) 어디에서 내 문제 : 두려움 - 배열에 도청. 모두들 알다시피, bool은 배열을 생성 할 때 많은 메모리를 필요로하는 바이트 길이를 가지고 있습니다 ... 그래서 나는 그것을하기에 더 자원 친화적 인 방법을 찾고 있습니다. 제 첫 번째 아이디어는 비트 배열입니다 -> 바이트가 아닙니다! < - 부울을 저장하지만, 지금까지 어떻게하는지 알아 내지 못했습니다. 그래서 누군가가 이런 식으로 뭔가를했다면, 나는 모든 종류의 팁과 해결책을 고맙게 생각합니다. 미리 :) 감사

답변

1

잘 테스트되고 잘 알려진 라이브러리를 사용할 수 있습니다.

하지만 뭔가를 배우고 싶다면 (스스로 생각하는 것처럼) 스스로 할 수 있습니다.

맞춤 비트 배열을 사용하려는 또 다른 이유는 하드 드라이브를 사용하여 배열을 저장하는 것입니다.이 값은 소수를 계산할 때 편리합니다. 이렇게하려면 addr을 추가로 분할해야합니다 (예 : 마스크의 경우 하위 3 비트, 256MB 메모리 내 저장 공간의 경우 28 비트, 버퍼 파일의 경우 파일 이름).

아직까지 맞춤 비트 어레이의 또 다른 이유는 특별히 소수를 검색 할 때 메모리 사용을 압축하는 것입니다. 비트 수의 절반 이상이 '거짓'일 것입니다. 그 이유는 짝수 비트를 저장하지 않아도 실제로 계산 속도를 높이고 메모리 요구 사항을 줄일 수 있기 때문입니다. addr이 해석되는 방식을 변경하면됩니다. 더 나아가서는 3으로 나눌 수있는 숫자를 제외 할 수도 있습니다 (6 개의 숫자 중 2 개의 숫자 만 소수가 될 수 있습니다) 따라서 일반 비트 배열과 비교하여 메모리 요구량을 60 % 줄입니다.

코드를 좀 더 효율적으로 만들기 위해 시프트 연산자와 논리 연산자를 사용합니다. 분할은 2.6s VS 4.8s 시프트 대신 도시 대 예컨대

byte mask = (byte)(1 << (int)(addr & 7));byte mask = (byte)(1 << (int)(addr % 8));

addr >> 3로 기록 될 수 200,000,000 작업/addr/8

테스트 시프트/논리 연산자 논리 쓸 수 .

void Main() 
{ 
    var barr = new BitArray(10); 
    barr[4] = true; 
    Console.WriteLine("Is it "+barr[4]); 
    Console.WriteLine("Is it Not "+barr[5]); 
} 

public class BitArray{ 
    private readonly byte[] _buffer; 

    public bool this[long addr]{ 
     get{ 

     byte mask = (byte)(1 << (int)(addr & 7)); 
     byte val = _buffer[(int)(addr >> 3)]; 
     bool bit = (val & mask) == mask; 
     return bit; 
     } 
     set{ 
     byte mask = (byte) ((value ? 1:0) << (int)(addr & 7)); 
     int offs = (int)addr >> 3; 
     _buffer[offs] = (byte)(_buffer[offs] | mask); 
     } 
    } 

    public BitArray(long size){ 
     _buffer = new byte[size/8 + 1]; // define a byte buffer sized to hold 8 bools per byte. The spare +1 is to avoid dealing with rounding. 
    } 
}