调用std::nth_element后第n个元素之前的元素顺序
Order of elements before nth element after call to std::nth_element
我感兴趣的是找到向量中等于中值的第一个(最左边)元素的最有效方法。找到中位数很简单:
std::nth_element(first, middle, last);
auto median = *middle;
但是,如果输入类似于{2,2,2,2,1},那么在调用std::nth_element之后,中间元素之前将有2s。我必须搜索中间左边的所有值吗?还是可以保证2s都是相邻的?
另一种提问方式是,在如上所述调用std::nth_element之后,{2,1,2,2,2}是否可能,或者{1,2、2,2}是否有保证?在后一种情况下,我可以从中间向左搜索。在前者中,我必须从第一个搜索到中间,这效率较低。从实证检验来看,后一种情况似乎成立。想知道是否有人有一个明确的答案,或者我是否遗漏了一些角落的案例。
文档仅保证:
- 如果对[first,last)进行排序,则第n个指向的元素将更改为该位置中出现的任何元素
- 该新的第n个元素之前的所有元素都小于或等于新的第N个元素之后的元素
注意,有no保证第n个元素之前或之后的元素以任何特定的顺序出现,只要之前的元素小于或等于它(并且通过扩展,由于它是第n个元件的性质,它之后的元素大于或等于它);CCD_ 1和CCD_。
第n个元素不保证第n个之前元素的顺序。
如果不聚集等于第n个的元素,或者在小列表中进行排序,可能很难实现,所以这可能就是你所看到的。
这可能有助于理解第n个元素是如何实现的:这只是一个例子。
实现第n个元素的一种方法是做中值为5。把你的收藏品分成5块。对每个束进行排序(O(1)*O(n))。现在,在5个元素块的中值上重复,以找到其真正的中值(使用第n个元素)。
最终,你会得到一个接近中间的元素(在0.3和0.7之间),它需要线性时间。(
对序列进行分区(线性时间),现在元素在序列中的顺序(通过计数)。
如果它是第n个元素,并且你在为第k个和第k个而loking
当你用线性时间算法搜索一个指数较小的区域时,整个算法就是线性时间。
请注意,这可能会严重打乱元素的顺序;没有任何保证平等的elemenra是一个相邻的。
请参阅https://en.m.wikipedia.org/wiki/Median_of_medians了解更多详细信息。
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 序列容器 - 只能按顺序访问元素
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- stable_sort不遵守元素的顺序
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 如何在默认和二维数组中找到顺序扩大元素的位置
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 调用std::nth_element后第n个元素之前的元素顺序
- 如何从向量中删除随机元素而不重复它们并保持元素顺序?C++
- 如何在不更改元素顺序的情况下合并两个unordered_maps
- b树实现中的元素顺序错误
- 提升::p tr_向量改变元素顺序
- Equal_range c++元素顺序
- std::unordered_multimap中的元素顺序