十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
僅僅是普通表達(dá)式的話,定義數(shù)據(jù)類型,比如從單精度改為雙精度,如果想保留小數(shù)點(diǎn)位數(shù),用formatnumber來處理。如果是某個(gè)算法的精度,就要復(fù)雜一些,要定義一個(gè)誤差,在算法迭代過程中,用while語(yǔ)句判斷計(jì)算結(jié)果的殘差是否小于定義的誤差值,至于殘差如何計(jì)算,與你的算法有關(guān)
創(chuàng)新互聯(lián)公司成立與2013年,先為絳縣等服務(wù)建站,絳縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為絳縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
有許多字符串操作技巧可以幫助你優(yōu)化代碼,以獲得更好的性能。StringBuilder允許你執(zhí)行重復(fù)的字符串操作,取得比手工操作更佳的性能。在本文中,我說明在VB.NET中利用StringBuilder的情況。應(yīng)用StringBuilder的優(yōu)點(diǎn)StringBuilder是一個(gè)可修改字符的緩沖器。當(dāng)你不直接進(jìn)行字符串操作而應(yīng)用StringBuilder時(shí),與每次重復(fù)生成一個(gè)含有修正的新字符串相比,這樣可以獲得更佳的性能。你不能總是希望性能得到提高,因?yàn)镾tringBuilder有少量的過度操作,會(huì)將指定字符串的內(nèi)容復(fù)制到StringBuilder中,然后將由StringBuilder得到的結(jié)果值復(fù)制回字符串對(duì)象中。在進(jìn)行二個(gè)或更多字符串操作時(shí),我建議使用StringBuilder。(如果只有一項(xiàng)改變,將值復(fù)制進(jìn)StringBuilder再拷貝出來并不會(huì)改善性能。)StringBuilder方法Append:允許你在緩沖器末端增加一個(gè)字符串。注意,在應(yīng)用StringBuilder對(duì)象時(shí)不能使用操作符。 Insert:允許你在StringBuilder對(duì)象中增加一個(gè)字符串。(就像String.Insert一樣。) Remove:允許你從StringBuilder對(duì)象中刪除一個(gè)字符串。(就像String.Remove一樣。) Replace:允許你替代StringBuilder對(duì)象的一部分。(就像String.Replace一樣。) 實(shí)例在列表A的樣本代碼中,我建立一個(gè)字符串變量strOriginal來保存原始文本的值。我還定義StringBuilder對(duì)象BuilderStr,我將利用它對(duì)存儲(chǔ)在srtOriginal中的文本進(jìn)行字符串操作。定義BuilderStr時(shí),我將它設(shè)定到strOriginal的值中。之后,我操作BuilderStr,給它添加一些文本(“is”, ”very”,” important”),然后再利用Replace方法去掉”very”這個(gè)單詞。(注意,在這個(gè)例子中,你使用Remove方法而非Replace方法。)最后,我用BuilderStr.ToString的值更新strOriginal,并在信息框中顯示所得到的字符串。
圖像二值化的目的是最大限度的將圖象中感興趣的部分保留下來,在很多情況下,也是進(jìn)行圖像分析、特征提取與模式識(shí)別之前的必要的圖像預(yù)處理過程。這個(gè)看似簡(jiǎn)單的問題,在過去的四十年里受到國(guó)內(nèi)外學(xué)者的廣泛關(guān)注,產(chǎn)生了數(shù)以百計(jì)的閾值選取方法,但如同其他圖像分割算法一樣,沒有一個(gè)現(xiàn)有方法對(duì)各種各樣的圖像都能得到令人滿意的結(jié)果。
本文針對(duì)幾種經(jīng)典而常用的二值發(fā)放進(jìn)行了簡(jiǎn)單的討論并給出了其vb.net 實(shí)現(xiàn)。
1、P-Tile法
Doyle于1962年提出的P-Tile (即P分位數(shù)法)可以說是最古老的一種閾值選取方法。該方法根據(jù)先驗(yàn)概率來設(shè)定閾值,使得二值化后的目標(biāo)或背景像素比例等于先驗(yàn)概率,該方法簡(jiǎn)單高效,但是對(duì)于先驗(yàn)概率難于估計(jì)的圖像卻無(wú)能為力。
2、OTSU 算法(大津法)
OSTU算法可以說是自適應(yīng)計(jì)算單閾值(用來轉(zhuǎn)換灰度圖像為二值圖像)的簡(jiǎn)單高效方法。1978 OTSU年提出的最大類間方差法以其計(jì)算簡(jiǎn)單、穩(wěn)定有效,一直廣為使用。
3、迭代法(最佳閥值法)
(1). 求出圖象的最大灰度值和最小灰度值,分別記為Zl和Zk,令初始閾值為:
(2). 根據(jù)閾值TK將圖象分割為前景和背景,分別求出兩者的平均灰度值Z0和ZB:
式中,Z(i,j)是圖像上(i,j)點(diǎn)的象素值,N(i,j)是(i,j)點(diǎn)的權(quán)值,一般取1。
(3). 若TK=TK+1,則所得即為閾值,否則轉(zhuǎn)2,迭代計(jì)算。
4、一維最大熵閾值法
它的思想是統(tǒng)計(jì)圖像中每一個(gè)灰度級(jí)出現(xiàn)的概率 ,計(jì)算該灰度級(jí)的熵 ,假設(shè)以灰度級(jí)T分割圖像,圖像中低于T灰度級(jí)的像素點(diǎn)構(gòu)成目標(biāo)物體(O),高于灰度級(jí)T的像素點(diǎn)構(gòu)成背景(B),那么各個(gè)灰度級(jí)在本區(qū)的分布概率為:
O區(qū): i=1,2……,t
B區(qū): i=t+1,t+2……L-1
上式中的 ,這樣對(duì)于數(shù)字圖像中的目標(biāo)和背景區(qū)域的熵分別為:
對(duì)圖像中的每一個(gè)灰度級(jí)分別求取W=H0 +HB,選取使W最大的灰度級(jí)作為分割圖像的閾值,這就是一維最大熵閾值圖像分割法。
看了你說遞歸的效率低。那么你可以不用的。
給出的方法就是先生成第一個(gè)排列,然后每次調(diào)用下面的函數(shù)給出下一個(gè)排列,這樣生成的效率很高,這個(gè)函數(shù)可以內(nèi)聯(lián)。
這個(gè)是很經(jīng)典的排列組合算法???在網(wǎng)上能搜到一大堆。
大概是那種帶指向的移動(dòng)的算法。我給你搜一個(gè)吧。
我找了幾個(gè),這個(gè)是我覺得說的比較清楚的,你可以仔細(xì)參考一下,看不懂的話再搜點(diǎn)別的好了。。
全排列的算法跟這個(gè)不太一樣的。需要有點(diǎn)改動(dòng)的。
至于語(yǔ)言的話,應(yīng)該不會(huì)有太大問題吧。。basic版的確實(shí)比較少,現(xiàn)在我也比較懶不想動(dòng)手寫。。還是要靠你自己啦。
★生成排列的算法:
比如要生成5,4,3,2,1的全排列,首先找出一個(gè)最小的排列12345, 然后依次調(diào)用n!次STL算法中的next_permutation()即可輸出所有的全排列情況。所以這種算法的細(xì)節(jié)就是STL algorithm中next_permutation()的實(shí)現(xiàn)機(jī)制。詳細(xì)的實(shí)現(xiàn)代碼,大伙可以參考侯捷的《STL源代碼剖析》,在這里我只說一下我的理解:
1 首先從最尾端開始往前尋找兩個(gè)相鄰元素,令第一個(gè)元素為*i,第二個(gè)元素為*ii,且滿足*i*ii,找到這樣一組相鄰的元素后。
2 再?gòu)淖钗捕碎_始往前檢驗(yàn),找出第一個(gè)大于*i的元素,令為*k,將i,k元素對(duì)調(diào)。
3 再將ii及ii之后的所有元素顛倒排列,此即所求之"下一個(gè)"排列。
prev_permutation()算法的思路也基本相同,只不過它們尋找的"拐點(diǎn)"不同,在next_permutation()算法中尋找的是峰值拐點(diǎn),而在prev_permutation()算法中尋找的是谷值拐點(diǎn)。另外,在第二步中,prev_permutation()要找的是第一個(gè)小于*i的元素而不是第一個(gè)大于*i的元素。
具體例子,有空再舉,現(xiàn)在時(shí)間太晚了:)
★生成組合的算法:
如下面截圖所示,分全組合和r-組合兩種情況。
這里有一段核心代碼:
//--------------------------------------------------------
// Generate next combination (algorithm from Rosen p. 286)
//--------------------------------------------------------
public int[] getNext () {
if (numLeft.equals (total)) {
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
int i = r - 1;
while (a[i] == n - r + i) {
i--;
}
a[i] = a[i] + 1;
for (int j = i + 1; j r; j++) {
a[j] = a[i] + j - i;
}
numLeft = numLeft.subtract (BigInteger.ONE);
return a; //這里返回的a數(shù)組,存儲(chǔ)的就是下標(biāo)的排列組合。
}
到這里,也許大伙會(huì)有一個(gè)疑問,假如要求的不是數(shù)字的排列組合,而是字符或字符串的排列組合呢?怎么辦?其實(shí)很簡(jiǎn)單,你只要拿數(shù)組的下標(biāo)來做排列組合,返回他們下標(biāo)的排列組合,然后再到原數(shù)組中讀取字符串值,就可以輸出全部的排列組合結(jié)果。
運(yùn)用多線程技術(shù)把一個(gè)任務(wù)分配到幾個(gè)線程上讓它們同時(shí)處理,這樣會(huì)比單線程快很多,不過多線程技術(shù)不是一兩話能說清的,你可以查一下相關(guān)的資料.