字串核對
解法:字串搜尋本身不難,使用暴力法也可以求解,但如何快速搜尋字串就不簡單了,傳統的字串搜尋是從關鍵字與字串的開頭開始比對,例如knuth-morris-pratt演演算法字串搜尋,這個方法也不錯,不過要花時間在公式計算上;
boyer-moore字串核對改由關鍵字的後面開始核對字串,並製作前進表,如果比對不符合則依前進表中的值前進至下乙個核對處。boyer-moore演算法的基本思想是:每次後移"壞字元規則","好字尾規則"之中的較大值。更巧妙的是,這兩個規則的移動位數,只與搜尋詞有關,與原字串無關。因此,可以預先計算生成《壞字元規則表》和《好字尾規則表》。使用時,只要查表比較一下就可以了。此演算法適合於長字串匹配,是目前許多字串查詢工具採用的演算法。
揹包問題(knapsack problem)
解法:揹包問題是關於最佳化的問題,要解最佳化問題可以使用動態規劃(dynamicprogramming),從空集合開始,每增加乙個元素就先求出該階段的最佳解,直到所有的元素加入至集合中,最後得到的就是最佳解。
蒙地卡羅法求 pi
說明:蒙地卡羅為摩洛哥王國之首都,該國位於法國與義大利國境,以賭博聞名。蒙地卡羅的基本原理為以亂數配合面積公式來進行解題,這種以機率來解題的方式帶有賭博的意味,雖然在精確度上有所疑慮,但其解題的思考方向卻是個值得學習的方式。
解法:蒙地卡羅的解法適用於與面積有關的題目,例如求pi值或橢圓面積,這邊介紹如何求pi值;假設有乙個圓半徑為1,所以四分之一圓面積就為pi,而包括此四分之一圓的正方形面積就為1,如下圖所示:如果隨意的在正方形中投射飛標(點)好了,則這些飛標(點)有些會落於四分之一圓內,假設所投射的飛標(點)有n點,在圓內的飛標(點)有c點,則依比例來算,就會得到上圖中最後的公式。至於如何判斷所產生的點落於圓內,很簡單,令亂數產生x與y兩個數值,如果x^2+y^2等於1就是落在圓內。
eratosthenes篩選求質數
說明:除了自身之外,無法被其它整數整除的數稱之為質數,要求質數很簡單,但如何快速的求出質數則一直是程式設計人員與數學家努力的課題,在這邊介紹乙個著名的eratosthenes求質數方法。
解法:這個問題可以使用迴圈來求解,將乙個指定的數除以所有小於它的數,若可以整除就不是質數,然而如何減少迴圈的檢查次數?如何求出小於n的所有質數?
首先假設要檢查的數是n好了,則事實上只要檢查至n的開根號就可以了,道理很簡單,假設a*b=n,如果a大於n的開根號,則事實上在小於a之前的檢查就可以先檢查到b這個數可以整除n。不過在程式中使用開根號會有精確度的問題,所以可以使用i*i <= n進行檢查,且執行更快。
再來假設有乙個篩子存放1~n,例如:
2 3 4 5 6 7 8 9 10 11 12 ........n
先將2的倍數篩去:
2 3 5 7 9 11 13........n
再將3的倍數篩去:
2 3 5 7 11 13 17 19........n
再來將5的倍數篩去,再來將7的質數篩去,再來將11的倍數篩去........,如此進行到最後留下的數就都是質數,這就是eratosthenes篩選方法數。
事實上,只要檢查6n+1與6n+5就可以了,也就是直接跳過2與3的倍數,使得程式中的if的檢查動作可以減少。
超長整數運算(大數運算)
說明:基於記憶體的有效運用,程式語言中規定了各種不同的資料型態,也因此變數所可以表達的最大整數受到限制,例如123456789123456789這樣的整數就不可能儲存在long變數中(例如c/c++等),我們稱這為long數,這邊翻為超長整數(避免與資料型態的長整數翻譯混淆),或俗稱大數運算。
解法:乙個變數無法表示超長整數,則就使用多個變數,當然這使用陣列最為方便,假設程式語言的最大資料型態可以儲存至65535的數好了,為了計算方便及符合使用十進位制的習慣,讓每乙個陣列元素可以儲存四個位數,也就是0到9999的數。由於使用陣列來儲存數值,關於數值在運算時的加減乘除等各種運算、位數的進製或借位就必須自行定義,加、減、乘都是由低位數開始運算,而除法則是由高位數開始運算。
排序演算法review 1 直接插入排序
簡單插入排序的基本思想 對於原待排序記錄中的第i 1 i n 1 個元素ki,保證其前面的i個元素已經是有序的,要在這前i個元素 k0 ki 1 中找到合適的位置將第i個元素插入,具體的方法是 將ki與ki 1,ki 2,k0比較,找到應該插入的位置,從該位置到第i 1個位置的元素後移喲個位置,將空...
經典KMP演算法整理
kmp演算法 大名鼎鼎的演算法 kmp由三位前輩的名字縮寫組成 其中第一位就是寫the art of the computer programming的高德納 它是一種效率很高的字串匹配演算法 傳統樸素做法的時間複雜度為o n m 而kmp演算法能將時間複雜度縮小到o n m 下面進入正題 kmp演...
經典排序演算法整理1 0
對一串行物件根據某個關鍵字進行排序叫做排序 穩定與不穩定 若排序前a在b之前且a b,排序後a還在b前叫做穩定,若a不一定在b前叫做不穩定.內排序與外排序 所有排序都在記憶體中完成叫做內排序 由於資料量大,所以把資料放在磁碟中,而外排序就是必須得通過磁碟和內初的資料傳輸才能進行的排序.複雜度 複雜度...