最優化字串求質數演算法:
string 被除數 = "2", 除數 = "2", 除數後 = "2", 輸出 = "", 最小公倍集 = string.join("\r\n", 讀文字記錄(@system.environment.currentdirectory + "\\求質數\\最小公倍集.txt"));
list讀被除數 = 讀文字記錄(@system.environment.currentdirectory + "\\求質數\\被除數.txt"), 質數檔案集 = 讀文字記錄(@system.environment.currentdirectory + "\\求質數\\質數檔案集.txt"), 讀質數集 = new list(), 讀最大開方 = new list();
string 讀質數檔案集 = directory.getfiles(@system.environment.currentdirectory + "\\求質數", "質數集*.txt", searchoption.topdirectoryonly);// 讀文字記錄(@system.environment.currentdirectory + "\\求質數\\質數集.txt");
質數檔案集.addrange(讀質數檔案集.select(處理 => 處理.replace(system.environment.currentdirectory + "\\求質數\\", "").replace(".txt", "")).tolist());
質數檔案集 = 質數檔案集.distinct().tolist();
寫改記錄(string.join("\r\n", 質數檔案集), "求質數", "質數檔案集", "", false);
int 質素序 = 0, 開方序 = 0, 最大開方 = 0, 質數檔案量 = 0, 讀檔案 = 1, 輸出量 = 0;
func增進 = delegate(string 增數)
;action 增質素量 = delegate()
;action 前進 = delegate()
;action 讀入資料 = delegate()
if (質數檔案量 > 1)
讀最大開方 = 讀文字記錄(@system.environment.currentdirectory + "\\求質數\\最大開方.txt");
最大開方 = 讀最大開方.count > 0 ? int.parse(讀最大開方[1]) : 讀質數集.count - 1;
};讀入資料();
if (讀被除數.count > 0) 被除數 = 增進(讀被除數[0]);
if (最大開方 > 1) 開方序 = 最大開方;// = 讀質數集.lastindexof(讀最大開方);
doif (!最小公倍集.contains(" " + (!正商 ? 除數 : 除數後)))
最小公倍集 += "\r\n" + 被除數 + " " + (!正商 ? 除數 : 除數後) + " " + (!正商 ? 質素序 : 開方序);
if (輸出量 % 100 == 0)
寫改記錄(最小公倍集, "求質數", "最小公倍集", 被除數, false);
if (最大開方 > 1)
開方序 = 最大開方;
前進();
}else
else
}console.write(" ", 被除數);
if (質數檔案量 == 0)
else
開方序 = 最大開方;
前進();
}} while (被除數.length < int.maxvalue);
文字操作參考
以前回答小範圍內的運算不會去考慮優化演算法提高效率問題,如今,求素數為int.maxvalue位字串範圍進行運算,這麼大的範圍就不得不考慮了,優化就很必要了,從4點去優化:
1.被除數不按1步進,改為2步進,質數2之後的都是奇數,如3開始按步進2進行就都是奇數了,從而跳過偶數來減少迴圈計算量;
2.除數不按1步進,而從已找到的質數集合中取,這樣就可以避開2 3 5 7 11等的倍數,其一所有偶數都是2的倍數,其二能被前面奇數排除的自然也是倍數,倍數都不必再做多餘的運算,同時也不在質數內,所以用質數作除數是最合理的減少迴圈計算量,質素還有乙個特性就是個位除了5以外大於5的質素不再含有個位為5的數了;
3.乙個數的最大倍數是它的平方根,在質數集中找到該平方根的序,再往後推一位序,就是取下一位質數來做除數,把除數的取數範圍安排在最合理的區間內來減少迴圈計算量;
4.採用雙向運算來提高剔除非質數的速度來減少迴圈計算量;
通過以上4處優化,顯著提高了運算速度,以前2天的計算量,現在輕鬆做到.是否進行優化是要有分析依據的.
20位計算
40位計算
80位計算
640位計算
控制台程式採用並行語句,大幅降低執行時間。
兩個字串比較求最優演算法
背景如下 1.char1是乙個由各種字母組成的字串 2.char2是另外乙個相對較短的字串 問題 什麼方法能最快的查出是否所有小字串裡的字母在大字串裡都有?例如 char1 asqwertyzxcvbplk char2 aksectyp 方法1 對於這種操作一種幼稚的做法是輪詢第二個字串裡的每個字母...
Python 字串最優分割
給定乙個有小寫字母組成的字串s,將其分割成盡量多的子串,並保證每個字母最多隻在其中乙個子串中出現。請返回由乙個或多個整數表示的分割後各個子串的長度。如 ababbacadefgdehijhklij ababbaca defgde hijhklij str1 ababbacadefgdehijhkli...
幾種優化(求最優解)演算法的比較
原文 幾種優化 求最優解 演算法的比較 遺傳演算法 優點是能很好的處理約束,能很好的跳出區域性最優,最終得到全域性最優解,全域性搜尋能力強 缺點是收斂較慢,區域性搜尋能力較弱,執行時間長,且容易受引數的影響。遺傳演算法適合求解離散問題,具備數學理論支援,但是存在著漢明懸崖等問題。模擬退火 優點是區域...