Re: [问题] 如何快速判断某元素是否存在阵列中

楼主: abliou (愚者)   2012-08-03 17:39:18
※ 引述《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 当作练习题就好 除非你真的不在意程式效能
作者: windincloud (虹霓之恋)   2012-08-08 09:48:00
嗯~ 这里再贡献一种方法... 二分搜寻法
楼主: abliou (愚者)   2012-08-08 13:49:00
因为我的资料是会变动的 不适合二元搜索 可能要等后人补充
作者: searober   2012-09-03 10:45:00
能否请基于目前条件,用delete查询过的hash data测试内存使用率及效能? 感谢~

Links booklink

Contact Us: admin [ a t ] ucptt.com