【问题标题】:Sort function giving floating point exception for a large input of 0's排序函数为大量输入 0 提供浮点异常
【发布时间】:2015-06-15 08:25:21
【问题描述】:

我已经为这个问题写了一个代码:

给定一个非负整数列表,将它们排列成最大的数。

例如,给定 [3, 30, 34, 5, 9],最大的形成数是 9534330。

注意:结果可能会很大,所以需要返回字符串而不是整数。

基本上我想在这段代码中实现的是首先在最重要的数字上使用基数排序逻辑,然后按照降序排列它。后来我正在做第二个最重要的数字,依此类推。我通过传递对的向量来使用std::sort() 函数,其中第一个是值,第二个是索引。以下是我的代码:

bool radixOrder(pair<int,int> p1, pair<int,int> p2)
{
    int val1=p1.first;
    int e1=p1.second;
    int val2=p2.first;
    int e2=p2.second;
    if(val1==val2 && e1==e2)
    {
        return val1==val2;
    }
    else if(((val1/e1)%10) == ((val2/e2)%10))
    {
        while(val1/e1 == val2/e2)
        {
            if(e1/10!=0)
                e1=e1/10;
            if(e2/10!=0)
                e2=e2/10;
        }
        return (val1/e1)%10 > (val2/e2)%10;
    }
    else
    {
        return (val1/e1)%10 > (val2/e2)%10;
    }
}

vector<pair<int,int> > createVNew(vector<int>& v)
{
    vector<pair<int,int> > temp;
    for(int i=0; i<v.size(); i++)
    {
        cout << i << endl;
        int val=v[i], e=1;
        if(v[i]==0)
        {
            temp.push_back(make_pair(val, 1));
        }
        else
        {
            while((e/v[i])==0)
                e*=10;
            if(e!=v[i])
            {
                temp.push_back(make_pair(val,e/10));
            }
            else if(e==v[i])
            {
                temp.push_back(make_pair(val,e));
            }
        }
    }
    return temp;
}

string largestNumber(vector<int>& v)
{
    int e=1;
    vector< pair<int,int> > vnew=createVNew(v);
    sort(vnew.begin(), vnew.end(), radixOrder);
    stringstream s;
    for(int i=0; i<vnew.size(); i++)
    {
        s<<vnew[i].first;
    }
    return s.str();
}

largestNumber(..) 是我的函数,它返回所需的字符串。现在,此代码适用于我可以尝试的大多数非零输入。但是当输入是一个长的 0 向量时,类似于:

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0]

它给出了浮点异常。

我已经尝试找到解决方案,但还没有找到。我是 cpp 的初学者,任何帮助都会很棒。

【问题讨论】:

  • 您的链接必须登录才能访问。在此处发布内容。

标签: c++ sorting radix-sort floating-point-exceptions


【解决方案1】:

您的radixSort 函数违反了Compare requirements,即非自反性(即radixOrder(x, x) 必须返回false,但它返回true,因为执行会转到第一个if 分支)。

所以你在这里得到了一个未定义行为的经典例子。我相信那段代码应该以某种方式重写

if (e1==e2)
{
    return val1 > val2;
}

不过,我只需将输入数字按逆序排序为字符串即可解决问题。

【讨论】:

  • 非常感谢。我还有一个问题,为什么代码只在大输入而不是小输入时崩溃?另外,只是出于好奇,但您是如何得出比较器一定是错误的结论的呢?我试图搜索它很多,但没有靠近它。这是你的天才@Anton Savin :)
  • @user2223211 没问题。要回答为什么在这种特殊情况下它只会在大输入时崩溃,您必须调试到 sort 实现。
  • @user2223211: std::sort 通常以递归方式工作:对序列进行排序,将其分成两组并对它们进行排序,然后合并两半。现在事实证明,这对于小型集合来说效率不高。将两个元素的序列分成一个元素的两半显然效率不高。所以std::sort 通常针对小型集合进行优化,并且这种优化很可能以不同的方式调用您的谓词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多