1. 程式人生 > >幾個著名而又非常有用的演算法

幾個著名而又非常有用的演算法

演算法案例:

主要有輾轉相除法、更相減損術、秦九韶演算法、k進位制化十進位制的演算法。

輾轉相除的定義:

所謂輾轉相除法,就是對於給定的兩個數,用較大的數除以較小的數。若餘數不為零,則將餘數和較小的數構成新的一對數,繼續上面的除法,直到大數被小數除盡,則這時較小的數就是原來兩個數的最大公約數。

更相減損術的定義:

就是對於給定的兩個數,用較大的數減去較小的數,然後將差和較小的數構成新的一對數,再用較大的數減去較小的數,反覆執行此步驟直到差數和較小的數相等,此時相等的兩數便為原來兩個數的最大公約數。

比較輾轉相除法與更相減損術的區別:

(1)都是求最大公約數的方法,計算上輾轉相除法以除法為主,更相減損術以減法為主,計算次數上輾轉相除法計算次數相對較少,特別當兩個數字大小區別較大時計算次數的區別較明顯。
(2)從結果體現形式來看,輾轉相除法體現結果是以相除餘數為0則得到,而更相減損術則以減數與差相等而得到。

輾轉相除法的一個程式演算法的步驟:

第一步:輸入兩個正整數m,n(m>n).
第二步:計算m除以n所得的餘數r.
第三步:m=n,n=r.
第四步:若r=0,則m,n的最大公約數等於m;否則轉到第二步.第五步:輸出最大公約數m.

更相減勳術的一個程式演算法步驟:

第一步:輸入兩個正整數a,b(a>b);
第二步:若a不等於b,則執行第三步;否則轉到第五步;
第三步:把a-b的差賦予r;
第四步:如果b>r,那麼把b賦給a,把r賦給b;否則把r賦給a,執行第二步;
第五步:輸出最大公約數b.

秦九韶演算法: 一般地,一元n次多項式的求值需要經過[n(n+1)]/2次
乘法和n次加法,而秦九韶演算法只需要n次乘法和n次加法。在人工計算時,一次大大簡化了運算過程。 把一個n次多項式 改寫成如下形式: 多項式的值時,首先計算最內層括號內一次多項式的值,即 然後由內向外逐層計算一次多項式的值,即 這樣,求n次多項式f(x)的值就轉化為求n個一次多項式的值。 結論:對於一個n次多項式,至多做n次乘法和n次加法。
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include <bits/stdc++.h> using namespace std; class Solution { public: int valueofPolynomial(string s) { int len = s.size(); int x, num[1000], dex = 0, temp = 0; for (int i = 0; i < len; i++) { if (s[i] >= '0' && s[i] <= '9') { temp = temp * 10 + s[i] - '0'; } else if (s[i] == '+') { temp = 0; continue; } else if (s[i] == '^') { x = temp; continue; } else { num[dex++] = temp; temp = 0; } } temp = num[0]; for (int i = 1; i < dex; i++) { temp = temp * x + num[i]; } return temp; } }; int main() { Solution Plain; string str = "4*3^3+5*3^2+6*3^1+7*3^0"; cout << Plain.valueofPolynomial(str) << endl; return 0; }

以上就是秦九韶的完整程式碼。

高斯消元法

高斯消元法,是線性代數中的一個演算法,可用來求解線性方程組,並可以求出矩陣的秩,以及求出可逆方陣的逆矩陣。
高斯消元法的原理是:
若用初等行變換將增廣矩陣 化為 ,則AX = B與CX = D是同解方程組。
所以我們可以用初等行變換把增廣矩陣轉換為行階梯陣,然後回代求出方程的解。

以上是線性代數課的回顧,下面來說說高斯消元法在程式設計中的應用。

首先,先介紹程式中高斯消元法的步驟:
(我們設方程組中方程的個數為equ,變元的個數為var,注意:一般情況下是n個方程,n個變元,但是有些題目就故意讓方程數與變元數不同)

1. 把方程組轉換成增廣矩陣。

2. 利用初等行變換來把增廣矩陣轉換成行階梯陣。
列舉k從0到equ – 1,當前處理的列為col(初始為0) ,每次找第k行以下(包括第k行),col列中元素絕對值最大的列與第k行交換。如果col列中的元素全為0,那麼則處理col + 1列,k不變。

3. 轉換為行階梯陣,判斷解的情況。

① 無解
當方程中出現(0, 0, …, 0, a)的形式,且a != 0時,說明是無解的。

② 唯一解
條件是k = equ,即行階梯陣形成了嚴格的上三角陣。利用回代逐一求出解集。

③ 無窮解。
條件是k < equ,即不能形成嚴格的上三角形,自由變元的個數即為equ – k,但有些題目要求判斷哪些變元是不缺定的。
    這裡單獨介紹下這種解法:
首先,自由變元有var - k個,即不確定的變元至少有var - k個。我們先把所有的變元視為不確定的。在每個方程中判斷不確定變元的個數,如果大於1個,則該方程無法求解。如果只有1個變元,那麼該變元即可求出,即為確定變元。

以上介紹的是求解整數線性方程組的求法,複雜度是O(n3)。浮點數線性方程組的求法類似,但是要在判斷是否為0時,加入EPS,以消除精度問題。

相關推薦

著名非常有用演算法

