Re: [問題] 如何快速判斷某元素是否存在陣列中
※ 引述《jeffreychen ()》之銘言:
: 各位大大~請教如何判對元素是存在陣列中~比較短的表示法~
自己的一些心得 因為最近也在做大量陣列的判斷 就我知道大概有三個方法
1.直接用for迴圈判斷
這是最簡單 也是最慢的 大概是這樣
for $a (@a){
print "exist" if $b == $a
}
2. 使用智慧比對運算符號
這是最簡單也是在節省記憶體空間時最有效率的方法 使用時請記得呼叫5.10模組
use 5.010
print "exist" if $b ~~ @a
3. 使用hash(雜湊)搜尋
這是最快的 但也是會號記憶體的方法
$a{$_} = 1 for (@a)
print "exist" if $a{$b}
接下來就是自己實際使用的情況 目前我在進行一抽系統抽樣程式
但是碰到的問題就是 抽過的樣本不能再抽
但因為樣本紀錄ID是用一個很長串的字串 所以perl的工作就是要比對這非常長的字串
我的經驗是 相同大小的樣本 如果使用hash做搜尋會很快 而且樣本越大效果越明顯
但很快記憶體就會不夠
如果記憶體不夠的情況下 善用智慧型比對算符會是最好的選擇
以下是我測試的code和結果
use 5.010 ;
@a = (1..999999) ;
$b = "a" ;
$t = time() ;
for (1..9999999){
$b ~~ @a
}
say time()-$t ;
$a{$_} = 1 for @a ;
$t = time() ;
for (1..9999999){
$a{$b} ;
}
say time()-$t ;
## out put ###
53
0
所以結論是:
如果記憶體夠 請用hash 如果不用才使用智慧比對算符
至於方法1 當作練習題就好 除非你真的不在意程式效能
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.142.85.210
→
08/08 09:48, , 1F
08/08 09:48, 1F
→
08/08 13:49, , 2F
08/08 13:49, 2F
→
09/03 10:45, , 3F
09/03 10:45, 3F
→
09/03 10:45, , 4F
09/03 10:45, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章