Re: [問題] 如何快速判斷某元素是否存在陣列中

看板Perl作者 (把青春freeze)時間12年前 (2012/08/03 17:39), 編輯推噓0(004)
留言4則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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
能否請基於目前條件,用delete查詢過的hash data測試記憶
09/03 10:45, 3F

09/03 10:45, , 4F
體使用率及效能? 感謝~
09/03 10:45, 4F
文章代碼(AID): #1G6vn9uZ (Perl)
文章代碼(AID): #1G6vn9uZ (Perl)