微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大型数组的有效工作方式

如何解决大型数组的有效工作方式

| 我有大约500个整数值的大型数组。我有一个整数,我需要针对数组中的每个值进行测试,以查看其是否满足介于数组值-15和数组值+ 15之间的条件。并进行比较,是否有更整洁,更有效的方法来做到这一点?我正在使用PHP 5.2 编辑:因此,如果我有array(10,...,2500)和$ n = 2510,我想看看$ n是否匹配介于任何数组值的15个边之间的条件。在这种情况下,条件对于最后一个值2500将为true。 我意识到500并不是一个巨大的数组:)     

解决方法

        以下代码片段将在不到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秒在整个应用程序范围内还不够好,那么请继续在用户领域编写算法。但是,如果少于0秒是可以的,那么不要试图超越PHP。     ,        仅当您通过对数组或类似数组进行排序将更多信息添加到混合中时,才可以使此方法更有效。否则,您只能比较每个值。但是500不是很多。 如果对数组进行排序,则可以通过多种方式提高性能,例如查看每个值以查看其是否在范围内,并在找到第一个不存在的值时停止(可能会有小的改进)。或者,您可以搜索范围内的第一个元素和范围外的第一个元素,然后知道有效元素的索引,就可以使用它们。 您可以使用二元搜索找到感兴趣的索引,这比查看每个值要快。 显然,这样做的好处取决于上下文,就像phant0m在注释中指出的那样,如果您要为每个比较对数组进行一次排序,那么您也可以不打扰,而只是进行比较。如果您要在同一数组中查找许多不同的比较值,那么排序可能会使您受益。如果您可以免费创建已排序的数组,那么这将是双赢的局面。 在500个元素的数组上进行二进制搜索大约需要8次搜索。如果您只需要查找其中一个值是否与您的条件匹配,则效率会高得多。如果您需要查找所有可用的值,则需要做一些修改,以找到其中的第一个值和最后一个值,但是在比较值小于25而不是250(按顺序进行排序的数组的平均比较)。但是数组越大,好处就越明显,因为计算下一个搜索点会产生一些开销等。 这是一个用PHP进行二进制搜索的示例,这只是一个google结果,未经我检查或验证,需要进行调整以适应您的范围条件。 这可能会更好,并且可能会允许您提供一个比较器,以测试所需的范围。     ,        如果您正在搜索并添加临时对象,则使用如下所示的树 将数字放在树中而不是数组中。然后使用二进制搜索来查找新项目在数组中的位置。然后检查它是否在数组中上一项和下一项的15个范围内。 现在,而不是围绕count($ thearray)操作。它的log(count($ thearray))操作。 这样更有效。 如果您有数据并且仅要进行搜索,则使用有序数组,并对该数组进行bsearch并检查上一个和下一个。     ,        使用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
)
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。