1

嗨,我要比较大量的值,我使用了数组,但内存不足。数组中的值大约为 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 ++;
                    }

        }
}
4

3 回答 3

3

如果您可以对两个列表进行排序,则只需查看每个列表一次,因为您可以为第一个列表创建一个索引,为第二个列表创建一个索引。如果第一个索引处的元素小于第二个索引处的元素,则增加第一个索引,否则增加第二个索引。然后,您只需跟踪通过它们时有多少元素是相等的。

于 2011-04-08T19:13:14.680 回答
1

对于大多数 VB 和 PHP 程序员来说,算法复杂性可能是一个复杂的主题——它并非微不足道。

方法一

假设您找到了一种方法来使用您的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 秒或您定义的任何时间,但您对这个循环所需的时间限制是愚蠢的。

方法二

您决定对数组进行排序,此操作O(n log n)对两个数组进行,并O(n log n)进行比较。这将使总时间在附近3 * O(n log n),这只是100.5 seconds。或者33.49 seconds,如果数组是预先排序的。

如果我是你,我会选择方法 2 。

如果您不确定如何对数组进行排序,请提出一个新问题并描述您的数据。简而言之,您需要为您的数据实例定制一个比较器。要进行比较,O(n log n)您不能使用线性比较,但需要一个高效的深度比较功能,通常内置在语言默认库中。如果找不到或不知道如何使用它,请再问一个问题。

于 2011-04-08T19:54:09.050 回答
0

您可以尝试 array-intersect 函数http://ua.php.net/manual/en/function.array-intersect.php,它是基于 C 的,应该更优化

于 2011-04-08T19:27:02.530 回答