当前位置: 首页 > 知识库问答 >
问题:

如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C标准算法会更快吗?

水昊阳
2023-03-14

许多C标准算法,如std::排序(),假设比较器comp是一个严格的弱排序,并且不能假设comp具有任何其他(不错的)属性。但是很多时候comp确实有更多的属性,而不仅仅是一个严格的弱排序。特别是,很多时候comp是一个严格的总顺序(所以特别是,对于所有abcomp(a, b)comp(b, a)a=b总是正确的。例如,通常的运算符

通过仅假设comp是严格的弱排序,C标准库是否限制自己使用非最优算法?换言之,如果C标准算法假设比较器是严格的总排序而不是严格的弱排序,那么某些标准算法会比当前实现的算法更快吗?

更新:更确切地说,“严格的总排序”意味着什么,让我们假设STL假设<code>comp</code>(对<code>T</code>类型的对象进行操作)具有<code>运算符的所有良好的序理论性质

更一般地说,如果STL对comp做出了“更好”的假设(即假设comp不仅仅是严格的弱排序),那么任何STL算法都可以更快吗?


共有1个答案

秦珂
2023-03-14

例如,通常的运算符

所以你只是在谈论状态的相似性,而不是真正的相等性(不管在一种具有可变状态的语言中是什么)。

通过限制自己只假设comp是一个严格的弱排序,C标准库限制了自己吗

不,前提是错误的。容器和算法库(生成排序序列的算法、在排序范围上操作的算法以及有序关联容器)并没有以任何方式限制其自身:它明确表示,可以根据比较Comp来定义等价关系,据我所知,该等价关系未命名(让我们称之为Sim):

Sim (x,y)

所以你有你的严格命令,只需将Sim称为“相等”并重载运算符==以定义为Sim。

所以唯一的问题是使用二进制比较函数的愚蠢,这意味着对f.ex进行多次扫描。字符串来确定相等性,并且无法访问三元比较(如 strcmp)。如果您可以直接访问 Sim,在平等的情况下,您仍然会称 Comp 而不是 Sim,或者称 Comp 然后调用另一个 Comp。

只有当你先验地怀疑“相等”是最可能的结果时,你才会使用Sim,然后使用Comp。这是荒谬的。

三种方法比较序列更好。走三条路。

 类似资料:
  • C命名的需求比较要求比较函数遵循严格的弱排序属性。这用于许多标准库函数,例如std::sort。 许多现代CPU支持融合乘加运算,这种运算可以高效地计算< code>a b * c,并且无需对乘法结果进行舍入。这意味着有些情况下,FMA运算的结果不同于单独的乘法和加法运算。GCC的FMA代码生成由< code>-ffp-contract标志控制,默认启用。 当编译器在比较函数中生成FMA指令时,可

  • 本文向大家介绍C#排序算法的比较分析,包括了C#排序算法的比较分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#的各种排序算法。分享给大家供大家参考。具体分析如下: 首先通过图表比较不同排序算法的时间复杂度和稳定性。   排序方法 平均时间 最坏情况 最好情况 辅助空间 稳定性 直接插入排序 O(n2) O(n2) O(n) O(1) 是 冒泡排序 O(n2) O(n2) O(n)

  • 问题内容: 我一直在搜寻草率的文档,以寻找一种方法来限制我的蜘蛛可以发出的请求数量。在开发过程中,我不想坐在这里等蜘蛛完成整个爬网,即使爬网非常集中,它们仍然可能需要一段时间。 我希望能够说:“在向站点抓取了x个请求之后,我停止生成新请求。” 我想知道是否有某种设置我可能会错过,或者使用其他方法使用框架来完成,然后再尝试提出自己的解决方案。 我正在考虑实现一个下载程序中间件,该中间件将跟踪正在处理

  • 这是我面试问题的一部分。 给定一个整数序列作为一个数组,我必须确定是否可以通过从数组中移除不超过一个元素来获得一个严格递增的序列。 例如, 对于,输出应该是

  • 问题内容: 我有一个可排序的设置,以使用的自定义扩展名。但是,该表的某些行为是我所期望的,并且我希望就如何弄清楚该表提供一些建议。 我已经将JTable设置为可以使用以下命令进行排序: 这使我可以按预期通过单击列标题对表进行排序。 但是,我发现当我通过单击列标题对表进行排序时,行的格式(背景和前景色)也没有进行排序。 我已经将这些行设置为根据它们包含的值进行颜色编码。当我按列标题排序时,给定行NU

  • 排序算法有不少,当然,一般的语言中都提供某个排序函数,比如Python中,对list进行排序,可以使用sorted(或者list.sort()),关于这方面的使用,在我的github代码库algorithm中有几个举例,有兴趣的看官可以去那里看看(顺便告知,我在Github中的账号是qiwsir,欢迎follow me)。但是,在某些情况下,语言中提供的排序方法或许不适合,必须选择某种排序算法。