我有300个号码的清单,它们没有订购。我想找到一种最有效的方法来确定一个数字是否在该列表中。
简单的答案是in_array()
。这当然有一个O(n)的大O.
但是由于我完全控制了这个列表,我相信我可以让它更快。
所以我将列表设为一个关联数组,其中key是我要查找的数字isset()
将产生O(1)。
$myArray = array('434342'=>true, '345235'=>true, '562211'=>true, '3333245'=>true, '99087782'=>true);
这是最好的方法吗?由于数组大小很小,O(n)的命中,其中n = 300,这不值得额外的努力。
答案 0 :(得分:3)
300个数组元素:
in_array()
0.00000000000000000000 seconds
bool(true)
isset()
0.00000000000000000000 seconds
bool(true)
500,000个数组元素:
in_array()
0.00500106811523437500 seconds
bool(true)
isset()
0.00000000000000000000 seconds
bool(true)
答案 1 :(得分:2)
只要您完全控制列表,您的方式就是最有效的。
一个小变化:使用一个基于数字的简单数组,而不是使用关联数组
isset()
也可以使用,不需要比较字符串。
无论如何,这是最有效的方式,但在这种数据大小中 - 这可能是浪费时间。
答案 2 :(得分:0)
如果你的阵列没有排序,你不能做得比O(n)平均好
可以通过一些统计公式证明,使用在非结构化(未排序)数组中找到特定元素的等概率
如果阵列具有特定结构,某些算法在某些情况下会更快。如果我们有关于此数组的更多详细信息,它可能会对我们有所帮助