1. c語言問題: 什麼是演算法試從日常生活中找3個例子,描述它們的演算法。 詳細點,謝謝!
c語言中的演算法是指:一系列解決問題的清晰指令,用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。通俗說就是解決問題的方法和步驟。
描述演算法的例子:
問題:從上海去到北京。
其中的演算法:做汽車、做飛機、或者徒步。
問題:喝茶。
其中的演算法:先找到茶葉,再燒一壺開水,然後將茶葉放到杯子里,將開水倒入杯中,等茶葉泡好。
問題:開車。
其中的演算法:首先要打開車門,駕駛員坐好,插上車鑰匙,發動汽車。
2. EM演算法實例與求解
同求。很急很急。望好心N人人幫忙。謝了
3. 鋼筋演算法與實例詳解的介紹
本書分《清清楚楚算鋼筋明明白白用軟體——鋼筋演算法與實例詳解》(簡稱演算法)《清清楚楚算鋼筋明明白白用軟體——鋼筋軟體操作與實例詳解》(簡稱軟體操作)以及一份工程圖。 《演算法》以一份包含基本鋼筋構件的完整工程為主線,以大量通俗易懂的圖片和表格的方式,詳細講解了本工程所涉及到的平板式筏形基礎、框架柱、剪力牆、框架梁、現澆板、樓梯、二次結構等鋼筋構件的基本原理和計算公式,並給出了這個工程所有構件鋼筋的手工計算過程和答案。
4. 遺傳演算法原理與應用實例的內容簡介
《遺傳演算法原理與應用實例》是解決復雜空間性能指標優化問題的智能計算方法,近年來已經在很多領域中得到成功的應用。《遺傳演算法原理與應用實例》除包含編者近年來在山西省教育廳科技開發項目基金資助下取得的一些工作成果外,還匯集了國內外一些專家學者的最新研究成果。
《遺傳演算法原理與應用實例》內容自成體系,無需太多預備知識。可供高等學校計算數學、計算化學和計算機科學技術等專業的高年級本科生和研究生學習,也可供理工科其他專業和管理專業的師生參考,還可供利用計算機從事優化和管理工作的科技人員閱讀參考。
5. 鋼筋演算法與實例詳解的目錄
第一章鋼筋的計算原理和實例答案
第一節平板式筏形基礎
一、平板式筏形基礎標注
二、平板式筏形基礎要計算哪些鋼筋
三、平板式筏形基礎鋼筋的計算原理
四、1號寫字樓平板式筏形基礎鋼筋答案手工和軟體對比
第二節框架柱
一、框架柱的標注
二、框架柱要計算哪些鋼筋
三、框架柱鋼筋的計算原理
四、1號寫字樓框架柱鋼筋答案手工和軟體對比
第三節剪力牆
一、剪力牆的標注
二、剪力牆要計算哪些鋼筋
三、暗柱鋼筋的計算原理和實例答案
四、端柱鋼筋的計算原理和實例答案
五、剪力牆鋼筋的計算原理和實例答案
六、洞口
七、連梁(含洞口下地梁)鋼筋的計算原理和實例答案
八、暗梁鋼筋的計算原理和實例答案
第四節梁
一、梁鋼筋的通俗解釋
二、梁鋼筋的平法標注
三、梁要計算哪些鋼筋
四、樓層框架梁鋼筋的計算原理和實例答案
五、屋面層框架梁鋼筋的計算原理和實例答案
六、非框架梁鋼筋的計算原理和實例答案
第五節板
一、板的標注
二、板要計算哪些鋼筋
三、板的鋼筋計算原理
四、1號寫字樓板鋼筋答案手工和軟體對比
第六節樓梯
一、樓梯要計算哪些鋼筋
二、樓梯鋼筋的計算原理
三、1號寫字樓樓梯鋼筋答案手工和軟體對比
第七節二次結構
一、二次結構通常要計算哪些鋼筋
二、二次結構鋼筋的計算原理和實例答案
三、1號寫字樓牆體加筋答案手工和軟體對比
第二章實例工程——軟體計算1號寫字樓的操作步驟和答案
一、進入軟體
二、建立樓層
三、建立軸網
四、首層構件的屬性、畫法及其答案對比
五、二層構件的屬性、畫法及其答案對比
六、三層構件的屬性、畫法及其答案對比
七、屋面層構件的屬性、畫法及其答案對比
八、基礎層構件的屬性、畫法及其答案對比
九、垂直構件鋼筋答案軟體和手工對比
十、樓梯斜跑軟體計算方法
參考文獻
6. 分治演算法的應用實例
下面通過實例加以說明: 給你一個裝有1 6個硬幣的袋子。1 6個硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。為了幫助你完成這一任務,將提供一台可用來比較兩組硬幣重量的儀器,利用這台儀器,可以知道兩組硬幣的重量是否相同。比較硬幣1與硬幣2的重量。假如硬幣1比硬幣2輕,則硬幣1是偽造的;假如硬幣2比硬幣1輕,則硬幣2是偽造的。這樣就完成了任務。假如兩硬幣重量相等,則比較硬幣3和硬幣4。同樣,假如有一個硬幣輕一些,則尋找偽幣的任務完成。假如兩硬幣重量相等,則繼續比較硬幣5和硬幣6。按照這種方式,可以最多通過8次比較來判斷偽幣的存在並找出這一偽幣。
另外一種方法就是利用分而治之方法。假如把1 6硬幣的例子看成一個大的問題。第一步,把這一問題分成兩個小問題。隨機選擇8個硬幣作為第一組稱為A組,剩下的8個硬幣作為第二組稱為B組。這樣,就把1 6個硬幣的問題分成兩個8硬幣的問題來解決。第二步,判斷A和B組中是否有偽幣。可以利用儀器來比較A組硬幣和B組硬幣的重量。假如兩組硬幣重量相等,則可以判斷偽幣不存在。假如兩組硬幣重量不相等,則存在偽幣,並且可以判斷它位於較輕的那一組硬幣中。最後,在第三步中,用第二步的結果得出原先1 6個硬幣問題的答案。若僅僅判斷硬幣是否存在,則第三步非常簡單。無論A組還是B組中有偽幣,都可以推斷這1 6個硬幣中存在偽幣。因此,僅僅通過一次重量的比較,就可以判斷偽幣是否存在。
假設需要識別出這一偽幣。把兩個或三個硬幣的情況作為不可再分的小問題。注意如果只有一個硬幣,那麼不能判斷出它是否就是偽幣。在一個小問題中,通過將一個硬幣分別與其他兩個硬幣比較,最多比較兩次就可以找到偽幣。這樣,1 6硬幣的問題就被分為兩個8硬幣(A組和B組)的問題。通過比較這兩組硬幣的重量,可以判斷偽幣是否存在。如果沒有偽幣,則演算法終止。否則,繼續劃分這兩組硬幣來尋找偽幣。假設B是輕的那一組,因此再把它分成兩組,每組有4個硬幣。稱其中一組為B1,另一組為B2。比較這兩組,肯定有一組輕一些。如果B1輕,則偽幣在B1中,再將B1又分成兩組,每組有兩個硬幣,稱其中一組為B1a,另一組為B1b。比較這兩組,可以得到一個較輕的組。由於這個組只有兩個硬幣,因此不必再細分。比較組中兩個硬幣的重量,可以立即知道哪一個硬幣輕一些。較輕的硬幣就是所要找的偽幣。 在n個元素中找出最大元素和最小元素。我們可以把這n個元素放在一個數組中,用直接比較法求出。演算法如下:
void maxmin1(int A[],int n,int *max,int *min)
{ int i;
*min=*max=A[0];
for(i=0;i <= n;i++)
{ if(A[i]> *max) *max= A[i];
if(A[i] < *min) *min= A[i];
}
}
上面這個演算法需比較2(n-1)次。能否找到更好的演算法呢?我們用分治策略來討論。
把n個元素分成兩組:
A1={A[1],...,A[int(n/2)]}和A2={A[INT(N/2)+1],...,A[N]}
分別求這兩組的最大值和最小值,然後分別將這兩組的最大值和最小值相比較,求出全部元素的最大值和最小值。如果A1和A2中的元素多於兩個,則再用上述方法各分為兩個子集。直至子集中元素至多兩個元素為止。
例如有下面一組元素:-13,13,9,-5,7,23,0,15。用分治策略比較的演算法如下:
void maxmin2(int A[],int i,int j,int *max,int *min)
/*A存放輸入的數據,i,j存放數據的范圍,初值為0,n-1,*max,*min 存放最大和最小值*/
{ int mid,max1,max2,min1,min2;
if (j==i) {最大和最小值為同一個數;return;}
if (j-1==i) {將兩個數直接比較,求得最大會最小值;return;}
mid=(i+j)/2;
求i~mid之間的最大最小值分別為max1,min1;
求mid+1~j之間的最大最小值分別為max2,min2;
比較max1和max2,大的就是最大值;
比較min1和min2,小的就是最小值;
} 題目:在一個(2^k)*(2^k)個方格組成的棋盤上,有一個特殊方格與其他方格不同,稱為特殊方格,稱這樣的棋盤為一個特殊棋盤。我們要求對棋盤的其餘部分用L型方塊填滿(註:L型方塊由3個單元格組成。即圍棋中比較忌諱的愚形三角,方向隨意),且任何兩個L型方塊不能重疊覆蓋。L型方塊的形態如下:
題目的解法使用分治法,即子問題和整體問題具有相同的形式。我們對棋盤做一個分割,切割一次後的棋盤如圖1所示,我們可以看到棋盤被切成4個一樣大小的子棋盤,特殊方塊必定位於四個子棋盤中的一個。假設如圖1所示,特殊方格位於右上角,我們把一個L型方塊(灰色填充)放到圖中位置。這樣對於每個子棋盤又各有一個「特殊方塊」,我們對每個子棋盤繼續這樣分割,直到子棋盤的大小為1為止。
用到的L型方塊需要(4^k-1)/3 個,演算法的時間是O(4^k),是漸進最優解法。
本題目的C語言的完整代碼如下(TC2.0下調試),運行時,先輸入k的大小,(1<=k<=6),然後分別輸入特殊方格所在的位置(x,y), 0<=x,y<=(2^k-1)。 #include<stdio.h>//#include<conio.h>//#include<math.h>inttitle=1;intboard[64][64];voidchessBoard(inttr,inttc,intdr,intdc,intsize){ints,t;if(size==1)return;t=title++;s=size/2;if(dr<tr+s&&dc<tc+s)chessBoard(tr,tc,dr,dc,s);else{board[tr+s-1][tc+s-1]=t;chessBoard(tr,tc,tr+s-1,tc+s-1,s);}if(dr<tr+s&&dc>=tc+s)chessBoard(tr,tc+s,dr,dc,s);else{board[tr+s-1][tc+s]=t;chessBoard(tr,tc+s,tr+s-1,tc+s,s);}if(dr>=tr+s&&dc<tc+s)chessBoard(tr+s,tc,dr,dc,s);else{board[tr+s][tc+s-1]=t;chessBoard(tr+s,tc,tr+s,tc+s-1,s);}if(dr>=tr+s&&dc>=tc+s)chessBoard(tr+s,tc+s,dr,dc,s);else{board[tr+s][tc+s]=t;chessBoard(tr+s,tc+s,tr+s,tc+s,s);}}voidmain(){intdr=0,dc=0,s=1,i=0,j=0;printf(printinthesizeofchess:
);scanf(%d,&s);printf(printinspecalpointx,y:
);scanf(%d%d,&dr,&dc);if(dr<s&&dc<s){chessBoard(0,0,dr,dc,s);for(i=0;i<s;i++){for(j=0;j<s;j++){printf(%4d,board[i][j]);}printf(
);}}elseprintf(thewrongspecalpoint!!
);getch();}
7. 原生類的演算法實例
Java不是純的面向對象的語言,不純的地方就是這些基本數據類型不是對象。當然初期Java的運行速度很慢,基本數據類型能在一定程度上改善性能。如果你想編寫純的面向對象的程序,用包裝器類是取代基本數據類型就可以了。
1、基本類型的存儲空間。byte--8位,short--16位,int--32位,long--64位,float--32位,double--64位。這六種數字類型都是有符號的。固定的存儲空間正是Java可移植性、跨平台的原因之一!
2、基本類型的存在導致了Java OOP的不純粹性。因為基本類型不是對象,一切皆對象是個小小的謊言。這是出於執行效率的權衡。
3、使用公式-2的(位數-1)次冪到2的(位數-1)次冪-1確定整數類型的范圍(byte、short、int、long)。
4、char是16位Unicode字元或者說是16位無符號整數,范圍從0到65535。即便如此,可以強制轉換非法的數據,如:char c1 = (char) 10000; char c2 = (char) -200;。可以從二進制存儲的角度理解這點。
5、整數有八進制(以0開頭的整數)、十進制、十六進制(以0x或0X開頭的整數)表示。
6、char可以用單引號表示單個字元,如:'良'。也可以用unicode值'ucafe'(四位十六進制數)。
7、布爾型boolean。布爾型只能是true或者false,並且測試它為真還是假。它不能進行任何其他的運算,或者轉化為其他類型。
正例:boolean b1 = 1 > 2; 反例:int seen = button.isVisible();
實踐:簡潔是美德,請不要這樣寫:if ( is == true && done == false ) ,只有新手才那麼寫。
對於任何程序員 if ( whether && !done ) 都不難理解吧。所以去掉所有的==fasle 和 ==true。
8、默認的浮點類型是雙精度(double),要想要一個float必須在浮點數後面加F或者f。如:float pi = 3.14;是錯誤的。
9、默認的整數類型是int型,要想使用長整型可在後面加「l」或「L」,如:1000L。(小寫l容易被誤認為1,不推薦用)
10、float可以精確到7位有效數字,第8位的數字是第9位數字四捨五入上取得的;double可以精確到16位有效數字,第17位的數字是第18位數字四捨五入上取得的。蓋茨到底有多少錢?要用double表示,用float是裝不下的……
11、如果要求精確的答案,請不要使用float和double,因為它們是為了在廣域數值范圍上提供較為精確的快速近似運算而精心設計的。然而,它們沒有提供完全精確的結果。尤其是對貨幣計算尤為不適合,因為要讓一個float或double精確地表達0.1(或者10的任何)
12、BigInteger支持任意精度的整數。BigDecimal支持任意精度的定點數。
13、初始化無論怎麼強調都不過分!Java為所有的成員變數提供了默認初始化:byte、short、 int、long--0 float--0.0f double--0.0 boolean--false char--'u0000',特別地對象類型的引用全被初始化為null。(注意!除了數組之外的局部變數是得不到這種優待的,需要你自己初始化。另外,默認初始化的值是你想要的嗎?所以最好明確地對變數進行初始化,一般是在構造函數中。)
14、基本類型之間的轉化。Java的類型檢查很嚴格,從低精度轉換到高精度是無須顯式轉換的,double d = 123;。但是反過來,進行窄化轉換,由高精度向低精度,或者一種類型到另一種類型,則必須使用強制類型轉化。Java提供了安全轉化機制,但是結果是否是期望的,你自己保證吧。
double d = 12.5;
float f = (int) d; //結果不是13,而是12!
浮點型轉化為整型時,不進行四捨五入,直接截斷小數點後面的數。
15、提升。各種基本數據類型進行混合運算,結果會是表達能力最強的那種。如:int和long運算,結果是long,整型和浮點型運算結果是浮點型。特殊的一點是:只要類型比int小(如char、byte、short),那麼在運算之前,這些值會自動地轉換成int。例子:
byte b1 = 12;
byte b2 = b1 + 1; //在編譯時出錯了!因為b1+1已經是int型了!切記!
16、浮點類型的科學表示法。在數學中e代表自然對數(Math.E給出了double值),而在Java中e代表10的冪次。浮點型的數可以這樣表示float f = 1e-27f; 代表1乘以10的負27次冪。
8. 數據結構和演算法:有什麼書是有數據結構和演算法的實例的
說實話,真的不太推薦你學那種帶有細致代碼的書,有偽碼就夠了。剛剛學數據結構和演算法,主要是為了理解內容、打好基礎,偽碼用來明白流程和思路最好了,不用糾結於語言細節。
同時,你自己寫(必須要自己寫)代碼的時候,又能有更清楚的認識,也復習了編程知識。只是看懂和照著書本打代碼是沒什麼意義的,剛開始學哪有不吃苦的。
至於演算法,大部分的數據結構課本就會介紹一些基本初等演算法,把這些演算法弄熟,做到不用看書能毫不遲疑地寫下偽碼和實際代碼,不出一點問題之後再去看別的書。不然,你會覺得後面的東西很難,同時前面的又學的很飄忽。
可以先演算法導論,然後反復練習實踐,可以去做些ACM的OJ(不用做太難的),然後看下你感興趣的相應語言的實例代碼,最後看下TAOCP。
9. 什麼是演算法,都什麼,舉個例子,謝謝
根據我個人的理解:
演算法就是解決問題的具體的方法和步驟,所以具有以下性質:
1、有窮性: 一個演算法必須保證執行有限步之後結束(如果步驟無限,問題就無法解決)
2、確切性:步驟必須明確,說清楚做什麼。
3、輸入:即解決問題前我們所掌握的條件。
4、輸出:輸出即我們需要得到的答案。
5、可行性:邏輯不能錯誤,步驟必須有限,必須得到結果。
演算法通俗的講:就是解決問題的方法和步驟。在計算機發明之前便已經存在。只不過在計算機發明後,其應用變得更為廣泛。通過簡單的演算法,利用電腦的計算速度,可以讓問題變得簡單。
譬如:計算 1×2×3×4。。。。×999999999×1000000000
如果人為計算,可想而知,即使你用N卡車的紙張都很難計算出來,即使算出來了,也很難保證其准確性。
如果用VB演算法:
dim a as integer
a=1
For i =1 to 1000000000
a=a*i
next i
input a
就這樣,簡單的演算法,通過計算機強大的計算能力,問題就解決了。
關於這段演算法的解釋:i每乘一次,其數值都會增大1,一直乘到1000000000,這樣,就將從1到1000000000的每個數都乘了。而且每乘一次,就將結束賦給a,這樣,a就代表了前面的相乘的所有結果,一直乘到1000000000。最後得到的a,就是我們想要的。
〓以下是網路復制過來的,如果你有足夠耐心,可以參考一下。
演算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法可以理解為有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題。
一個演算法應該具有以下五個重要的特徵:
1、有窮性: 一個演算法必須保證執行有限步之後結束;
2、確切性: 演算法的每一步驟必須有確切的定義;
3、輸入:一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定除了初始條件;
4、輸出:一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的;
5、可行性: 演算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算後即可完成。
計算機科學家尼克勞斯-沃思曾著過一本著名的書《數據結構十演算法= 程序》,可見演算法在計算機科學界與計算機應用界的地位。
[編輯本段]演算法的復雜度
同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間復雜度和空間復雜度來考慮。
時間復雜度
演算法的時間復雜度是指演算法需要消耗的時間資源。一般來說,計算機演算法是問題規模n 的函數f(n),演算法的時間復雜度也因此記做
T(n)=Ο(f(n))
因此,問題的規模n 越大,演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度(Asymptotic Time Complexity)。
空間復雜度
演算法的空間復雜度是指演算法需要消耗的空間資源。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。
詳見網路詞條"演算法復雜度"
[編輯本段]演算法設計與分析的基本方法
1.遞推法
遞推法是利用問題本身所具有的一種遞推關系求問題解的一種方法。它把問題分成若干步,找出相鄰幾步的關系,從而達到目的,此方法稱為遞推法。
2.遞歸
遞歸指的是一個過程:函數不斷引用自身,直到引用的對象已知
3.窮舉搜索法
窮舉搜索法是對可能是解的眾多候選解按某種順序進行逐一枚舉和檢驗,並從眾找出那些符合要求的候選解作為問題的解。
4.貪婪法
貪婪法是一種不追求最優解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因為它省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況為基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。
5.分治法
把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合並。
6.動態規劃法
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。
7.迭代法
迭代是數值分析中通過從一個初始估計出發尋找一系列近似解來解決問題(一般是解方程或者方程組)的過程,為實現這一過程所使用的方法統稱為迭代法。
[編輯本段]演算法分類
演算法可大致分為基本演算法、數據結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法。
[編輯本段]舉例
經典的演算法有很多,如:"歐幾里德演算法"。
[編輯本段]演算法經典專著
目前市面上有許多論述演算法的書籍,其中最著名的便是《計算機程序設計藝術》(The Art Of Computer Programming) 以及《演算法導論》(Introction To Algorithms)。
[編輯本段]演算法的歷史
「演算法」即演演算法的大陸中文名稱出自《周髀算經》;而英文名稱Algorithm 來自於9世紀波斯數學家al-Khwarizmi,因為al-Khwarizmi在數學上提出了演算法這個概念。「演算法」原為"algorism",意思是阿拉伯數字的運演算法則,在18世紀演變為"algorithm"。歐幾里得演算法被人們認為是史上第一個演算法。 第一次編寫程序是Ada Byron於1842年為巴貝奇分析機編寫求解解伯努利方程的程序,因此Ada Byron被大多數人認為是世界上第一位程序員。因為查爾斯·巴貝奇(Charles Babbage)未能完成他的巴貝奇分析機,這個演算法未能在巴貝奇分析機上執行。 因為"well-defined procere"缺少數學上精確的定義,19世紀和20世紀早期的數學家、邏輯學家在定義演算法上出現了困難。20世紀的英國數學家圖靈提出了著名的圖靈論題,並提出一種假想的計算機的抽象模型,這個模型被稱為圖靈機。圖靈機的出現解決了演算法定義的難題,圖靈的思想對演算法的發展起到了重要作用的。