TMTOWTDI。以下是按复杂程度排列的几种解决方案。
(以下是关于复杂性的简短入门):O(n)
或“大 o”表示最坏情况,其中n
表示数组中元素的数量,o(n)
或“小 o”表示最佳情况。长长的离散数学简而言之,您只需要真正担心最坏的情况,并确保它不是n ^ 2
or n!
。它更多地衡量计算时间的变化,n
而不是整体计算时间。维基百科有一篇关于计算时间复杂度的好文章。
如果经验教会了我什么,那就是花太多时间优化程序的 little-o 显然是浪费时间,最好花在做某事——任何事情——更好。
解决方案0:O(n) / o(1)
复杂性:
此解决方案具有 1 次比较的最佳情况 - 通过循环进行 1 次迭代,但仅提供匹配值位于数组的位置 0 中。最坏的情况是它不在数组中,因此必须遍历数组的每个元素。
foreach ($my_array as $sub_array) {
if (@$sub_array['id'] === 152) {
return true;
}
}
return false;
解决方案1:O(n) / o(n)
复杂性:
无论匹配值在哪里,此解决方案都必须循环遍历整个数组,因此它始终是n
遍历数组的迭代。
return 0 < count(
array_filter(
$my_array,
function ($a) {
return array_key_exists('id', $a) && $a['id'] == 152;
}
)
);
解决方案2:O(n log n) / o(n log n)
复杂性:
哈希插入是从哪里来的log n
;n
哈希插入 = n * log n
. 最后有一个哈希查找,这是另一个log n
,但它不包括在内,因为这就是离散数学的工作原理。
$existence_hash = [];
foreach ($my_array as $sub_array) {
$existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];