演算法與實例
1、有窮性(有限性)。任何一種提出的解題方法都是在有限的操作步驟內可以完成的。
如果在有限的操作步驟內完不成,得不到結果,這樣的演算法將無限的執行下去,永遠不會停止。除非手動停止。例如操作系統就不具有有窮性,它可以一直運行。
2、一個演算法應該具有以下七個重要的特徵:
1)有窮性(finiteness)
演算法的有窮性是指演算法必須能在執行有限個步驟之後終止
2)確切性(definiteness)
演算法的每一步驟必須有確切的定義;
3)輸入項(input)
一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定出了初始條件;
4)輸出項(output)
一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果.沒有輸出的演算法是毫無意義的;
5)可行性(effectiveness)
演算法中執行的任何計算步都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成;
6)
高效性(high
efficiency)
執行速度快,佔用資源少;
7)
健壯性(robustness)
健壯性又稱魯棒性,是指軟體對於規范要求以外的輸入情況的處理能力。所謂健壯的系統是指對於規范要求以外的輸入能夠判斷出這個輸入不符合規范要求,並能有合理的處理方式。
B. 分治演算法的應用實例
下面通過實例加以說明: 給你一個裝有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();}
C. 什麼叫"計算機演算法"請舉出5個計算機演算法的例子.
准確的定義還是建議你上書上找,至於演算法的例子,我大概說說好了,比如從1循環到指定的數(數的遍歷),輾轉相除法算最大公約數,從1加到100用的迭代演算法,求某數的階乘用的遞歸演算法,求平方根的牛頓迭代法。。。。
總之就是能解決一類問題的固定的計算方法就是演算法。
D. c語言問題: 什麼是演算法試從日常生活中找3個例子,描述它們的演算法。 詳細點,謝謝!
c語言中的演算法是指:一系列解決問題的清晰指令,用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。通俗說就是解決問題的方法和步驟。
描述演算法的例子:
問題:從上海去到北京。
其中的演算法:做汽車、做飛機、或者徒步。
問題:喝茶。
其中的演算法:先找到茶葉,再燒一壺開水,然後將茶葉放到杯子里,將開水倒入杯中,等茶葉泡好。
問題:開車。
其中的演算法:首先要打開車門,駕駛員坐好,插上車鑰匙,發動汽車。
E. 原生類的演算法實例
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次冪。
F. 鋼筋演算法與實例詳解的目錄
第一章鋼筋的計算原理和實例答案
第一節平板式筏形基礎
一、平板式筏形基礎標注
二、平板式筏形基礎要計算哪些鋼筋
三、平板式筏形基礎鋼筋的計算原理
四、1號寫字樓平板式筏形基礎鋼筋答案手工和軟體對比
第二節框架柱
一、框架柱的標注
二、框架柱要計算哪些鋼筋
三、框架柱鋼筋的計算原理
四、1號寫字樓框架柱鋼筋答案手工和軟體對比
第三節剪力牆
一、剪力牆的標注
二、剪力牆要計算哪些鋼筋
三、暗柱鋼筋的計算原理和實例答案
四、端柱鋼筋的計算原理和實例答案
五、剪力牆鋼筋的計算原理和實例答案
六、洞口
七、連梁(含洞口下地梁)鋼筋的計算原理和實例答案
八、暗梁鋼筋的計算原理和實例答案
第四節梁
一、梁鋼筋的通俗解釋
二、梁鋼筋的平法標注
三、梁要計算哪些鋼筋
四、樓層框架梁鋼筋的計算原理和實例答案
五、屋面層框架梁鋼筋的計算原理和實例答案
六、非框架梁鋼筋的計算原理和實例答案
第五節板
一、板的標注
二、板要計算哪些鋼筋
三、板的鋼筋計算原理
四、1號寫字樓板鋼筋答案手工和軟體對比
第六節樓梯
一、樓梯要計算哪些鋼筋
二、樓梯鋼筋的計算原理
三、1號寫字樓樓梯鋼筋答案手工和軟體對比
第七節二次結構
一、二次結構通常要計算哪些鋼筋
二、二次結構鋼筋的計算原理和實例答案
三、1號寫字樓牆體加筋答案手工和軟體對比
第二章實例工程——軟體計算1號寫字樓的操作步驟和答案
一、進入軟體
二、建立樓層
三、建立軸網
四、首層構件的屬性、畫法及其答案對比
五、二層構件的屬性、畫法及其答案對比
六、三層構件的屬性、畫法及其答案對比
七、屋面層構件的屬性、畫法及其答案對比
八、基礎層構件的屬性、畫法及其答案對比
九、垂直構件鋼筋答案軟體和手工對比
十、樓梯斜跑軟體計算方法
參考文獻
G. 鋼筋演算法與實例詳解的介紹
本書分《清清楚楚算鋼筋明明白白用軟體——鋼筋演算法與實例詳解》(簡稱演算法)《清清楚楚算鋼筋明明白白用軟體——鋼筋軟體操作與實例詳解》(簡稱軟體操作)以及一份工程圖。 《演算法》以一份包含基本鋼筋構件的完整工程為主線,以大量通俗易懂的圖片和表格的方式,詳細講解了本工程所涉及到的平板式筏形基礎、框架柱、剪力牆、框架梁、現澆板、樓梯、二次結構等鋼筋構件的基本原理和計算公式,並給出了這個工程所有構件鋼筋的手工計算過程和答案。
H. 數據結構和演算法:有什麼書是有數據結構和演算法的實例的
說實話,真的不太推薦你學那種帶有細致代碼的書,有偽碼就夠了。剛剛學數據結構和演算法,主要是為了理解內容、打好基礎,偽碼用來明白流程和思路最好了,不用糾結於語言細節。
同時,你自己寫(必須要自己寫)代碼的時候,又能有更清楚的認識,也復習了編程知識。只是看懂和照著書本打代碼是沒什麼意義的,剛開始學哪有不吃苦的。
至於演算法,大部分的數據結構課本就會介紹一些基本初等演算法,把這些演算法弄熟,做到不用看書能毫不遲疑地寫下偽碼和實際代碼,不出一點問題之後再去看別的書。不然,你會覺得後面的東西很難,同時前面的又學的很飄忽。
可以先演算法導論,然後反復練習實踐,可以去做些ACM的OJ(不用做太難的),然後看下你感興趣的相應語言的實例代碼,最後看下TAOCP。
I. EM演算法實例與求解
同求。很急很急。望好心N人人幫忙。謝了
J. 什麼是演算法試從日常生活中找3個例子,描述它們的演算法
演算法就是解決問題的方法比如你要喝茶就要先找到茶葉,燒一壺開水,然後將茶葉放到杯子里,然後將開水倒入杯中,然後等一段時間再比如你要從a地到b地,中間可能有多種汽車換乘方案,是選速度最快的,還是選最省錢的,還是平衡的,制定換乘方案就是演算法。