PHP在列表中查找数字的最有效方法


PHP Most efficient way to find a number in a list

我有一个300个数字的列表,它们没有排序。我想找到最有效的方法来确定一个数字是否在该列表中。

简单的答案是in_array()。这当然有一个O(n)的大O。

但既然我完全控制了这份清单,我相信我可以更快地完成。

所以我把这个列表做成了一个关联数组,其中key是我正在寻找的数字,isset()会给我O(1)。

$myArray = array('434342'=>true, '345235'=>true, '562211'=>true, '3333245'=>true, '99087782'=>true);

这是最好的方法吗?由于数组大小很小,因此在n=300的情况下,O(n)的命中不值得付出额外的努力。

300个数组元素:

in_array()    
0.00000000000000000000 seconds    
bool(true)
isset()    
0.00000000000000000000 seconds    
bool(true)

500000个阵列元素:

in_array()    
0.00500106811523437500 seconds    
bool(true)
isset()    
0.00000000000000000000 seconds    
bool(true)

只要您能够完全控制列表,您的方法就是最有效的。

一个小的变化:不用关联数组,而是使用一个简单的基于数字的数组
isset()也可以工作,并且不需要比较字符串。

无论如何,这是最有效的方法,但在这种数据大小下,这可能是浪费时间。

如果你的数组没有排序,你的平均成绩不会比O(n)更好

它可以通过一些统计公式来证明,利用在非结构化(未排序)阵列中找到特定元素的等概率

如果数组具有特定的结构,某些算法在某些情况下会更快。如果我们有更多关于这个阵列的详细信息,也许会对我们有所帮助