在10个数字的未排序整数数组中搜索第一个重复值的最快方法?

时间:2012-10-12 13:18:00

标签: php search

在10个数字的未排序整数数组中搜索第一个重复值的最快方法是什么?

如果数组有1000万条记录,答案应该是什么?

3 个答案:

答案 0 :(得分:2)

我能想到的唯一方法是使用2个数组,因为你需要first repetitive value in an unsorted integer

1000万???不确定内存含义

PHP DOC Comment

  

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万条记录阵列生成时间过长。