在10个数字的未排序整数数组中搜索第一个重复值的最快方法是什么?
如果数组有1000万条记录,答案应该是什么?
答案 0 :(得分:2)
我能想到的唯一方法是使用2个数组,因为你需要first repetitive value in an unsorted integer
1000万???不确定内存含义
splFixedArray的内存占用量约为相同大小的常规“数组”的37%。 我希望有更多,但这也很重要,那就是你期望看到差异的地方,而不是“性能
How big are PHP arrays (and values) really? (Hint: BIG!)
示例
$array = SplFixedArray::fromArray(array(1,2,4,6,4,2,7,7,3,3,1));
$list = array();
foreach ($array as $value ) {
if (in_array($value, $list)) {
echo $value;
break;
}
$list[] = $value;
}
输出
4
答案 1 :(得分:1)
如果你想要最小的重复数字,那么
使用基数排序在O(n)时间
循环排序数组并找到第一个重复
如果你想要数组已经存在的任何顺序的第一个重复数字
答案 2 :(得分:1)
这是基准代码。它太大了,不适合评论,所以我把它作为单独的答案。
<?php
$array = range(0, 10000);
$time_start = microtime(true);
$list = array();
foreach ( $array as $value ) {
if (in_array($value, $list)) {
echo $value;
break;
}
$list[] = $value;
}
printf("Using foreach loop:<br/>%0.10f<br/><br/>", microtime(true)-$time_start);
$time_start = microtime(true);
$list = array();
foreach ( new ArrayIterator($array) as $value ) {
if (in_array($value, $list)) {
echo $value;
break;
}
$list[] = $value;
}
printf("Using ArrayIterator:<br/>%0.10f<br/><br/>", microtime(true)-$time_start);
foreach
循环比ArrayIterator
快。
我尝试了10000个元素。元素使用range函数生成,这确保了我有“最差”的输入数组,其中所有元素都不同。
我的机器上有100万条记录阵列生成时间过长。