当前位置: 首页 > 知识库问答 >
问题:

用参考值计算中间值

寇和璧
2023-03-14

我尝试计算一个名为< code>median的向量的中值:

std::nth_element(median.begin(), median.begin() + median.size() / 2, median.end());     
medianVal = median[median.size() / 2];  
cout << "The median is " << medianVal << endl;

这很好。但是我需要得到中间值在原始向量中的位置。我怎样才能做得很快?

共有3个答案

夹谷苗宣
2023-03-14

在不知道问题的确切性质或所涉及的数据序列中的元素数量的情况下,很难知道“非常快地执行此操作”是什么意思,但是您可能想看看SO站点中描述的“堆中位数”(即“滚动中位数”,即“流式中位数”算法)。

使用这种方法,您可以存储当前候选中值的索引,而无需再次迭代原始数据数组来查找中值的索引。您也不需要修改原始容器的顺序。

王弘和
2023-03-14

根据文档(http://en.cppreference.com/w/cpp/algorithm/nth_element),您使用的函数实际上会部分地重新排序数组。

您需要保留一份原始文件的副本,并遍历它以找到与中间值匹配的元素。

完成它的另一种方法是使用元组向量,其中索引仅存储为元组的第二个成员。当然,你仍然会在某个时候穿过矢量。

阮选
2023-03-14

我假设您不想重新订购原始容器。如果错了,有更简单的方法。

nth_element需要一个比较器。

因此,首先在原始容器中创建一个迭代器向量,然后编写一个比较器,接受2个迭代器,推导它们,amd比较结果。

template<class C>
auto median(C const& c){
  using std::begin; using std::end;
  auto start = begin(c);
  auto finish = end(c);
  using iterator = decltype(start);
  std::vector<iterator> working;
  for(auto it = start; it != finish; ++it)
    working.push_back(it);
  if (working.empty())
      return start;
  std::nth_element(
      begin(working), begin(working) + working.size() / 2, end(working),
      [](iterator lhs, iterator rhs){
          return *lhs < *rhs;
      }
  );
  return *(begin(working) + working.size() / 2);
}

这确实依赖于一些C 14(自动返回类型演绎),但每个主要的编译器(可能除了icc?)现在已经支持了。

它足够灵活,甚至可以在C风格的数组上工作,我认为它甚至可以在sentinels上工作。

演示

 类似资料:
  • Reference values是Clojure可以使用变量变量的另一种方式。 Clojure提供可变数据类型,例如原子,代理和引用类型。 以下是可用于参考值的操作。 Sr.No. 操作和描述 1 ref 这用于创建参考值。 创建参考值时,可以选择提供验证器功能,该功能将验证创建的值。 2 ref-set 此函数用于设置对新值的引用值,而不管旧值是什么。 3 alter 此函数用于以安全的方式更改

  • 问题内容: 我读了一本书,叫做《面向Web开发人员的专业Javascript》,它说:“变量是由参考值或原始值分配的。参考值是存储在内存中的对象”。然后,它没有说明原始值的存储方式。因此,我猜它没有存储在内存中。基于此,当我有一个这样的脚本时: Javascript如何记住该变量供以后使用? 问题答案: A 可以包含两种值类型之一:或。 是存储在 堆栈 中的数据。 直接存储在变量访问的位置。 是存

  • 我有这张桌子, 我想要表中的uid计数和订单价格中的uid计数 我这样做: 但我得到的结果是: 有什么问题?

  • 1.日期时间的转换及赋值 1.1.date类型转换为字符串 justep.Date.toString(new Date(), justep.Date.STANDART_FORMAT_SHOT) 4种时间格式常量: justep.Date.DEFAULT_FORMAT 时间格式常量 = “yyyy/MM/dd hh:mm:ss” justep.Date.DEFAULT_FORMAT_SHOT 时

  • 我目前正在编码一个colorpicker并尝试创建一个函数,它需要3个介于0和255(RGB)之间的整数。 如果你看上面链接的图像,你可以看到在中心有一个彩虹-渐变。上面的所有RGB值至少包含一个0和一个255的整数。另一个可以是0到255之间的任何值。然后在图像的左边有一个正方形,它包含这个“彩虹颜色”的所有“子颜色”的渐变。 函数应该取这个子颜色的RGB值(例如,R=112,G=158,B=7

  • 机器学习通常需要大量的数值计算。通过迭代更新估计的过程来解决数学问题,而不去求得一个公式化的结果。通常的操作包括优化和求解线性方程系统。对于采用有限的记忆储存的不能精确表述的问题,即使是估计在数值计算机上估计一个函数方程的2解都是很困难的。(注,MNIST,Mixed National Institute of Standards and Technology database,国家标准与技术研究