使用大型数组的有效方法

时间:2011-06-23 11:09:57

标签: php arrays

我有一个大约500个整数值的大型数组。我有另一个整数,我需要测试数组中的每个值,以查看它是否满足数组值 - 15和数组值+ 15之间的条件。除了迭代数组中的每个值并进行比较,是否有更简洁,更有效的方法来做到这一点?我正在使用PHP 5.2

编辑:所以如果我有数组(10,...,2500)和$ n = 2510,我想看看$ n是否匹配任何数组值的任何一方之间的条件。在这种情况下,对于最后一个值2500,条件为真。

我意识到500并不是一个怪异的阵列:)

4 个答案:

答案 0 :(得分:2)

following snippet将在不到0.001秒的时间内在我的普通桌面上的数组中返回n-15到n + 15之间的值(包括生成包含要搜索的值的数组)为):

$n = 2500;
print_r(
    array_filter(
        array_map(function($v) {return $v * 10;}, range(1,500)),
        function($v) use ($n) {
            return $v > $n-15 && $v < $n+15;
        }
    )
);

我知道你使用的是PHP5.2并且由于Closure和Lambda而无法使用上面的确切片段,但这不是重点(只需使用常规函数进行回调)。关键是,如果500个数组值的小于0秒在应用程序的整个范围内不够好,那么请继续在userland中编写算法。但如果不到0秒就可以了,那就不要试图超越PHP。

答案 1 :(得分:1)

如果您通过对数组或类似内容进行排序,在混合中添加更多信息,则只能提高效率。否则你只能比较每个值。但500不是很多。

如果您对数组进行排序,那么您可以通过多种方式提高性能,例如查看每个值以查看它是否在范围内,并在找到第一个不是(可能很小的改进)时停止。或者你可以搜索范围内的第一个元素和超出范围的第一个元素,然后你知道有效元素的索引,并且可以使用它们。

您可以使用binary search找到感兴趣的指数,这比查看每个值更快。

显然,这样做的好处取决于上下文,正如phant0m在注释中指出的那样,如果你要为每次比较对数组进行一次排序,那么你也可以不打扰,只是进行比较。如果您要在同一个数组中查找许多不同的比较值,那么排序可能会让您受益。如果您可以创建已经排序的阵列而无需额外费用,那么它是一个双赢的局面。

对500个元素的数组进行二进制搜索将需要大约8次搜索。如果您只需要查找其中一个值是否符合您的条件,那么这将更有效。如果你需要找到所有的值,那么你需要做一些修改才能找到第一个值和最后一个值,但它仍然应该在&lt; 25比较而不是250(按顺序执行排序数组的平均比较)。但是阵列越大,好处就会越明显,因为在下一个搜索点等工作中会有一些开销......

Here is an example of binary search in PHP,这只是一个谷歌搜索结果,没有经过我检查或验证,需要调整以适应您的范围条件。

this one可能会更好,可能会允许您提供一个比较器来测试您想要的范围。

答案 2 :(得分:1)

如果您正在进行搜索并添加ad hoc,请按以下方式使用树

将数字放在树中而不是数组中。然后使用二进制搜索来查找新项目在数组中的位置。然后检查它是否在阵列中前一个和下一个项目的15个之内。

现在而不是围绕计数($ thearray)操作。它是日志(计数($ thearray))操作。

这样效率更高。

如果您有数据并且只是进行搜索,那么使用有序数组,然后对该数组进行搜索,只检查上一个和下一个。

答案 3 :(得分:0)

可以更快地使用PHP的内置函数:

$arr1 = range(10,2500);
$n = 2510;
$arr2 = range($n - 15, $n + 15);
print_r(array_intersect($arr1, $arr2));

输出:

Array
(
    [2485] => 2495
    [2486] => 2496
    [2487] => 2497
    [2488] => 2498
    [2489] => 2499
    [2490] => 2500
)