演算法類問題
⑴ 關於一個演算法的問題
1.從攻擊角度看,由於寫入時存在前提條件1,因此,可以根據寫入的時間延遲來判斷寫入的是0還是1。再根據其他前提條件可以得出寫入的所有數字序列。
2.從防止攻擊角度看,只有在前提條件1處設計演算法來迷惑攻擊。下面結合演算法條件、要求和目的來談談演算法問題。為了節省時間的要求,僅考慮每次寫入的時間延遲上限為2秒。
(1).最簡單的演算法就是前提條件1,原因是攻擊者無法判斷出寫入延遲時間為2秒時寫入的是0還是1。但是,這個演算法將受到門檻攻擊,也就是說,最簡單的攻擊方法就能直接命中。
(2).進一步考慮,除了的寫入延遲時間為1秒時必然會被識別出寫入0以外,新演算法只要在寫入0的地方將時間延遲延長為2秒就可以迷惑攻擊。問題是需要在哪幾個寫入0的地方進行時間延遲呢?
(3).假設寫入的數字序列總個數為N,其中數字1的個數為n,那麼在某個0位置上進行時間延長,受到攻擊的概率則為1/C(n+1,1)=1/(n+1);同理可以計算出在某兩個0位置上進行時間延長受到攻擊的概率為1/C(n+1,2),以次類推,在某m個0位置上進行時間延長受到攻擊的概率則為1/C(n+1,m)。由上面的推導可以得出,受到攻擊的概率最小的地方是在m=(n+1)/2個0位置上進行時間延長。當然實際上m取(n+1)/2與(N-n)之間的較小值。一個極端的情況是當n=0時,m可以取1或以上任一個值。因此,問題就演變為在時間損失與攻擊概率之間的取捨了。
⑵ 數學建模的十類演算法
1、蒙特卡羅演算法(該演算法又稱隨機性模擬演算法,是通過計算機模擬來解決問題的演算法,同時可以通過模擬可以來檢驗自己模型的正確性,是比賽時必用的方法)
2.數據擬合、參數估計、插值等數據處理演算法(比賽中通常會遇到大量的數據需要處理,而處理數據的關鍵就在於這些演算法,通常使用Matlab作為工具)
3.線性規劃、整數規劃、多元規劃、二次規劃等規劃類問題(建模競賽大多數問題屬於最優化問題,很多時候這些問題可以用數學規劃演算法來描述,通常使用Lindo、Lingo軟體實現)
4.圖論演算法(這類演算法可以分為很多種,包括最短路、網路流、二分圖等演算法,涉及到圖論的問題可以用這些方法解決,需要認真准備)
5.動態規劃、回溯搜索、分治演算法、分支定界等計算機演算法(這些演算法是演算法設計中比較常用的方法,很多場合可以用到競賽中)
6.最優化理論的三大非經典演算法:模擬退火法、神經網路、遺傳演算法(這些問題是用來解決一些較困難的最優化問題的演算法,對於有些問題非常有幫助,但是演算法的實現比較困難,需慎重使用)
7.網格演算法和窮舉法(網格演算法和窮舉法都是暴力搜索最優點的演算法,在很多競賽題中有應用,當重點討論模型本身而輕視演算法的時候,可以使用這種暴力方案,最好使用一些高級語言作為編程工具)
8.一些連續離散化方法(很多問題都是實際來的,數據可以是連續的,而計算機只認的是離散的數據,因此將其離散化後進行差分代替微分、求和代替積分等思想是非常重要的)
9.數值分析演算法(如果在比賽中採用高級語言進行編程的話,那一些數值分析中常用的演算法比如方程組求解、矩陣運算、函數積分等演算法就需要額外編寫庫函數進行調用)
10.圖象處理演算法(賽題中有一類問題與圖形有關,即使與圖形無關,論文中也應該要不乏圖片的,這些圖形如何展示以及如何處理就是需要解決的問題,通常使用Matlab進行處理)
⑶ 有關演算法的問題
您好,您問答這個問題很好,很有意義。
您的這個問題與電腦的計算過程有關,和編程語言也有關。A與C,是兩個大數,B相對來說就很小。按您的計算結果,情況應該是這樣:編程語言編譯時是從左到右對計算進行編譯(部分編譯器會反方向進行),此時,A和C會被識別為浮點型,B識別為整型(不知道您是什麼編譯器,什麼語言,這里假設是弱類型的語言),那麼運算時,A先與B運算,就是一個浮點型與一個整型運算,自動類型轉換會轉換C為浮點型(在運算中,較低「等級」的類型與較高「等級」的類型運算時,會自動類型轉換),此時相當於一個大數與一個接近0的數相加,根據IEEE標准,浮點數是由符號位S、階碼E和尾數M組成,其中能夠決定精度的尾數M在單精度浮點數裡面,僅有23位,那麼在A與B相加後,可以「認為」A+B=A,因為這個「小數」1,在產生的結果中「不存在」,因為這個A的尾數的最低一位表示的值都比1大。
這樣,A+B+C就是0,而先算浮點數的演算法卻不同,因為A+C算完了,其結果大約是絕對值小於1e-6的一個數(也就是說,對於浮點數,不存在真正意義上的0的說法,浮點數裡面,認為小於1e-6的數,就是0),此時在與1相加,提升為浮點型後,這個小於1e-6的尾數在新的浮點數裡面也就「不存在」了,與上邊所說的A+B「相當於」沒加是一個道理。
您問的這個問題,是編程與科學計算中一個基本問題,就是計算方法裡面的精度問題。在用計算機處理數據時,此類問題處理不好,會對計算結果產生關鍵影響。更詳細的細節建議網路相關內容進行學習。
參考:http://ke..com/link?url=-eAbFbjw_t_HG9vjrxEN5q
⑷ 給出一些基本的演算法問題並給出答案
C語言演算法基礎
演算法(Algorithm):計算機解題的基本思想方法和步驟。演算法的描述:是對要解決一個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼數據(輸入什麼數據、輸出什麼結果)、採用什麼結構、使用什麼語句以及如何安排這些語句等。通常使用自然語言、結構化流程圖、偽代碼等來描述演算法。
一、計數、求和、求階乘等簡單演算法
此類問題都要使用循環,要注意根據問題確定循環變數的初值、終值或結束條件,更要注意用來表示計數、和、階乘的變數的初值。
例:用隨機函數產生100個[0,99]范圍內的隨機整數,統計個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數並列印出來。
本題使用數組來處理,用數組a[100]存放產生的確100個隨機整數,數組x[10]來存放個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數。即個位是1的個數存放在x[1]中,個位是2的個數存放在x[2]中,……個位是0的個數存放在x[10]。
void main()
{ int a[101],x[11],i,p;
for(i=0;i<=11;i++)
x[i]=0;
for(i=1;i<=100;i++)
{ a[i]=rand() % 100;
printf("%4d",a[i]);
if(i%10==0)printf("\n");
}
for(i=1;i<=100;i++)
{ p=a[i]%10;
if(p==0) p=10;
x[p]=x[p]+1;
}
for(i=1;i<=10;i++)
{ p=i;
if(i==10) p=0;
printf("%d,%d\n",p,x[i]);
}
printf("\n");
}
二、求兩個整數的最大公約數、最小公倍數
分析:求最大公約數的演算法思想:(最小公倍數=兩個整數之積/最大公約數)
(1) 對於已知兩數m,n,使得m>n;
(2) m除以n得余數r;
(3) 若r=0,則n為求得的最大公約數,演算法結束;否則執行(4);
(4) m←n,n←r,再重復執行(2)。
例如: 求 m=14 ,n=6 的最大公約數. m n r
14 6 2
6 2 0
void main()
{ int nm,r,n,m,t;
printf("please input two numbers:\n");
scanf("%d,%d",&m,&n);
nm=n*m;
if (m<n)
{ t=n; n=m; m=t; }
r=m%n;
while (r!=0)
{ m=n; n=r; r=m%n; }
printf("最大公約數:%d\n",n);
printf("最小公倍數:%d\n",nm/n);
}
三、判斷素數
只能被1或本身整除的數稱為素數 基本思想:把m作為被除數,將2—INT( )作為除數,如果都除不盡,m就是素數,否則就不是。(可用以下程序段實現)
void main()
{ int m,i,k;
printf("please input a number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
printf("該數是素數");
else
printf("該數不是素數");
}
將其寫成一函數,若為素數返回1,不是則返回0
int prime( m%)
{int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) return 0;
return 1;
}
⑸ 關於計算機演算法問題
是這樣 把思路轉化為演算法 然後化為程序語言(有各種的程序語言) 然後用特定的編譯器執行語言 最後就是你看到的了
⑹ 舉例說明演算法領域的P類問題和NP類問題。為什麼說現代計算機只能解決確
P:多項式時間內可以解決,太多了,如排序問題
NP:多項式時間內可以驗證,如大數分解問題,隨便給你一個非常大的數(該數由兩個非常大的素數相乘得來),你沒法很快將其分解為兩個素數的乘積,但若是把這兩個素數告訴你,你可以很快的驗證它是由這兩個素數相乘得來(即多項式時間可驗證)
上述兩個概念一開始是用來描述判定問題的,後來被拓展到其他問題(如優化問題)上
現代計算機一就是馮洛伊曼結構,哪怕改成哈佛結構,也依舊只是一台圖靈機,其表述能力無法超過圖靈機范疇,所以只能解決確定性圖靈機問題(這個名詞我沒聽過,所以只能猜測其表示的意思)
⑺ 關於演算法的問題
B
演算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。演算法可以理解為有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題一個演算法應該具有以下五個重要的特徵:
1、有窮性: 一個演算法必須保證執行有限步之後結束;
2、確切性: 演算法的每一步驟必須有確切的定義;
3、輸入:一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定除了初始條件;
4、輸出:一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的;
5、可行性: 演算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算後即可完成
程序(港台稱之為程式) program(me)或procere
概念1.:為進行某活動或過程所規定的途徑。
概念2.程序是由序列組成的,告訴計算機如何完成一個具體的任務。由於現在的計算機還不能理解人類的自然語言,所以還不能用自然語言編寫計算機程序。
⑻ 一個有趣的演算法問題。
很有趣,討論一下吧:
先隨機放個A,
將它的周圍8個位置編號1,2,3,4,5,6,7,8
從1號到8號依次放樓,能放D就放D,不能就放C,C還不能就放B,
然後再以已放好的這九個為中心,放它周圍的16個,
按相同的規則編號,然後放樓。
這樣繼續下去,直到放完。
如果碰到邊界,也沒關系,把除去邊界部分編號處理。
這里有三個不確定的問題:
1、隨機放和指定地方放,結果相同嗎?
(可以調試測出)
2、先放A和先放B,C,D結果相同嗎?
(也可以調試測出)
3、按這個路徑擴展結果是不是最好的,還是按其他路徑擴展會更好。
(找幾條路徑試試)
⑼ 高中演算法問題
求1+3+5+...+31的值按照我們以前的演算法應該是:
第一步:0+1=1
第二步:1+3=4
第三步:4+5=9
......
第i步:
觀察可知,第一步的結果+3=第二步的結果
第二步的結果+5=第三步的結果
以此類推
這個i表示的含義就是1,3,5,7...31
而p的含義就是每一步的累積量
現在我們按照你給的答案寫出前幾步來找規律
p=0【p是累計變數此時為0】
i=1【i是要加的數,第一個要加的數當然是1】
p=p+i
即p=0+1=1【注意這里的=是賦值符號,p只是一個代號,就像x,代表的是一個未知量,並不是一個具體的數值,你可以聯想x是不是可以等於1也可以等於2或者等於100,這里的p也是這個道理,p也可以等於p+i,再或者你可以把前面的p當做p1來處理,即,p1=p+i】
i=i+2
即i=1+2=3【這里的=也是賦值符號,道理同上】
此時進行判斷,i=3>31否,因此繼續循環
p=p+i
即p=1+3=4
i=i+2
即i=3+2=5
進行判斷,i=5>31否,繼續循環
p=p+i
即p=4+5=9
i=i+2
即
i=5+2=7
進行判斷,i=7>31否,繼續循環
.......
現在是不是可以發現什麼規律:p=0+1+3+5+7+......
i=1
i=3
i=5
i=7
.......
p=p+i
i=i+2因此你的問題就有了答案:
p代表的是每算一步累計的和,而i表示每次加的那個數。
p變成p+i的原因是:累計和=前一步算的數+這一步要加的數【累積和p=前一步算出的p+這一步要加的數i】
i變成i+2的原因是你加的數是1
3
5
7...每次都比上一次的多2,因此i=i+2
為什麼由p=p+i
又推到
i=i+2
?當你得出了累積和p時肯定要接著加一個數i來計算下一步的累計和p,而要加的這個數i是1
3
5
7
9。它並不是一個固定的數,而是每算一步就多加2.
設p=0是因為一開始的累計和為0
i=1是因為第一個要加的數為1
下面我給你做一下拓展:
求1+2+3+4+5+.......+31的和
想一下這道題和上面那道有什麼不同點,是不是由每次的多加2變成了多加1,因此算這道題時只需要將上一道題裡面的i=i+2換成i=i+1即可
讓p=0還有一個原因是為了計算方便,你可能會想第一步的和應該是1,為什麼不讓p=1呢,這樣就會少算一步,計算時很容易出錯,因此將第一步的和記為0
這類演算法的問題
你可以按照答案自己多寫幾步,就能發現它們之間的關系,掌握了技巧就不難了。希望你能盡快學會,加油哦!
⑽ 高二數學,演算法問題!
INPUT a,b,c
IF a>b and a>c THEN
PRINT a
ELSE
IF b>c THEN
PRINT b
ELSE
PRINT c
END IF
END IF
END