加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么大多数STL算法需要将数据排序为输入?

发布时间:2020-12-16 10:03:12 所属栏目:百科 来源:网络整理
导读:在C中使用STL算法时,我发现很多方法,如std :: merge,std :: inplace_merge,std :: set_union,std :: upper_bound,std :: lower-bound等…只将排序数据作为输入. 有意义的是,在排序数据上,这些算法会提供更快的结果,但为什么它们也不能处理未排序的数据呢?为
在C中使用STL算法时,我发现很多方法,如std :: merge,std :: inplace_merge,std :: set_union,std :: upper_bound,std :: lower-bound等…只将排序数据作为输入.

有意义的是,在排序数据上,这些算法会提供更快的结果,但为什么它们也不能处理未排序的数据呢?为什么大多数算法都设计有这样的数据依赖?

解决方法

It makes sense that,on sorted data these algorithms will give faster results,but why can’t they handle unsorted data too ? Why most of the algorithms are designed with data dependencies like these ?.

对于排序数据的“有意义”的算法,开发人员应该知道是否是这种情况,并且可以根据需要轻松地对输入进行排序.算法可以检查数据是否先排序,但这会浪费时间.例如,upper_bound在预先排序的输入上可以是O(logN),而检查排序则是O(N).还要记住,一般情况下,算法无处可存储状态,说“我检查了一次并且数据已经排序”(他们怎么能知道在不了解线程存在的情况下会持续多长时间,如何使用锁等),所以他们必须为每次调用数据做这件事.

此外,您提到的一些算法 – 例如std::merge – 可以在InputIterators上使用,这意味着您可以处理只能读取一次的输入,例如从键盘中暂时可用但不会自动保留在任何地方以供您重新访问,因此需要额外的通行证来检查是否某人打字已经排序的值是不切实际的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读