vb.net中算法 vbnet implements

vb.net 排列組合算法

看了你說(shuō)遞歸的效率低。那么你可以不用的。

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出懷遠(yuǎn)免費(fèi)做網(wǎng)站回饋大家。

給出的方法就是先生成第一個(gè)排列,然后每次調(diào)用下面的函數(shù)給出下一個(gè)排列,這樣生成的效率很高,這個(gè)函數(shù)可以內(nèi)聯(lián)。

這個(gè)是很經(jīng)典的排列組合算法?。吭诰W(wǎng)上能搜到一大堆。

大概是那種帶指向的移動(dòng)的算法。我給你搜一個(gè)吧。

我找了幾個(gè),這個(gè)是我覺得說(shuō)的比較清楚的,你可以仔細(xì)參考一下,看不懂的話再搜點(diǎn)別的好了。。

全排列的算法跟這個(gè)不太一樣的。需要有點(diǎn)改動(dòng)的。

至于語(yǔ)言的話,應(yīng)該不會(huì)有太大問(wèn)題吧。。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源代碼剖析》,在這里我只說(shuō)一下我的理解:

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()算法的思路也基本相同,只不過(guò)它們尋找的"拐點(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è)疑問(wèn),假如要求的不是數(shù)字的排列組合,而是字符或字符串的排列組合呢?怎么辦?其實(shí)很簡(jiǎn)單,你只要拿數(shù)組的下標(biāo)來(lái)做排列組合,返回他們下標(biāo)的排列組合,然后再到原數(shù)組中讀取字符串值,就可以輸出全部的排列組合結(jié)果。

幾種經(jīng)典的二值化方法及其vb.net實(shí)現(xiàn)

圖像二值化的目的是最大限度的將圖象中感興趣的部分保留下來(lái),在很多情況下,也是進(jìn)行圖像分析、特征提取與模式識(shí)別之前的必要的圖像預(yù)處理過(guò)程。這個(gè)看似簡(jiǎn)單的問(wèn)題,在過(guò)去的四十年里受到國(guó)內(nèi)外學(xué)者的廣泛關(guān)注,產(chǎn)生了數(shù)以百計(jì)的閾值選取方法,但如同其他圖像分割算法一樣,沒(méi)有一個(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ù)法)可以說(shuō)是最古老的一種閾值選取方法。該方法根據(jù)先驗(yàn)概率來(lái)設(shè)定閾值,使得二值化后的目標(biāo)或背景像素比例等于先驗(yàn)概率,該方法簡(jiǎn)單高效,但是對(duì)于先驗(yàn)概率難于估計(jì)的圖像卻無(wú)能為力。

2、OTSU 算法(大津法)

OSTU算法可以說(shuō)是自適應(yīng)計(jì)算單閾值(用來(lái)轉(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í)作為分割圖像的閾值,這就是一維最大熵閾值圖像分割法。

用vb.netl編寫的floyd算法求兩點(diǎn)間的最短路徑,怎么輸出path經(jīng)過(guò)的頂點(diǎn)序列?

Function Min(x() as integer,y() as integer) as double

dim i,j,k,a

dim m() as double

dim s() as string

dim mins as string

redim m(ubound(x),ubound(x))

redim s(ubound(x),ubound(x))

for i=1 to ubound(x)-1 '從起始點(diǎn)0點(diǎn)到i點(diǎn)的距離

m(i,0)=((x(i)-x(0))^2+(y(i)-y(0))^2)^0.5

s(i,0)="0-" cstr(i)

next

'從起始點(diǎn)開始經(jīng)過(guò)K個(gè)點(diǎn)后到達(dá)i點(diǎn)的最短距離m(i,k),s為各點(diǎn)的連線如"0-3-2-1-4"

for k=1 to ubound(x)-2

for i=1 to ubound(x)-1

m(i,k)=10^307

for j=1 to ubound(x)-1

if instr(s(j,k-1),cstr(i))=0 then'避免重復(fù)走一點(diǎn)

a=((x(i)-x(j))^2+(y(i)-y(j))^2)^0.5

if a+m(j,k-1)m(i,k) then

m(i,k)=a+m(j,k-1)

s(i,k)=s(j,k-1) "-" cstr(i)

endif

end if

next

next

next

'計(jì)算經(jīng)過(guò)各點(diǎn)后到達(dá)最后一個(gè)點(diǎn)的最短距離

min=10^307

for j=1 to ubound(x)-1

a=((x(ubound(x))-x(j))^2+(y(ubound(x))-y(j))^2)^0.5

if a+m(j,ubound(x)-2)min then

min=a+m(j,ubound(x)-2)

mins=s(j,ubound(x)-2) "-" cstr(ubound(x))

end if

next

msgbox "最短距離:" min vbcrlf "最短路徑:" mins

End function

private sub Command1_Click

dim x(5) as integer

dim y(5) as integer

dim m as double

x(0)=0

y(0)=0

x(1)=40

y(1)=600

......

x(5)=1000

y(5)=1000

m=min(x,y)

End sub

求VB.NET的MD5算法調(diào)用

下面是完整的類,可以設(shè)置任意密碼

'DES及md5加密解密----添加引用中添加對(duì)system.web的引用。

Imports?System.Security.Cryptography

Imports?System

Imports?System.Text

Imports?System.Web

'''?summary

'''?DES加密類

'''?/summary

'''?remarks/remarks

Public?Class?DESEncrypt

Public?Sub?DESEncrypt()

End?Sub

Public?Shared?Function?Encrypt(ByVal?Text?As?String)?As?String

Return?Encrypt(Text,?"12345678")

End?Function

Public?Shared?Function?Encrypt(ByVal?Text?As?String,?ByVal?sKey?As?String)?As?String

Dim?des?As?New?DESCryptoServiceProvider()

Dim?inputByteArray?As?Byte()

inputByteArray?=?Encoding.Default.GetBytes(Text)

des.Key?=?ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey,?"md5").Substring(0,?8))

