比较非常大的值php的有效方法
Posted
技术标签:
【中文标题】比较非常大的值php的有效方法【英文标题】:Efficient way to compare VERY LARGE NUMBER OF VALUES php 【发布时间】:2011-08-01 18:20:12 【问题描述】:嗨 我要比较大量的值,我使用了数组,但是内存不足。数组中的值大约为 5000000,并且对于每个值,将再次执行 5000000 的循环。简而言之,将执行 5000000 x 5000000 个周期。
我正在做的只是运行两个循环。请让我知道一些有效的方法来执行此操作,因为该程序由于内存而停止。
for($k=0;$k<sizeof($pid);$k++) // size of $pid = 5000000
$out =0;
for ($m=0;$m<sizeof($outid);$m++) // size of $out 5000000
if ($pid[$k] == $out[$m])
$out ++;
【问题讨论】:
如果你需要执行250000亿次迭代,你不要使用php! 您到底想达到什么目的?我想如果你多解释一下这个问题,你可能会得到一些更有帮助的答案…… 或者,您可以更改算法,使其不是 O(N^2) 时间复杂度。如果您所做的只是查找每个数组中公共元素的数量,那么有些算法的运行时间为 O(N log N)。 我同意@Oli。你想达到什么目的?这可以用其他编程语言更有效地完成,因为 PHP 不是为此而设计的...... 没关系,在 32 位 PHP 安装上,它会在 $out 到达外部循环结束之前很久就溢出 int 限制。 【参考方案1】:如果您可以对两个列表进行排序,您只需查看每个列表一次,因为您可以为第一个列表创建一个索引,为第二个列表创建一个索引。如果第一个索引处的元素小于第二个索引处的元素,则增加第一个索引,否则增加第二个索引。然后,您只需在经过它们时跟踪有多少元素是相等的。
【讨论】:
这没那么简单,pids 是唯一的但 outids 是重复的,并且甲酸盐也很复杂,就像 01.2.14.1234 只要只有一个列表有重复项,如果您确保在两个列表中的值相等时始终增加具有重复项的列表的索引,这不是问题。只要两个列表的排序方式相同,格式的复杂性并不重要。【参考方案2】:对于大多数 VB 和 PHP 程序员来说,算法复杂性可能是一个复杂的主题 - 这不是小事。
方法 1
假设您找到了一种使用 O(n^2)
方法的方法,假设您的计算机可以在 1 秒内执行 1000000 次比较,并且您现在开始循环 2:04:45 pm EEST | Wednesday, June 23, 2010
,然后循环将以 6:58:05 am EET | Monday, January 23, 2012
结束。
我不是 PHP 方面的专家,但我确信该页面有一个必须提供的时间限制,否则会抛出页面超时异常。该限制可以是 30 秒、90 秒或任何您定义的时间,但您为此循环所需的时间限制是愚蠢的。
方法2
您决定对数组进行排序,此操作对两个数组使用O(n log n)
,并使用O(n log n)
进行比较。这将使总时间在3 * O(n log n)
左右,也就是100.5 seconds
。或者33.49 seconds
,如果数组是预排序的。
如果我是你,我会选择方法 2。
如果您不确定如何对数组进行排序,请提出一个新问题并描述您的数据。简而言之,您需要为您的数据实例定制一个比较器。要在O(n log n)
中进行比较,您不能使用线性比较,但需要一个高效的深度比较功能,通常内置在语言默认库中。如果找不到或不知道如何使用,请再问一个问题。
【讨论】:
我真的不明白“算法复杂性对于大多数 VB 和 PHP 程序员来说可能是一个复杂的主题”这样的一般性陈述的意义。尤其是当没有人提到 VB 时;好像有点无理取闹。【参考方案3】:你可以试试 array-intersect 函数http://ua.php.net/manual/en/function.array-intersect.php,它是基于 C 的,应该会更优化
【讨论】:
以上是关于比较非常大的值php的有效方法的主要内容,如果未能解决你的问题,请参考以下文章