【问题标题】:Is find_if on a set linear?find_if 在集合上是线性的吗?
【发布时间】:2017-03-27 10:20:10
【问题描述】:

我遇到过 set::find 不是查找对象的正确方法的情况,因为我以不同于集合中排序的方式(通过 std::find_if)查找对象。我没有找到任何以这种方式查找元素的复杂性信息。我认为它是线性的,因为遍历“无序”容器以查找匹配项是线性的。

【问题讨论】:

    标签: c++ algorithm search set time-complexity


    【解决方案1】:

    你可以看看here,发现find_if的复杂度是线性的。

    这是因为 find_if 是一种通用算法,它不知道它使用的特定类型的容器。因此它不能使用不同容器的特性来加速搜索过程,而只是检查所有元素以找到合适的元素。

    【讨论】:

      【解决方案2】:

      是的,它是线性的。

      来自ref

      复杂性

      第一个和最后一个之间的距离线性:为每个元素调用 pred,直到找到匹配项。

      原型在哪里:

      template<class InputIterator, class UnaryPredicate>
         InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
      

      来自另一个ref

      复杂性

      至多最后 - 谓词的第一次应用

      【讨论】:

        【解决方案3】:

        是的,它的复杂性是线性的。

        迭代器参数是一个单向的 InputIterator。唯一可以想到的实现是向前迭代每个元素并检查谓词。由于谓词是任意的,因此不可能针对不同的容器类型专门化算法以提高算法复杂度。

        【讨论】:

          猜你喜欢
          • 2012-04-14
          • 2019-01-26
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 2019-05-09
          • 2010-09-06
          • 1970-01-01
          相关资源
          最近更新 更多