2

鉴于我有一个数组,说:

$myArray=['12','AB','3C']

我想返回值 2(这是每个数组元素的长度。)

但如果我有类似的东西

$myArray=['12','AB2','3C']

我想在数组的第二个元素之后立即停止计算/循环'AB2',让我的函数返回 null。

就性能和速度而言,实现这一目标的最有效方法是什么?由于这样的数组可能会变长。

4

3 回答 3

5

休闲方式

我认为您正在尝试在元素中获得两个不同长度的那一刻停止数组循环?

在这种情况下,在最坏的情况下,您需要一个O(n)运行时(因为您需要验证每个元素,除非您有一个抽象数据类型,在这种情况下它可能是O(1),如果它存储在对象属性中或者您计算将项目推入数组时动态检测到的差异)

由于我们发现一个元素的长度不同的那一刻,我们可以简单地快速存储数组中第一个元素的长度,因为我们知道如果我们检测到除了我们存储的长度之外的任何其他长度,我们可以立即返回null

function linear_loop($array) {
    $len_of_first = strlen($array[0]);
    foreach ($array as $val) {
        if (strlen($val) != $len_of_first) {
            return null;
        }
    }
    //Function still running, entire array was same, return the length of first element
    return $len_of_first;
}

这个函数是O(n)随着每次操作都是不变的。strlenO(1)

PHP函数strlen()的算法复杂度

最“性能最快”

既然您说数组可能会变得很长,如果您不是立即生成数组,而是需要将项目推送到其中,那么在您的推送操作中,您可以在推送之前检查它item_to_be_pushed是否相同strlen或您的任何属性正在尝试与您存储的进行比较(可以任意选择,因为数组必须是统一的 some property

在这种情况下,您可以object使用property:uniform_length并存储它。然后,每当您push进入阵列时,您都可以使用uniform_length. 如果长度不同,则可以存储在对象属性中,称为uniformfalse。(默认情况下uniform是 true,因为如果数组中只有一个元素,它必须是统一的)。

这将是一个O(1)计算,因为它被存储为一个属性。但是您可能不需要像这样简单的对象,您可以将其存储为一些变量。

O(1) vs O(n) 运行时以及为什么它更高效

由于不是每个人都知道 Big O,所以对我所说的内容进行快速解释。O(1)运行时比运行时“无限”好,O(n)因为函数的运行时不会随着输入而增长(因为处理 100 万个项目需要与处理 1 个项目相同数量的步骤)

于 2015-09-07T04:30:40.813 回答
2

当您发现不正确的内容时,只需循环并尽早返回。在您分析并发现此功能确实是您的瓶颈之前,请不要担心微优化

前任。

function isCorrect($arr) {
   $len = strlen($arr[0]);
   for($arr as $val) {
      if(strlen($val) != $len) {
          return false;
      }
   }
   return true;
}
于 2015-09-07T04:17:06.167 回答
1

只是我的两分钱。您也可以array_map为此使用:

$myArray = ['12','AB','3CC'];
$lengths = array_map('strlen', $myArray);
// output
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)

你可以只写一个if语句并检查max($lengths)并返回true or false

-干杯

于 2015-09-07T05:09:53.813 回答