演算法是啥
『壹』 常用的排序演算法都有哪些
排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
分類
在計算機科學所使用的排序演算法通常被分類為:
計算的復雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O。(n log n),且壞的行為是Ω(n2)。對於一個排序理想的表現是O(n)。僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要Ω(n log n)。
記憶體使用量(以及其他電腦資源的使用)
穩定度:穩定排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。也就是一個排序演算法是穩定的,就是當有兩個有相等關鍵的紀錄R和S,且在原本的串列中R出現在S之前,在排序過的串列中R也將會是在S之前。
一般的方法:插入、交換、選擇、合並等等。交換排序包含冒泡排序(bubble sort)和快速排序(quicksort)。選擇排序包含shaker排序和堆排序(heapsort)。
當相等的元素是無法分辨的,比如像是整數,穩定度並不是一個問題。然而,假設以下的數對將要以他們的第一個數字來排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在這個狀況下,有可能產生兩種不同的結果,一個是依照相等的鍵值維持相對的次序,而另外一個則沒有:
(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)
不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地時作為穩定。作這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。
排列演算法列表
在這個表格中,n是要被排序的紀錄數量以及k是不同鍵值的數量。
穩定的
冒泡排序(bubble sort) — O(n2)
雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體
計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體
歸並排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體
原地歸並排序 — O(n2)
二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體
鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體
基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體
不穩定
選擇排序 (selection sort)— O(n2)
希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情況時間, 需要 額外的 O(n + k) 空間, 也需要找到最長的遞增子序列(longest increasing subsequence)
不實用的排序演算法
Bogo排序 — O(n × n!) 期望時間, 無窮的最壞情況。
Stupid sort — O(n3); 遞回版本需要 O(n2) 額外記憶體
Bead sort — O(n) or O(√n), 但需要特別的硬體
Pancake sorting — O(n), 但需要特別的硬體
排序的演算法
排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。這裡面插入排序和冒泡排序又被稱作簡單排序,他們對空間的要求不高,但是時間效率卻不穩定;而後面三種排序相對於簡單排序對空間的要求稍高一點,但時間效率卻能穩定在很高的水平。基數排序是針對關鍵字在一個較小范圍內的排序演算法。
插入排序
冒泡排序
選擇排序
快速排序
堆排序
歸並排序
基數排序
希爾排序
插入排序
插入排序是這樣實現的:
首先新建一個空列表,用於保存已排序的有序數列(我們稱之為"有序列表")。
從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態。
重復2號步驟,直至原數列為空。
插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。它藉助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等於原列表的長度。
冒泡排序
冒泡排序是這樣實現的:
首先將所有待排序的數字放入工作列表中。
從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。
重復2號步驟,直至再也不能交換。
冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的演算法。
選擇排序
選擇排序是這樣實現的:
設數組內存放了n個待排數字,數組下標從1開始,到n結束。
i=1
從數組的第i個元素開始到第n個元素,尋找最小的元素。
將上一步找到的最小元素和第i位元素交換。
如果i=n-1演算法結束,否則回到第3步
選擇排序的平均時間復雜度也是O(n²)的。
快速排序
現在開始,我們要接觸高效排序演算法了。實踐證明,快速排序是所有排序演算法中最高效的一種。它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序演算法中,演算法的高效與否與列表中數字間的比較次數有直接的關系,而"保證列表的前半部分都小於後半部分"就使得前半部分的任何一個數從此以後都不再跟後半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。
堆排序
堆排序與前面的演算法都不同,它是這樣的:
首先新建一個空列表,作用與插入排序中的"有序列表"相同。
找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。
重復2號步驟,直至原數列為空。
堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特徵,使得"找到數列中最大的數字"這樣的操作只需要O(1)的時間復雜度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種演算法中比較難實現的)。
看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的演算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。
平均時間復雜度
插入排序 O(n2)
冒泡排序 O(n2)
選擇排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
歸並排序 O(n log n)
基數排序 O(n)
希爾排序 O(n1.25)
冒泡排序
654
比如說這個,我想讓它從小到大排序,怎麼做呢?
第一步:6跟5比,發現比它大,則交換。564
第二步:5跟4比,發現比它大,則交換。465
第三步:6跟5比,發現比它大,則交換。456
『貳』 數學中都有什麼演算法啊
定義法、配方法、待定系數法、換元法、反證法、數學歸納法、導數法、賦值法、消去法、定比分離法、比較法、分析法、綜合法 ,,,還有很多桑
介里有幾個比較詳細的哈。。。
一、換元法
「換元」的思想和方法,在數學中有著廣泛的應用,靈活運用換元法解題,有助於數量關系明朗化,變繁為簡,化難為易,給出簡便、巧妙的解答。
在解題過程中,把題中某一式子如f(x),作為新的變數y或者把題中某一變數如x,用新變數t的式子如g(t)替換,即通過令f(x)=y或x=g(t)進行變數代換,得到結構簡單便於求解的新解題方法,通常稱為換元法或變數代換法。
用換元法解題,關鍵在於根據問題的結構特徵,選擇能以簡馭繁,化難為易的代換f(x)=y或x=g(t)。就換元的具體形式而論,是多種多樣的,常用的有有理式代換,根式代換,指數式代換,對數式代換,三角式代換,反三角式代換,復變數代換等,宜在解題實踐中不斷總結經驗,掌握有關的技巧。
例如,用於求解代數問題的三角代換,在具體設計時,宜遵循以下原則:(1)全面考慮三角函數的定義域、值域和有關的公式、性質;(2)力求減少變數的個數,使問題結構簡單化;(3)便於藉助已知三角公式,建立變數間的內在聯系。只有全面考慮以上原則,才能謀取恰當的三角代換。
換元法是一種重要的數學方法,在多項式的因式分解,代數式的化簡計算,恆等式、條件等式或不等式的證明,方程、方程組、不等式、不等式組或混合組的求解,函數表達式、定義域、值域或最值的推求,以及解析幾何中的坐標替換,普通方程與參數方程、極坐標方程的互化等問題中,都有著廣泛的應用。
二、消元法
對於含有多個變數的問題,有時可以利用題設條件和某些已知恆等式(代數恆等式或三角恆等式),通過適當的變形,消去一部分變數,使問題得以解決,這種解題方法,通常稱為消元法,又稱消去法。
消元法是解方程組的基本方法,在推證條件等式和把參數方程化成普通方程等問題中,也有著重要的應用。
用消元法解題,具有較強的技巧性,常常需要根據題目的特點,靈活選擇合適的消元方法
三、待定系數法
按照一定規律,先寫出問題的解的形式(一般是指一個算式、表達式或方程),其中含有若干尚待確定的未知系數的值,從而得到問題的解。這種解題方法,通常稱為待定系數法;其中尚待確定的未知系數,稱為待定系數。
確定待定系數的值,有兩種常用方法:比較系數法和特殊值法。
四、判別式法
實系數一元二次方程
ax2+bx+c=0 (a≠0) ①
的判別式△=b2-4ac具有以下性質:
>0,當且僅當方程①有兩個不相等的實數根
△ =0,當且僅當方程①有兩個相等的實數根;
<0,當且僅當方程②沒有實數根。
對於二次函數
y=ax2+bx+c (a≠0)②
它的判別式△=b2-4ac具有以下性質:
>0,當且僅當拋物線②與x軸有兩個公共點;
△ =0,當且僅當拋物線②與x軸有一個公共點;
<0,當且僅當拋物線②與x軸沒有公共點。
五、 分析法與綜合法
分析法和綜合法源於分析和綜合,是思維方向相反的兩種思考方法,在解題過程中具有十分重要的作用。
在數學中,又把分析看作從結果追溯到產生這一結果的原因的一種思維方法,而綜合被看成是從原因推導到由原因產生的結果的另一種思維方法。通常把前者稱為分析法,後者稱為綜合法。
六、 數學模型法
例(哥尼斯堡七橋問題)18世紀東普魯士哥尼斯堡有條普萊格河,這條河有兩個支流,在城中心匯合後流入波羅的海。市內辦有七座各具特色的大橋,連接島區和兩岸。每到傍晚或節假日,許多居民來這里散步,觀賞美麗的風光。年長日久,有人提出這樣的問題:能否從某地出發,經過每一座橋一次且僅一次,然後返回出發地?
數學模型法,是指把所考察的實際問題,進行數學抽象,構造相應的數學模型,通過對數學模型的研究,使實際問題得以解決的一種數學方法。
七、配方法
所謂配方,就是把一個解析式利用恆等變形的方法,把其中的某些項配成一個或幾個多項式正整數次冪的和形式。通過配方解決數學問題的方法叫配方法。其中,用的最多的是配成完全平方式。配方法是數學中一種重要的恆等變形的方法,它的應用十分非常廣泛,在因式分解、化簡根式、解方程、證明等式和不等式、求函數的極值和解析式等方面都經常用到它。
八、因式分解法
因式分解,就是把一個多項式化成幾個整式乘積的形式。因式分解是恆等變形的基礎,它作為數學的一個有力工具、一種數學方法在代數、幾何、三角等的解題中起著重要的作用。因式分解的方法有許多,除中學課本上介紹的提取公因式法、公式法、分組分解法、十字相乘法等外,還有如利用拆項添項、求根分解、換元、待定系數等等。
九、換元法
換元法是數學中一個非常重要而且應用十分廣泛的解題方法。我們通常把未知數或變數稱為元,所謂換元法,就是在一個比較復雜的數學式子中,用新的變元去代替原式的一個部分或改造原來的式子,使它簡化,使問題易於解決。
介里LL沒有說很詳細桑,,,,內啥簡便演算法我也一起說了桑丶
乘法交換律,乘法分配律,加法交換律,加法結合律,乘法分配律,
『叄』 數學建模裡面的模型和演算法有啥區別
模型是一個或者一系列的數學表達式,用來描述所要解決的問題。
演算法是解決這個模型,也就是這些表達式的具體過程,常常結合編程解決。
『肆』 基因遺傳演演算法是個啥求詳解
基因遺傳演演算法主要理論就是優勝劣汰的進化論。
它的主要精神是透過每次迭代都能比上次更進步,逐步演化,表現出針對一個目標函數尋求最佳解的過程。但是因為是隨機搜索,所以雖然基因演演算法設置如交配、突變等來避免,卻仍可能會陷入區域最佳解;也有可能最後得到的不是最佳解,只是在結束條件之前找到的最好的解。
基本的基因演演算法流程:
1.初始化族群:假定這個族群中有4條染色體,每條染色體有5個基因。
基因 -從目標函數的角度來看,就是自變數。
例如:用基因演演算法解目標函數 f(X,Y,Z)=2X+3Y-Z,
限制式為「X,Y,Z={1,0}」※,
求目標函數的最大值。
此題目對應到染色體的概念,就有3個基因,
三個基因分別代表X、Y、Z三個自變數的值。
染色體 -單一組解
例如:有很多符合目標函數限制式的(X,Y,Z),
其中一組是(x1,y1,z1)=(1,0,0),
函數值 f(x1,y1,z1)為2*1+3*0-0=2。
此例中,這組解當然不是最佳解,但它是這個題目的一個可行解。
*想像我們用直覺解題,拿張計算紙,把所有可行解都列出來,
然後比較所有我們想得到的可行解,最後可以得
到最佳的一組(X,Y,Z),因為它的f(X,Y,Z)為最大值。
族群 -多組解的集合
例如:族群中有四條染色體,這四條染色體就是四組可行解。
2.設定交配率和突變率:假定交配率a為0.6,突變率b為0.1。
交配率 -每個世代中,族群內有多少比率的染色體會互相交配。
突變率 -每個世代中,族群內的染色體有多少機率會突變。
3.迭代世代。
For iter=10 -假定做十次優勝劣汰。
3.1. 天擇:在這個世代中,根據每條染色體的權重,隨機選擇母代來產生後代,
用以做下一個運算。
通常使用輪盤法來作天擇,也就是說,
如果染色體甲的解是這個族群中最好的,
那麼甲的權重就是最高的。反之則是最低的。
*輪盤法:假定這次族群為「[1,1,1],[0,1,1],[1,0,1],[1,0,0]」,
四條染色體的適應值分別是「4,2,1,2」,
適應值總和為4+2+1+2=9,
則四條染色體被選到的機會為「4/9,2/9,1/9,2/9」
=「0.4,0.2,0.1,0.2」。這個機會就是權重。
為了不讓每次選擇都選到同一條染色體,所以只是
「有比較高的機會」選擇到「有更好適應值的染色體」,
而不是一定會選擇這個好適應值的染色體。
3.2. 交配:母代產生後,依照交配率a,隨機選擇染色體來作交配。
比較交配前的子代1和交配後的子代2,在8條染色體中,
選擇適應值最好的4條染色體留下來。
最簡單的交配方式就是交換兩條染色體的某個基因。
*例如,染色體S=[0,1,0],染色體Q=[1,1,1],交配位於首位的基因,
則可以得到新的兩條染色體S'=[1,1,0]、Q'=[0,1,1]。
3.3. 突變:交配完後,依照突變率b,決定這一個世代要不要突變。
假設要突變,則若突變後子代3的適應值比突變前子代2好,就用子代3取代子代2。
最簡單的突變方式就是隨機選擇某條染色體的某個基因,改變它。
*例如,隨機選中染色體M=[1,0,1],隨機突變中間的基因,
得到新染色體M'=[1,1,1] 。
3.4. 更新:最後得到的族群中,所有染色體的適應值。
END For
4. 比較所有染色體的適應值,列出最好的那一個染色體為演演算法最後的解。
※一般使用二元染色體,限制染色體的基因只會等於零或壹。
在此處只是方便解說,所以直接把限制式設成零和壹。
假設我們用二元染色體來解目標函數f(x)=x^2的最大值,限制式為0<=x<=7,x為整數。
用基因演演算法求解,則需要產生log_2(8)=3個基因,
簡單說來,就是用二進位表示一個有限整數值。
(也可以把基因想成電腦的位元數,我們用三個位元來表示一個有限的整數值。)
這樣做的話,突變的方法就是直接把某個基因轉成零或壹,
不用設定要更改多少值(例如加3、加100或減0.8)(基因演演算法應該一般不會這樣做);
計算適應值時,互相轉換二進位與十進位。
基因三個,則可以表達:
111=2^2+2^1+2^0=4+2+1=7
110=2^2+2^1=4+2=6
101=2^2+2^0=4+1=5
100=4
001=1
000=0
011=3
010=2