【问题标题】:How to check if a sequence of numbers has a increasing/decreasing trend in C++如何在 C++ 中检查数字序列是否具有增加/减少趋势
【发布时间】:2013-12-18 05:38:07
【问题描述】:

检查一个数字序列是否具有增加或减少趋势的最佳方法是什么?

我知道我可以选择序列的第一个和最后一个值,并检查它们的差异,但我想要一个更可靠的检查。这意味着我希望能够在大部分递减的序列中容忍少数递增的值,反之亦然。

更具体地说,数字存储为

vector<int> mySequence;

关于我正在处理的数字序列的更多细节:

  • 序列中的所有数字具有相同的数量级。这意味着不会出现如下序列:[45 38 320 22 12 6]。
  • 下降趋势我的意思是大部分或全部序列中的数字小于前一个。 (相反的情况适用于上升趋势)。因此,以下序列将被视为降序:[45 42 38 32 28 34 26 20 12 8 48]

【问题讨论】:

  • 您能否举一个序列的示例,其中第一个值大于最后一个值,但您会认为该序列增加 ?这对我来说真的没有意义。
  • 如果你有 200 个而不是 34 个,你的序列还会下降吗? IE。尺寸是否重要,还是您只是将所有数字的左侧数字与右侧数字进行比较?
  • 如果这是一个编程问题,你必须指定你的算法来确定序列是增加还是减少,然后尝试实现它,然后 如果您有任何问题,请提出问题。
  • 请注意,这个问题不是关于 C++,而是关于定义“趋势”。
  • @frickshit 输入值永远不会超出其他值的范围。

标签: c++ vector int trend


【解决方案1】:

我会累积增加的数量与减少的数量,这应该让您了解总体趋势是增加还是减少。

【讨论】:

  • 我在这里看到了变体。 1) 将每个数字与起始值的差值累加。 2) 累加每个连续对的差值。什么是最好的选择?
  • 这是一种快速了解整体趋势的好方法。只有 O(n),比排序和查找中位数或其他昂贵的建议要好。
  • 如果它需要更加防故障,请在从原始数据集计算的运行平均值上执行此操作。这样一来,您就可以防止像 +10 -1 -1 +8 -1 +9 -1 +12 -2 -1 这样的恶意序列在“减少”时出现,而实际上它们正在增加。
  • 第一个选项(将每个数字与起始值的差值累加。)可能很危险,因为如果第一个值是“误导”值(过高或过低),if 将失败)。
【解决方案2】:

我认为您可以简单地计算序列的中位数并检查它是否大于第一个值。
这是一种方式,而不是方式。

另一种方式,始终考虑平均介质,您可以检查序列中升序和降序值的数量。

int trend = 0;
int avg = mySequence[0]; 
int size = mySequence.size();
for (int i=0; i < size - 1; ++i) {
  if(i > 0) { 
   avg = (avg + mySequence[i]) / 2; 
  }
  (mySequence[i+1] - avg) > 0 ? ++trend; --trend;    
}

【讨论】:

    【解决方案3】:

    一种可能性是计算序列中升序和降序值的数量:

    int trend = 0;
    for (int i=0;i<mySequence.size()-1;++i)
    {
        diff = mySequence[i+1] - mySequence[i];
        if (diff > 0)
        {
           trend++;
        }
        else if (diff < 0)
        {
           trend--;
        }
    }
    

    您在示例中给出的序列将以等于 -6 的 trend 结尾

    【讨论】:

      【解决方案4】:

      您可能可以查看trend estimation 和某种类型的回归,例如linear regression

      这当然取决于你的具体应用,但总的来说这听起来像是一个合适的问题。

      【讨论】:

      • 如果序列中有一个元素很大,这将不起作用——重要的是要知道数字的大小是否对这里的趋势很重要。
      • @frickskityes,你说得对,理解特定应用很重要,即异常值是否重要。
      • 输入值不包含超大值,我目前正在检查两个链接资源以找到最佳选择。正如@Damon 所建议的那样,我实际上正在考虑对通过对原始序列进行局部平均而生成的序列进行检查。
      【解决方案5】:

      我很可能会尝试将序列拆分为多个段,正如您所说的值没有显着差异 - 请参阅 piecewise regression根据您的业务需求来解释这些细分。

      您将需要一个向量来存储段,每个段都有开始/结束索引、某种中值等 - 另请参阅 where to split a piecewise regression

      【讨论】:

        【解决方案6】:

        我建议使用应用于离散整数序列的数学分析方法(例如积分和微积分)。

        然后,一种方法是计算滚动平均值并查看这些平均值是增加还是减少。自然而简单;)

        【讨论】:

          猜你喜欢
          • 2019-09-03
          • 2020-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          • 1970-01-01
          相关资源
          最近更新 更多