调用自定义排序函数的次数
Number of times the custom sort function is called
我有一个对象v的向量,它用自定义函数sortproc
:排序
std::sort(v.begin(), v.end(), sortproc);
在对数组进行排序之前,我想提前知道sortproc将被调用多少次。
我试过什么?我尝试克隆矢量,然后对副本进行排序,并计算调用sortproc的次数。我通过增加计数器来实现这一点。然后,在对副本进行排序后,我读取计数器的值,并再次对原始向量进行排序。这是有效的,但效率很低,因为它把整个工作做了两次。有可能以更有效的方式做到这一点吗?
几乎可以肯定不是。脑海中浮现的两个障碍是:
1) 该标准没有定义std::sort
使用什么算法,因此可移植代码除了尝试之外,无法确切知道执行了多少比较
2) 即使你知道算法,我认为对于明智的排序算法来说,计算出所需的比较次数不会比计算出反转次数更容易,反转次数本身与排序具有相同的复杂性。因此,你不会得到一个更高效的解决方案。
2的解决方法是,如果sort
算法使得比较次数不取决于数据的排序程度,而只取决于数据大小。设计具有该属性的排序算法并不太难。它可能不如"真正的"排序算法高效,但很可能比两次排序更高效。
因此,例如在合并排序中,通常当合并的一侧用尽时,您会将另一侧的剩余部分直接复制到目标中。如果在那一点上,你只为了弥补数字而进行了一堆额外的冗余比较,那么比较的数量就不会取决于输入的顺序。在最坏的情况下,毫无意义的比较数量将是总数的一半,所以它不应该比排序两次更糟糕。不过,这与std::sort
的比较并不"公平",因为合并排序无论如何都不是std::sort
的有效算法:它使用了太多额外的内存。
排序网络也使用固定数量的比较,但对std::sort
也没有好处,因为你需要知道设计网络的项目数量。。。
- C++自定义比较函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 将自定义函数传递到基抽象类中以延迟执行
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- C++ 通过函数传递自定义结构
- 将具有固定签名的自定义函数名称注入 CRTP
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 自定义排序函数中的堆溢出
- 使用 Google Test 对自定义断言函数进行单元测试
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 为 std::vector 编写自定义插入函数
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- C++ 通过自定义赋值运算符隐式转换函数参数
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 使用迭代器的自定义比较器函数
- 成员函数自定义类型在C++中返回"不命名类型"错误