учитывая, что у меня есть массив, скажем:
$myArray=['12','AB','3C']
Я хочу вернуть значение 2 (которое является длиной каждого элемента массива по отдельности.)
Но в случае, если у меня есть что-то вроде
$myArray=['12','AB2','3C']
я бы хотел остановить расчет / цикл сразу после второго элемента из массива 'AB2'
и пусть моя функция возвращает ноль.
Каков наиболее эффективный способ достичь этого в плане эффективности и скорости? Так как такой массив может стать длинным.
Я думаю, что вы пытаетесь остановить цикл массива в тот момент, когда вы получаете две разные длины в элементе?
В этом случае, в худшем случае, вам понадобится 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)
с каждой операцией постоянно. strlen
является O(1)
Алгоритмическая сложность PHP-функции strlen ()
Так как вы сказали, что массив может быть довольно длинным, если вы не сразу генерируете массив, а скорее вам нужно помещать в него элементы, то при выполнении операции push вы можете проверить перед тем, как нажать на нее. item_to_be_pushed
та же strlen
или какое-либо свойство, которое вы пытаетесь сравнить с тем, которое вы сохранили (которое может быть выбрано произвольно, так как массив должен быть property
)
В этом случае вы могли бы иметь некоторые object
с property
: uniform_length
и сохранить это. Тогда всякий раз, когда вы push
в ваш массив, вы можете проверить это с помощью uniform_length
, Если длина не совпадает, вы можете сохранить в свойстве объекта uniform
как ложь (По умолчанию uniform
верно, так как если в массиве только один элемент, он должен быть равномерным).
Это было бы O(1)
расчет, так как он хранится как атрибут. Но вам, вероятно, не нужен объект для чего-то столь же простого, как этот, и вы можете просто сохранить его как некоторую переменную.
Поскольку не все знают Big O, быстрое объяснение того, что я сказал. O(1)
время выполнения «бесконечно» лучше, чем O(n)
время выполнения, так как время выполнения функции не будет расти вместе с вводом (поскольку при обработке 1 миллиона элементов требуется столько же шагов, сколько при обработке 1 элемента)
Просто вернитесь назад и вернитесь рано, когда найдете что-то неправильное. Не беспокойтесь о микрооптимизациях, пока вы не профилируете и не обнаружите, что эта функция действительно является вашим узким местом
ех.
function isCorrect($arr) {
$len = strlen($arr[0]);
for($arr as $val) {
if(strlen($val) != $len) {
return false;
}
}
return true;
}
Просто мои два цента. Вы также можете использовать 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
-ура