des.IV?=?ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey,?"md5").Substring(0,?8))

Dim?ms?As?New?System.IO.MemoryStream()

Dim?cs?As?New?CryptoStream(ms,?des.CreateEncryptor(),?CryptoStreamMode.Write)

cs.Write(inputByteArray,?0,?inputByteArray.Length)

cs.FlushFinalBlock()

Dim?ret?As?New?StringBuilder()

Dim?b?As?Byte

For?Each?b?In?ms.ToArray()

ret.AppendFormat("{0:X2}",?b)

Next

Return?ret.ToString()

End?Function

Public?Shared?Function?Decrypt(ByVal?Text?As?String)?As?String

Return?Decrypt(Text,?"12345678")

End?Function

Public?Shared?Function?Decrypt(ByVal?Text?As?String,?ByVal?sKey?As?String)?As?String

Dim?des?As?New?DESCryptoServiceProvider()

Dim?len?As?Integer

len?=?Text.Length?/?2

Dim?inputByteArray(len?-?1)?As?Byte

Dim?x,?i?As?Integer

For?x?=?0?To?len?-?1

i?=?Convert.ToInt32(Text.Substring(x?*?2,?2),?16)

inputByteArray(x)?=?CType(i,?Byte)

Next

des.Key?=?ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey,?"md5").Substring(0,?8))

des.IV?=?ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey,?"md5").Substring(0,?8))

Dim?ms?As?New?System.IO.MemoryStream()

Dim?cs?As?New?CryptoStream(ms,?des.CreateDecryptor(),?CryptoStreamMode.Write)

cs.Write(inputByteArray,?0,?inputByteArray.Length)

cs.FlushFinalBlock()

Return?Encoding.Default.GetString(ms.ToArray())

End?Function

End?Class

'以下是調(diào)用方法

Public?Class?Form1

Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click?'加密

Dim?str_Encrypt?As?String?=?DESEncrypt.Encrypt("你要加密的文本,可以是任意長(zhǎng)度",?"密碼,可以很長(zhǎng),如果省略這個(gè)參數(shù)就是默認(rèn)的12345678")

End?Sub

Private?Sub?Button2_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button2.Click?'解密

Dim?str_Decrypt?As?String?=?DESEncrypt.Decrypt("你要解密的文本,?可以是任意長(zhǎng)度",?"加密時(shí)用到的密碼,如果省略這個(gè)參數(shù)就是默認(rèn)的12345678")

End?Sub

文章標(biāo)題:vb.net中算法 vbnet implements
標(biāo)題來(lái)源:http://muchs.cn/article32/doschpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站營(yíng)銷App設(shè)計(jì)、電子商務(wù)、建站公司、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)