【问题标题】:computing max of modes计算模式的最大值
【发布时间】:2012-01-17 04:02:23
【问题描述】:

我正在使用以下代码来计算模式

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};

int main()
{
  double currval=prices[0];
  int ctr=1;
  int maxctr=1;
  double modval=prices[0];
  for (int i=1;i<8;i++) {
    if(prices[i]==currval) {
      ++ctr;
    }else {
      if(ctr>maxctr) {
    maxctr=ctr;
    modval=currval;
      }
      currval=prices[i];
      ctr=1;
    }
  }
 std::cout<<"mode is: "<<modval<<std::endl;
  return 0;
}

但不幸的是,这会返回第一种模式。

mode is: 2

我想继续传递数组并捕获另一个数组中的所有模式,因此我可以选择模式数组的最大值或最小值或平均值。因此,在我的示例中,我将有一个内容为 {2,3} 的数组。 关于我如何做到这一点的任何建议。 谢谢! 编辑:

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};
std::vector<int> result;

int main()
{
  double currval=prices[0];
  int ctr=1;
  int maxctr=1;
  double modval=prices[0];
  for (int i=1;i<8;i++) {
    if(prices[i]==currval) {
      ++ctr;
    }else {
      if(ctr>maxctr) {
    maxctr=ctr;
    result.clear();
    result.push_back(currval);
      } else {
    if (ctr==maxctr) {
      result.push_back(currval);
    }
      }
      currval=prices[i];
      ctr=1;
    }
  }
 if(ctr>maxctr) {
    maxctr=ctr;
    result.clear();
    result.push_back(currval);
      } else {
    if (ctr==maxctr) {
      result.push_back(currval);
    }
      }

  return 0;
}

【问题讨论】:

  • 在你的 for 循环中,你需要 i
  • 您还需要从索引 0,for (int i = 0; ... 开始,因为您当前缺少第一个元素。忘记那个......错过了你已经存储了这个。
  • 我以为他是故意从 1 开始的(元素 0 在 for 循环之前读取),但我不知道代码的用途,所以你可能是对的。
  • 标题说你想要最大模式,但你的文本说你想要一个所有模式的列表。解决问题的第一步是准确地陈述它。请编辑您的问题以准确说明您真正想做的事情。
  • 感谢您的回复并指出对 i{2,3},然后我可以轻松地选择该数组的最小值或最大值,因此在我的示例中分别为 2 或 3。希望能澄清我打算做什么。理想情况下,我会有一个模板模式功能

标签: c++ arrays mode


【解决方案1】:

您的代码在 else 之后的部分是错误的,因为它将在 ifelse 之后执行,这不是我们想要的。

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};

using namespace std;

int main()
{
    int ctr=1;
    int maxctr=1;
    vector<int> allModes;
    int max, min;

    for (int i=0; i<8; i++) {

        if(prices[i+1]==prices[i]) {
            ++ctr;
        }
        else {
            if(ctr == maxctr) {
                allModes.push_back(prices[i]);  //if it is same as previous mode add it to vector
                //max = prices[i];
            }
            if(ctr > maxctr) {
                allModes.clear();           //if it is greater than previous mode then previous number is not a mode now
                                            //so clear old vector
                allModes.push_back(prices[i]);  
                maxctr = ctr;
                //max = prices[i];
                //min = prices[i];
            }
            ctr=1;
        }
    }


    std::cout<<"Mode: ";
    for (  vector<int>::iterator it=allModes.begin() ; it < allModes.end(); ++it ) {
        std::cout<< " " << *it;
    }
    return 0;
}

假设数组是升序的。

但如果你想存储 min 或 max 或 avg,你可以不使用向量来做到这一点。

  1. 如果与旧的计数相同,则对于 min 而横向不要更改模式

  2. 对于最大值,您将为相同的计数分配新值

  3. 对于平均,只需添加所有数字,但要跟踪添加了多少数字。然后在循环结束时只需 avg = sum / no. of element

因此,在所有三种情况下,都不需要矢量。

【讨论】:

  • 我只寻找模式的最小值或最大值,而不是整个数组
  • @itcplpl 这就是我所说的,在您将模式添加到列表的位置也设置新的最大值或新的最小值(如果计数更大)。因此,在循环结束时,您将获得最小或最大模式
  • 这是你的代码的结果,假设 myvector 是 allModes...输出是:&lt;Mode: 13853996
  • @itcplpl 抱歉忘记将索引更改为 0。现在它在您的测试用例中正常工作。还在评论中添加了最小值和最大值的代码。平均稍加修改也可以计算出来。
【解决方案2】:

你需要一个像这样的向量: vector&lt;int&gt;result

如果你发现一个大于 maxctr 的计数器:

if (ctr > maxctr) {
    maxctr = ctr;
    result.clear();
    result.push_back(currval);
}

如果相等:

if (ctr == maxctr) {
    result.push_back(currval);
}

请注意,您必须在计算每个数字后运行此部分:

if (price[i] != currval) {
  if (ctr > maxctr) ...
  currval = price[i];
  ctr = 1;

}

在for循环之后

for (i = 1; ...) { ...}
if (ctr > maxctr) ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多