【问题标题】:Will std::sort always compare equal values?std::sort 总是比较相等的值吗?
【发布时间】:2022-01-05 05:36:36
【问题描述】:

我在 leetcode 上做如下问题:https://leetcode.com/problems/contains-duplicate/

给定一个整数数组 nums,如果至少出现任何值,则返回 true 数组中的两次,如果每个元素都是不同的,则返回 false。

我提出的问题的解决方案如下:

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        try {
            std::sort(nums.begin(), nums.end(), [](int a, int b) {
                if (a == b) {
                    throw std::runtime_error("found duplicate");
                }
                return a < b;
            });
        } catch (const std::runtime_error& e) {
            return true;
        }
        
        return false;
    }
};

它在 leetcode 上被接受,但我仍然不确定它是否会一直有效。这个想法是开始对nums 数组进行排序,并在比较器内发现重复值时立即中断。排序算法可以通过多种方式比较元素。我希望总是比较相等的元素,但我不确定这一点。 std::sort 是否总是比较相等的值,或者有时它可以跳过比较它们,因此不会找到重复的值?

【问题讨论】:

  • 你怎么想的,std::sort 知道值相等而不比较它们?
  • 排序如何在不比较它们的情况下判断这些数字的排列顺序?一般来说,每两个连续的数字至少会比较一次。
  • False positives 也可以。
  • 这是一个完美的例子,说明为什么像 leetcode 这样的编码拼图网站会适得其反。从std::sort 比较器中抛出异常?这样的事情不会在任何工作面试中留下好印象。
  • 从比较函数中抛出异常是一种肮脏的技巧,但我实际上很喜欢这种跳出框框的思维方式!竖起大拇指!

标签: c++ algorithm


【解决方案1】:

std::sort 是否总是比较相等的值,或者有时它可以跳过比较它们,因此不会找到重复的值?

是的,如果确实存在重复,则始终会比较一些相等值的元素。

让我们假设相反:用于排序的初始元素数组 {e} 包含具有相同值的元素子集,并且有效的排序算法不会调用比较 operator &lt; 对于任何一对子集中的元素。

然后我们用初始数组中的第一个元组值和任意选择的第二个元组值k构造相同大小的元组数组{e,k},然后应用对元组使用字典比较运算符的相同排序算法。排序后的元组顺序可以偏离排序元素的顺序 {e} 仅对于相同的值元素,在元组数组的情况下,它将取决于第二个元组值 k。

由于我们假设排序算法不比较任何一对相同值的元素,那么它不会比较具有相同第一个元组值的元组,因此算法将无法正确排序。这与我们的假设相矛盾,证明了一些相等值的元素(如果它们存在于数组中)在排序过程中总是会被比较。

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2016-10-20
    • 2013-08-16
    相关资源
    最近更新 更多