經典篩法(從2到√n刪除倍數)存在三大效率問題:
class PrimeOptimized {
public static int[] PrimeList;
public static void FindPrime(int n) {
int[] intList = new int[n];
int len = n - 1;
for (int p = 2; p <= n; p++) intList[p-1] = p;
for (int p = 2; p <= Math.Sqrt(n); p++) {
if (intList[p-1] == 0) continue; // 跳過合數
int j = p * p; // 從p²開始,更小倍數已被處理
while (j <= n) {
if (intList[j-1] != 0) {
intList[j-1] = 0;
len--;
}
j += p;
}
}
PrimeList = new int[len];
int idx = 0;
for (int p = 2; p <= n; p++) {
if (intList[p-1] != 0) PrimeList[idx++] = intList[p-1];
}
}
}
關鍵改進:
continue,避免無效除數操作。p*p起步,減少重複標記。static void Main() {
Console.WriteLine("Start!");
var t1 = DateTime.Now; PrimeOptimized.FindPrime(100000); var t2 = DateTime.Now;
var t3 = DateTime.Now; PrimeNaive.FindPrime(100000); var t4 = DateTime.Now;
Console.WriteLine($"優化版: {(t2-t1).Ticks} ticks");
Console.WriteLine($"原版: {(t4-t3).Ticks} ticks");
}
實測優化版耗時僅為原版的1/30 ~ 1/60。時間複雜度從近似O(n^1.5)降至O(n)量級,充分體現算法設計對性能的決定性影響。