【问题标题】:PHP custom function code optimizationPHP自定义函数代码优化
【发布时间】:2010-05-04 10:59:44
【问题描述】:

现在是困难的部分。你如何优化这个功能:

function coin_matrix($test, $revs) {
    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if ($j != $k && 
                $test[$i][$j] != null && 
                $test[$i][$k] != null) {
                    if(!isset($coin[$test[$i][$j]])) {
                        $coin[$test[$i][$j]] = array(); 
                    }
                    if(!isset($coin[$test[$i][$j]][$test[$i][$k]])) {
                        $coin[$test[$i][$j]][$test[$i][$k]] = 0; 
                    }

                    $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}

我不太擅长这个,如果数组很大,它会永远运行。

该函数应该从一个二维数组中找到所有成对的值并将它们相加,如下所示:$coin[$i][$j] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]

非常感谢!

【问题讨论】:

  • 我只是想学习,但还是感谢您的反对。
  • 这个函数应该做什么?有时一个代码示例会走很长一段路,但有时一个清晰的英文描述会走得更远。
  • 这么多美元,看着我想我已经中了大奖...... chaching
  • 它为 Krippendorff 的 Alpha 计算重合矩阵。函数应该返回的数组的每个元素的确切公式在这里:en.wikipedia.org/wiki/… 返回的矩阵(数组)的每个元素都是 Ock 并且根据上面链接中的公式计算。
  • 这里是完整的链接:bit.ly/bS9a92

标签: php arrays optimization


【解决方案1】:

如果您确实需要运行数组中 3 个项目的所有组合,那么在处理大型数组时,您通常会遇到困难。主要因素将是您的函数是立方的这一事实 - 随着输入的增加,输出时间将呈天文数字增加这一事实,您无能为力。您也许可以将时间减少到现在的 30%,但如果时间已经是 3 周,那么 1 周的运行时间对您来说没什么用。

话虽如此,您仍然可以在最里面的循环中节省一些精力。如果我正确解释了您的代码,您可以为每个 i-j 组合设置一次 $coin[$i][$j] = array(),而不是检查尚未设置的每个 k 项。

话虽如此,仍然不完全清楚该函数应该做什么,所以除了使用 $coin 而不是 coin 来保存 PHP 之外,我不能完全放心地提供其他编辑解析器有点费劲。

【讨论】:

  • if 语句中还有两个。
  • 好的,谢谢!也更正了。函数后面公式的描述见上面的cmets
【解决方案2】:

我不知道为什么之前没有指出这一点: 变化:

for ($i = 0; $i < count($test); $i++) {

收件人:

$count = count($test);
for ($i = 0; $i < $count; $i++) {

将为您节省不少时间。 (如果 $test 更大,则更多)

我不确定这是否正确,但由于 $some_var 不存在,它会导致相当慢的速度:

$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

最后,我仍然不确定这应该做什么。也许你可以提供一些好的输入和输出值。正如你所说的目的仍然没有意义。 $revs 是什么,为什么会这样:

$coin[$i][$j] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]

而不是:

$coin[$row] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]

【讨论】:

  • 它计算 Krippendorff 的 Alpha 的重合矩阵。该函数应该返回的矩阵的每个元素的确切公式在这里:bit.ly/bS9a92(维基百科链接)。 $test 是一个二维矩阵,$revs 是一个向量,$revs 中的键与 $test 的行号一致
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多