C++ STL nth_element原理与应用
2017-07-09 08:57
288 查看
LZ最近的考试中,某题可以通过调用nth_element()来水过70%的数据
但是LZ并不会啊(历史总是惊人的相似)
于是就有了这篇blog
在编写代码时,有时会有“在一个无序表中快速得到第K小的元素”的需求
而直接排序 不能水过一些测试点 时间不能承受
于是STL的algorithm头文件就给我们提供了nth_element()这样的部分排序函数
调用的正确姿势是这样的:nth_element(first,kth,last)
first和last表示部分排序的区间为[first,last)
指针kth表示完成后,这个位置的元素是第(kth-first+1)小的
(注意first是第1小的)
这个函数的期望复杂度是O(n)的
原理如下:
在当前区间[L,R]上,找一个基准位置mid
通过线性的扫描交换,
使得[L,mid)的元素都比mid小,(mid,R]的元素都比mid大
此时mid上的元素就是第mid小的
然后判断k在哪半边,继续递归处理
所以这样就达到了期望的O(N)复杂度
欢迎补充~~
但是LZ并不会啊(历史总是惊人的相似)
于是就有了这篇blog
在编写代码时,有时会有“在一个无序表中快速得到第K小的元素”的需求
而直接排序 不能水过一些测试点 时间不能承受
于是STL的algorithm头文件就给我们提供了nth_element()这样的部分排序函数
调用的正确姿势是这样的:nth_element(first,kth,last)
first和last表示部分排序的区间为[first,last)
指针kth表示完成后,这个位置的元素是第(kth-first+1)小的
(注意first是第1小的)
这个函数的期望复杂度是O(n)的
原理如下:
在当前区间[L,R]上,找一个基准位置mid
通过线性的扫描交换,
使得[L,mid)的元素都比mid小,(mid,R]的元素都比mid大
此时mid上的元素就是第mid小的
然后判断k在哪半边,继续递归处理
所以这样就达到了期望的O(N)复杂度
欢迎补充~~
相关文章推荐
- C++STL技术原理浅析与应用基础之vector
- C++ 之 高效使用STL(泛型算法设计原理解析)
- C++模板的原理与应用
- C++ 标准模板库STL multimap 使用方法与应用介绍(一)
- C++ STL 容器 deque 内部实现原理
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- STL 在 C++ 中的应用
- [C++] STL容器设计原理
- [C++] STL容器设计原理
- C++ 标准模板库STL set 使用方法与应用介绍(一)
- stl nth_element使用...
- C++ STL 容器 的 基本特性 和 原理
- STL中的nth_element()方法的使用
- C++ STL next_permutation的实现原理
- STL——nth_element的作用和用法
- C++ STL 遍历 map 的时候如何删除其中的 element
- C/C++ 可变参数函数的原理和应用
- C++ STL容器deque内部实现原理
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- STL中的nth_element()方法的使用