演算法案例: 主要有輾轉相除法、更相減損術、秦九韶演算法、k進位制化十進位制的演算法。 輾轉相除的定義: 所謂輾轉相除法,就是對於給定的兩個數,用較大的數除以較小的數。若餘數不為零,則將餘數和較小的

Python帶我飛:50有趣鮮為人知的Python特性

Python, 是一個設計優美的解釋型高階語言, 它提供了很多能讓程式設計師感到舒適的功能特性。但有的時候, Python 的一些輸出結果對於初學者來說似乎並不是那麼一目瞭然。 這個有趣的專案意在收集 Python 中那些難以理解和反人類直覺的例子以及鮮為人知的功能特性, 並嘗試討論這些現象背後

常用的作業系統程序排程演算法

一、先來先服務和短作業(程序)優先排程演算法 1.先來先服務排程演算法 先來先服務(FCFS)排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。當在作業排程中採用該演算法時,每次排程都是從後備作業佇列中選擇一個或多個最先進入該佇列的作業,將它

非常簡單非常完整的R語言主成分分析例項

本篇文章不講有關主成分分析的理論知識,只講實際操作。 例項:(中學生身體四項指標的主成分分析) 在某中學隨機抽取某年級30名學生,測量其身高(X1)、體重(X2)、胸圍(X3)和坐高(X4),資料如下。試對這30名中學生身體四項指標資料做主成分分析。

著名的Windows “偽”優化技巧

不可輕信謠言   因為需要,謠言就產生了。但可能是太需要了,有些謠言越傳越真,越傳越廣。網路發達了,什麼樣的資訊都有,直接翻譯的、自己編譯修改的、自己發明創造的……最近,在網上,甚至在一些媒體中已經讓不少謠言使一些電腦初學者陷於深深的誤區中,甚至步入了迷途……現在,電腦使用

PHP:10不常見卻非常有用的PHP函式

1. sys_getloadavg() sys_getloadavt()可以獲得系統負載情況。該函式返回一個包含三個元素的陣列,每個元素分別代表系統再過去的1、5和15分鐘內的平均負載。 與其讓伺服器因負載過高而宕掉,不如在系統負載很高時主動die掉一個指令碼,sys_getloadavg()就是用來幫你實

阿里P7大牛整理2的0非常有用的Java程式片段,你知道

1、字串有整型的相互轉換 String a = String.valueOf(2);  //integer to numeric string   int i = Integer.parseInt(a); //numeric string to an int 2、向檔案

關於latex簡歷非常有用的命令

    大家知道latex是最好的排版系統,用來寫論文,排版非常漂亮,用來做簡歷可以提升逼格,下面介紹幾個有用的命令 幾個有用的命令 section、cventry、cvitem、cvli

mysql非常有用命令

mysql> use test; Database changed mysql> select @@version; +-----------+ | @@version | +-----------+ | 5.5.15 | +-----------+

linux的非常有用的命令

1, 查詢指定目錄下的檔案,並且替換檔案中的字串。 sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl .` -i 表示 修改檔案 "s/zhangsan/lisi/g" 類似於vim的正則匹配g 表示全域性替換 grep 是查詢

SD模組非常有用修正和檢錯程式

Below is the list of standard report which i have basically consolidated that helps to check SD customizing and transaction discrepancies

非常有用的iOS學習博客鏈接

nbsp 學習 post data title opera detail sta 文章 幾個非常有用的iOS學習博客鏈接 請仔細閱讀相關鏈接下的其他博客的文章: http://blog.csdn.net/sanpintian/article/deta

12非常有用的javascript技巧,必看!

login 他會 有時 throw 代碼 取數 屬性 nbsp 存在 提示:該文章是整理別人別人的文章,作者比較多,很難分辨原創作者是誰。 1)使用!!將變量轉換成布爾類型   有時,我們需要檢查一些變量是否存在,或者它是否具有有效值,從而將他們的值視為true。對於這樣的

Java的有用小Util函數(日期處理和http)

content lex .get get sta mmd 第幾天 service ret /** * 依據日期返回當前日期是一年的第幾天 * @param date * @return */ public stat

剛開始學習的人非常有用:struts2中將jsp數據傳到action的種方式

登錄頁面 sign config print log println amp war htm 先給上struts.xml代碼: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBL

yum有用的參數

linux運維 yum學習京峰公開課Linux軟件管理的筆記yum provides rz查詢命令對應的軟件yum grouplist列出當前Linux已經安裝的功能yum groupinstall 參數安裝指定的groupyum幾個有用的參數

oracle trunc 函數處理日期格式,日期類型很有用sql

char mon 函數 -m span 截取 報錯 sys 默認 select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual; --顯示當前時間 2011-12-29 16:24:34 select trunc(

glibc的有用的處理二進制位的內置函數(轉)

res exec 就是 str 指向 nbsp using sig long long — Built-in Function: int __builtin_ffs (unsigned int x)Returns one plus the index of the leas

非常有用的 48 JavaScript 代碼片段

clas cond html rip .html java .com -c post http://codebay.cn/post/7452.html https://github.com/Chalarangelo/30-seconds-of-code非常有用的 48 個

5 非常有用的 Laravel Blade 指令,你用過哪些?

內容 def upload user 兩個 doc 系統 使用 hub 接下來我將帶大家認識下五個 Laravel Blade 指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸 Laravel 的用戶,這些小技巧能帶你認識到 Laravel Blade 模板引