搜索一千个未知对象的数组的最快方法是什么

时间:2017-04-19 17:15:13

标签: php arrays dataset

我正在开发一个电子商务应用的产品搜索系统,在这里我将我的产品对象存储在一个数组中。现在,我希望能够搜索这些产品并找到属于某个类别的所有产品。 我尝试过使用foreach循环,但考虑到执行时间和必须循环的产品数量,这似乎并不够高效。这是最好的方法吗? 这就是我所做的:

public function sortByCategory( $category )
{
    foreach ( $this->products as $product ) {
        if ( $category == $product->getCategory() ) {
            $this->result[] = $product;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

搜索非结构化/无序集合始终至少为O(n),因为每个元素都需要访问。如果它已经以某种方式排序了你可能能够找出更优化的算法,但是首先尝试手动排序代码,你甚至已经在O(n log n)时间进行搜索!

但是,您可以采取任何措施来降低后续搜索/访问的开销。

学习,爱和利用哈希表的魔力(在php中这是关联数组' s)!他们会帮助您解决编码生涯中的许多问题!

只需对产品进行迭代,然后按类别名称将它们存储在数组的关联数组中:

  $grouped = [];

   foreach ( $products as $product ) {
        $cat = $product->getCategory();
        !empty($grouped[$cat])?:$grouped[$cat] = []; 
        $grouped[$cat][] = $product;
   }

然后按名称获取特定类别:

  $result = $grouped['SomeCategoryName'];

由于产品是对象,$grouped关联数组中的子数组只是引用的数组 - 不是重复数据 - 因此很可能不会产生重大空间命中。

最后,只有O(n)进行此分组,您只执行一次,从那时起检索O(1)