新聞中心
本文和大家重點(diǎn)討論一下Perl關(guān)聯(lián)數(shù)組和哈希表的概念,Perl關(guān)聯(lián)數(shù)組,又稱(chēng)為哈希表(hashtable),是一種非常好用的數(shù)據(jù)結(jié)構(gòu)。希望通過(guò)本文的介紹你對(duì)Perl關(guān)聯(lián)數(shù)組的概念有深入的了解。

十年的管城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整管城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“管城網(wǎng)站設(shè)計(jì)”,“管城網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Perl關(guān)聯(lián)數(shù)組和哈希表
Perl關(guān)聯(lián)數(shù)組,又稱(chēng)為哈希表(hashtable),是一種非常好用的數(shù)據(jù)結(jié)構(gòu)。
在程序中,我們可能會(huì)遇到需要消重的問(wèn)題,舉一個(gè)最簡(jiǎn)單的模型:
有一份用戶(hù)名列表,存儲(chǔ)了10000個(gè)用戶(hù)名,沒(méi)有重復(fù)項(xiàng);
還有一份黑名單列表,存儲(chǔ)了2000個(gè)用戶(hù)名,格式與用戶(hù)名列表相同;
現(xiàn)在需要從用戶(hù)名列表中刪除處在黑名單里的用戶(hù)名,要求用盡量快的時(shí)間處理。
這個(gè)問(wèn)題是一個(gè)小規(guī)模的處理量,如果實(shí)際一點(diǎn),2個(gè)表都可能很大,比如有2億條記錄。
我最開(kāi)始想到的方法,就是做一個(gè)嵌套的循環(huán),設(shè)用戶(hù)名表有M條記錄,黑名單列表有N條記錄,那么,循環(huán)的次數(shù)是M*N次!
PHP版代碼:
- foreach($arrayMas$keyM=>$nameM){
- foreach($arrayNas$nameN){
- if($nameM==$nameN){
- //本行執(zhí)行了M*N次!
- unset($arrayM[$keyM]);
- }
- }
- }
- return$arrayM;
- ?>
另一種方式,利用數(shù)組索引。
PHP是一種弱類(lèi)型的語(yǔ)言,不像C語(yǔ)言那樣有嚴(yán)格的變量類(lèi)型限制。C語(yǔ)言的數(shù)組,每一個(gè)元素的類(lèi)型必須一致,而且索引都是從0開(kāi)始。
PHP的數(shù)組,可以用字符串作為索引,也稱(chēng)為Perl關(guān)聯(lián)數(shù)組。
數(shù)組索引,有一個(gè)天然的限制就是不會(huì)重復(fù),而且訪問(wèn)的時(shí)候不需要查找,可以直接定位。
還是剛才的那個(gè)問(wèn)題,我們采用另一種辦法。
把黑名單列表的用戶(hù)名組織到一個(gè)數(shù)組里,數(shù)組的索引就是用戶(hù)名。
然后,遍歷用戶(hù)列表的時(shí)候,只需直接用isset查詢(xún)那個(gè)用戶(hù)名是否存在即可。
PHP版代碼:
- $arrayarrayHash=array();
- foreach($arrayNas$nameN){
- //本行執(zhí)行了N次。
- $arrayHash[$nameN]=1;
- }
- foreach($arrayMas$keyM=>$nameM){
- if(isset($arrayHash[$nameM])){
- //本行執(zhí)行了M次!
- unset($arrayM[$keyM]);
- }
- }
- return$arrayM;
- ?>
可以看到,優(yōu)化過(guò)的代碼,循環(huán)次數(shù)是M+N次。
假如M和N都是10000,優(yōu)化前,循環(huán)了1億次;優(yōu)化后,只循環(huán)了20000次,差了5000倍!
如果第二個(gè)程序耗時(shí)1秒,則第一個(gè)程序需要將近一個(gè)半小時(shí)!
最近在做Perl的開(kāi)發(fā),Perl在處理文本的時(shí)候有很高的效率,同樣,它也支持Perl關(guān)聯(lián)數(shù)組!
只是語(yǔ)法和PHP的那種類(lèi)C的方式有很大不同,以第二段代碼為例,Perl版的實(shí)現(xiàn):
- #!/usr/bin/perl
- my%arrayHash;
- for(my$i=0;$i<@arrayN;++$i){
- $arrayHash{$arrayN[$i]}=1;
- }
- for(my$i=0;$i<@arrayM;++$i){
- if($arrayHash{$arrayM[$i]}){
- $arrayM[$i]=undef;
- }
- }
Perl關(guān)聯(lián)數(shù)組是@開(kāi)頭,哈希是以%開(kāi)頭,unset實(shí)際上就是undef。
Perl的哈希和數(shù)組都是有具體類(lèi)型的,而且向函數(shù)傳遞變量的時(shí)候要傳引用,我剛學(xué)時(shí)間不長(zhǎng),快被搞暈了。
不過(guò),現(xiàn)在剛剛實(shí)現(xiàn)了一個(gè)以hash方式進(jìn)行IP位置查找的算法,平均比較次數(shù)大概在3次左右,比傳統(tǒng)的折半查找方式少了很多次,它大概需要8次以上的比較。
剛剛做了一個(gè)小的性能測(cè)試,對(duì)10萬(wàn)個(gè)IP進(jìn)行查找,在我的臺(tái)式機(jī)上,耗時(shí)15秒,平均每秒7500次,感覺(jué)還不錯(cuò),呵呵。不過(guò),還是喜歡PHP的數(shù)組,真的很強(qiáng)大 。
本文標(biāo)題:揭秘Perl關(guān)聯(lián)數(shù)組和哈希表聯(lián)系
網(wǎng)站鏈接:http://fisionsoft.com.cn/article/djocpce.html


咨詢(xún)
建站咨詢(xún)
