簡體   English   中英

PHP 中的排列和大 arrays - 性能問題

[英]Permutations and big arrays in PHP - performance issues

我有一個數字數組(int 或 float),我需要通過組合數組值來找到一個值。 一旦找到最小的可能組合,function 就會返回數組值。 因此,我從 sample-size=1 開始並不斷增加它。

這是給定數據的簡化示例:

$values = [10, 20, 30, 40, 50];
$lookingFor = 80;

有效結果:

[30, 50] // return this
[10, 20, 50], [10, 30, 40] // just to demonstrate the possible combinations

排列解決了這個問題,我嘗試了許多不同的實現(例如: 排列 - 所有可能的數字集獲取 PHP 數組的所有排列?https://github.com/drupol/phpermutations )。 我最喜歡的是這個帶有使用生成器模式的排列大小參數的: https://stackoverflow.com/a/43307800

我的問題是什么? 表現! 我的 arrays 有 5 - 150 個數字,有時需要 30 個數組數字的總和才能找到搜索值。 有時找不到值,這意味着我需要嘗試所有可能的組合。 基本上當 permutation-size > 5 時,任務變得太耗時了。

另一種但不精確的方法是對數組進行排序,取前 X 和后 X 數字並與搜索值進行比較。 像這樣:

sort($values, SORT_NUMERIC);
$countValues = count($values);

if ($sampleSize > $countValues)
{
    $sampleSize = $countValues;
}

$minValues = array_slice($values, 0, $sampleSize);
$maxValues = array_slice($values, $countValues - $sampleSize, $sampleSize);

$possibleMin = array_sum($minValues);
$possibleMax = array_sum($maxValues);

if ($possibleMin === $lookingFor)
{
    return $minValues;
}

if ($possibleMax === $lookingFor)
{
    return $maxValues;
}

return [];

希望有人處理過類似的問題,可以指導我朝着正確的方向前進。 謝謝!

  • 您必須使用組合而不是排列 {例如:P(15) = 130767436800 vs C(15) = 32768}

  • 如果 array_sum < target_number 則不存在解決方案

  • 如果找到包含 1 個元素的 in_array(target_number, numbers) 解決方案

  • 從低到高排序

  • 從 C(n,2) 開始,其中 2 代表 1st 2nd 然后 1st 3rd 等等(靜態的是第一個元素)

  • 如果上面的循環沒有找到解決方案,請繼續第 2、第 3、第 2、第 4 等)

  • 如果 C(n,2) 沒有解決方案則跳轉到 C(n,3)s 但這次是 2 個 static 數字和 1 個動態數字

  • 如果循環以無解結束則不存在解

最后,我會調整這個問題並在堆棧交換(交叉驗證)的統計分支中詢問,因為數字總和的均值、中值和累積分布可能暗示會顯着減少迭代次數,這是他們的職業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM