2011-07-27 53 views
1

我執行在C#中使用BitArray的埃拉托色尼的篩算法4.代碼:C#BitArray和Int64的

cPrimesB = new BitArray((int)max, true); //in constructor 
primes = new List<ulong>(); //in constructor 

//the function 
public ulong findPrimesBa() 
    { 
     ulong count = 0; 
     for (ulong i = 2; i < max; i++) 
     { 
      if (cPrimesB[(int)i]) 
      { 
       //primes.Add(i); 
       count++; 
       for (ulong j = i + i; j < max; j = i + j) 
        cPrimesB[(int)j] = false; 
      } 
     } 

     return count; 
    } 

該算法的作品,但我的問題是,BitArray不UINT64,所以我的工作需要將ulong變量轉換爲int。問題在於,如果用戶輸入大於Int32.MaxValue的數字,則會影響性能並導致數據丟失。那麼有沒有一種方法(解決方法)與ulong一起使用BitArray,而無需投射?

+0

您是否嘗試過使用Array.ConvertAll? –

+1

你是否需要使用ulong(你需要找多大的素數)?你有使用BitArray嗎? – hatchet

+0

事情是我試圖比較一些主要生成算法的運行時性能,以及一些算法之間的差異,你會發現在性能上唯一真正的區別就是大數據投入時。這就是我需要ulong的原因。至於bitarray,我需要使用它,因爲Windows中每個進程的限制爲2GB。除BitArray之外的任何其他內容拋出OutOfMemoryException數字> 1bil – Lenquist

回答

0

我覺得你有三種選擇:

  1. 使用BitArray與轉換或ULONG的強制類型轉換來詮釋,你所做的一切,
  2. 使用BitArray與詮釋,因爲這是它被寫入使用,
  3. 使用BitArray以外的東西,如果沒有強制轉換就會佔用過多的時間。
+0

我我知道這些選擇,但都不夠好。第一個是因爲性能下降,我得到的是不可忽略的,第二個是因爲用戶輸入有限,第三個是因爲除了Byte數組外,其餘的內存都用盡了內存(儘管我只嘗試了一組布爾值,可能還有其他的東西我可以使用,我不知道)。 – Lenquist

+0

對於選擇3,您可以編寫自己的BitArray - 無論是從頭開始還是作爲BitArray的數組。 – hatchet

+0

雖然你沒有問過這個問題,但是在實現篩子的時候,有一種方法可以使貓變皮,一些比其他人更節省內存。 – hatchet