我有一个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)更好
它可以通过一些统计公式来证明,利用在非结构化(未排序)阵列中找到特定元素的等概率
如果数组具有特定的结构,某些算法在某些情况下会更快。如果我们有更多关于这个阵列的详细信息,也许会对我们有所帮助