自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

揭秘Perl關(guān)聯(lián)數(shù)組和哈希表聯(lián)系

開發(fā) 架構(gòu)
Perl語言中Perl關(guān)聯(lián)數(shù)組有很多值得學(xué)習(xí)的地方,這里向大家簡(jiǎn)單介紹一下Perl關(guān)聯(lián)數(shù)組的概念,希望本文的介紹能讓你有所收獲。

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

Perl關(guān)聯(lián)數(shù)組和哈希表

Perl關(guān)聯(lián)數(shù)組,又稱為哈希表(hashtable),是一種非常好用的數(shù)據(jù)結(jié)構(gòu)。

在程序中,我們可能會(huì)遇到需要消重的問題,舉一個(gè)最簡(jiǎn)單的模型:

有一份用戶名列表,存儲(chǔ)了10000個(gè)用戶名,沒有重復(fù)項(xiàng);
還有一份黑名單列表,存儲(chǔ)了2000個(gè)用戶名,格式與用戶名列表相同;
現(xiàn)在需要從用戶名列表中刪除處在黑名單里的用戶名,要求用盡量快的時(shí)間處理。

這個(gè)問題是一個(gè)小規(guī)模的處理量,如果實(shí)際一點(diǎn),2個(gè)表都可能很大,比如有2億條記錄。

我最開始想到的方法,就是做一個(gè)嵌套的循環(huán),設(shè)用戶名表有M條記錄,黑名單列表有N條記錄,那么,循環(huán)的次數(shù)是M*N次!
PHP版代碼:

 

  1. <?php 
  2. foreach($arrayMas$keyM=>$nameM){  
  3. foreach($arrayNas$nameN){  
  4. if($nameM==$nameN){  
  5. //本行執(zhí)行了M*N次!  
  6. unset($arrayM[$keyM]);  
  7. }  
  8. }  
  9. }  
  10. return$arrayM;  
  11. ?&gt; 
  12.  

 

另一種方式,利用數(shù)組索引。

PHP是一種弱類型的語言,不像C語言那樣有嚴(yán)格的變量類型限制。C語言的數(shù)組,每一個(gè)元素的類型必須一致,而且索引都是從0開始。
PHP的數(shù)組,可以用字符串作為索引,也稱為Perl關(guān)聯(lián)數(shù)組。
數(shù)組索引,有一個(gè)天然的限制就是不會(huì)重復(fù),而且訪問的時(shí)候不需要查找,可以直接定位。

還是剛才的那個(gè)問題,我們采用另一種辦法。

把黑名單列表的用戶名組織到一個(gè)數(shù)組里,數(shù)組的索引就是用戶名。

然后,遍歷用戶列表的時(shí)候,只需直接用isset查詢那個(gè)用戶名是否存在即可。

PHP版代碼:

  1. <?php 
  2. $arrayarrayHash=array();  
  3. foreach($arrayNas$nameN){  
  4. //本行執(zhí)行了N次。  
  5. $arrayHash[$nameN]=1;  
  6. }  
  7.  
  8. foreach($arrayMas$keyM=>$nameM){  
  9. if(isset($arrayHash[$nameM])){  
  10. //本行執(zhí)行了M次!  
  11. unset($arrayM[$keyM]);  
  12. }  
  13. }  
  14. return$arrayM;  
  15. ?&gt; 
  16.  

可以看到,優(yōu)化過的代碼,循環(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的開發(fā),Perl在處理文本的時(shí)候有很高的效率,同樣,它也支持Perl關(guān)聯(lián)數(shù)組!

只是語法和PHP的那種類C的方式有很大不同,以第二段代碼為例,Perl版的實(shí)現(xiàn):

 

  1.  #!/usr/bin/perl  
  2. my%arrayHash;  
  3. for(my$i=0;$i&lt;@arrayN;++$i){  
  4. $arrayHash{$arrayN[$i]}=1;  
  5. }  
  6.  
  7. for(my$i=0;$i&lt;@arrayM;++$i){  
  8. if($arrayHash{$arrayM[$i]}){  
  9. $arrayM[$i]=undef;  
  10. }  
  11. }  
  12.  

 

Perl關(guān)聯(lián)數(shù)組是@開頭,哈希是以%開頭,unset實(shí)際上就是undef。
Perl的哈希和數(shù)組都是有具體類型的,而且向函數(shù)傳遞變量的時(shí)候要傳引用,我剛學(xué)時(shí)間不長(zhǎng),快被搞暈了。

不過,現(xiàn)在剛剛實(shí)現(xiàn)了一個(gè)以hash方式進(jìn)行IP位置查找的算法,平均比較次數(shù)大概在3次左右,比傳統(tǒng)的折半查找方式少了很多次,它大概需要8次以上的比較。
剛剛做了一個(gè)小的性能測(cè)試,對(duì)10萬個(gè)IP進(jìn)行查找,在我的臺(tái)式機(jī)上,耗時(shí)15秒,平均每秒7500次,感覺還不錯(cuò),呵呵。不過,還是喜歡PHP的數(shù)組,真的很強(qiáng)大 。

  1. Perl關(guān)聯(lián)數(shù)組用法集錦
  2. Perl文件句柄概念詳解
  3. 術(shù)語匯編 Perl變量中Perl關(guān)聯(lián)數(shù)組用法解析
  4. Perl關(guān)聯(lián)數(shù)組用法詳解
  5. 學(xué)習(xí)筆記 如何用Perl關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2010-07-16 10:20:46

Perl關(guān)聯(lián)數(shù)組

2010-07-16 10:30:10

Perl關(guān)聯(lián)數(shù)組

2010-07-13 16:20:21

Perl 哈希表

2010-07-13 09:58:51

Perl關(guān)聯(lián)數(shù)組

2010-07-19 15:31:10

Perl關(guān)聯(lián)數(shù)組函數(shù)

2010-07-16 10:38:24

Perl關(guān)聯(lián)數(shù)組

2010-07-16 13:50:53

Perl哈希表

2010-07-21 13:53:07

Perl引用

2010-07-13 16:34:34

Perl 哈希表

2010-07-26 16:54:15

Perl引用

2010-07-21 13:59:59

Perl引用

2010-07-16 13:10:36

Perl哈希表

2010-07-16 13:57:13

Perl哈希表

2009-11-24 19:40:07

PHP關(guān)聯(lián)數(shù)組查詢結(jié)果

2009-11-17 17:07:01

PHP關(guān)聯(lián)數(shù)組

2010-12-15 09:10:01

PHP關(guān)聯(lián)數(shù)組

2009-11-24 19:25:32

PHP關(guān)聯(lián)數(shù)組

2009-06-23 16:53:53

語義網(wǎng)Web3.0關(guān)聯(lián)數(shù)據(jù)

2010-07-20 15:02:20

Perl數(shù)組

2010-07-13 09:23:00

Perl變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)