在C ++中使用STL算法时,我发现很多方法,如std::merge
,std::inplace_merge
,std::set_union
,std::upper_bound
,std::lower-bound
等...只将数据排序为输入。
有意义的是,在排序数据上,这些算法会提供更快的结果,但为什么它们也不能处理未排序的数据呢?为什么大多数算法都设计有这样的数据依赖??
答案 0 :(得分:7)
有意义的是,在排序数据上,这些算法会提供更快的结果,但为什么它们也不能处理未排序的数据呢?为什么大多数算法都设计有这样的数据依赖??
对于那些"它有意义的算法"要对数据进行排序,开发人员应该知道是否会出现这种情况,并且可以根据需要轻松对输入进行排序。算法可以检查数据是否首先排序,但这会浪费时间。例如,upper_bound
可以是预先排序的输入上的O(logN),而检查排序将是O(N)。请记住,一般情况下,算法无处可存储状态"我检查了一次并且数据已经排序" (他们怎么能知道在没有理解的情况下持续多长时间存在什么线程,他们如何使用锁等),因此他们必须为数据上的每个调用执行。
此外,您提到的一些算法 - 例如std::merge
- 可以在InputIterators上使用,这意味着您可以处理只能读取一次的输入,例如来自键盘,它可以暂时可用但不会自动保存在任何地方重新访问,所以有一个额外的通行证来检查某些人的输入值是否已经排序是不切实际的。
答案 1 :(得分:0)
这些算法说:
如果您已对数据进行排序,我们会非常有效地为您执行某些操作。
就像普通的二进制搜索功能一样,您实现的是期望对数据进行排序,这些功能确实需要对数据进行排序。如果您没有对数据进行排序,请不要使用它们。
就像您不希望sort
为您插入元素一样,您不应期望这些算法为您排序项目。