Top_K问题,堆排序
2018-03-16 16:12
288 查看
Top_K问题
简述:在大量数据中选出K个最大的或最小的。
以取K个最大数为例:
具体思路:
1. 将给定的数据的前K个元素压入到vector空间,对这K个数进行向下调整建小堆;
2. 再将堆顶元素和数组的其他元素进行比较,当堆顶元素小于数组中所取元素时,将所取数组元素入堆;
3. 再进行调整,直到数组所有元素都依次进行比较。
堆排序:
具体思路:
1. 将给定的数组压入vector中,对其进行向下调整调节为大堆或者小堆;
2.取出最小的数和最大数进行交换;
3.再次进行调整的时候元素的个数应该减一,不用算最后一个元素(因为最后一个不是最大的数就是最小的数);
4.直到所有的数都依次进行了比较。
简述:在大量数据中选出K个最大的或最小的。
以取K个最大数为例:
具体思路:
1. 将给定的数据的前K个元素压入到vector空间,对这K个数进行向下调整建小堆;
2. 再将堆顶元素和数组的其他元素进行比较,当堆顶元素小于数组中所取元素时,将所取数组元素入堆;
3. 再进行调整,直到数组所有元素都依次进行比较。
//仿函数比较 template<class T> struct Less { bool operator()(const T& l, const T& r) { return l < r; } }; template<class T> struct Greator { bool operator()(const T& l, const T& r) { return l > r; } }; template<class T,class Compare > class K_Heap { public: K_Heap() {} K_Heap(T* arr, size_t size, size_t k) { assert(k < size); _a.reserve(k); for (size_t i = 0; i < k; ++i) { _a.push_back(arr[i]); } for (size_t i = (k - 2) / 2; i > 0; --i) { AdjustDown(k, i); } for (size_t i = 0; i < size; ++i) { if (_a[0] < arr[i]) { _a[0] = arr[i]; AdjustDown(k, 0); } } for (size_t i = 0; i < k; ++i) { cout << _a[i] << " "; } cout << endl; } protected: void AdjustDown(size_t k, size_t parent) { Compare com; size_t child = parent * 2 + 1; while (child < _a.size()) { if (child + 1 < _a.size() && com(_a[child+1], _a[child])) { ++child; } if (com(_a[child], _a[parent])) { swap(_a[child], _a[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } private: vector<T> _a; };
堆排序:
具体思路:
1. 将给定的数组压入vector中,对其进行向下调整调节为大堆或者小堆;
2.取出最小的数和最大数进行交换;
3.再次进行调整的时候元素的个数应该减一,不用算最后一个元素(因为最后一个不是最大的数就是最小的数);
4.直到所有的数都依次进行了比较。
//堆排序 template<class T> struct Less { bool operator()(const T& l, const T& r) { return l < r; } }; template<class T> struct Greator { bool operator()(const T& l, const T& r) { return l > r; } }; template<class T, class Compare> class Sort_Heap { public: Sort_Heap() {} Sort_Heap(T* arr, size_t size) { _a.reserve(size); for (size_t i = 0; i < size; ++i) { _a.push_back(arr[i]); } for (int i = (size - 2) / 2; i >= 0; --i) { AdjustDown(size, i); } } void AdjustDown(size_t size, size_t parent) { Compare com; size_t child = parent * 2 + 1; while (child < size) { if (child + 1 < size && com(_a[child + 1], _a[child])) { ++child; } if (com(_a[child], _a[parent])) { swap(_a[child], _a[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } void _Sort_Heap(size_t size) { size_t end = size - 1; while (end > 0) { swap(_a[0], _a[end]); AdjustDown(end, 0); --end; } } void Print() { for (size_t i = 0; i < _a.size(); ++i) { cout << _a[i] << " "; } cout << endl; } private: vector<T> _a; };
相关文章推荐
- TOP-K问题-堆排序和快排实现
- 微信红包问题求前K个元素(即堆排序的应用)
- 在"Select top 2 * from news order by count"进行筛选时,如果count值有重复时,则筛选结果将不是2条记录,这个问题该怎么解决?
- ps 与 top 对于cpu使用率不一致的问题
- SELECT TOP N 问题
- 关于不需用使用top的地方,而必须使用的一个小问题
- 总结今天实现Topbar随屏幕滚动逐渐出现和淡出问题
- 【算法】使用大根堆,解决top_k问题
- 父元素与子元素之间的margin-top问题(css hack)
- 【转】Oracle中搜索Top N的问题
- 关于存储过程 select top n 参数问题
- Oracle学习(七)----查询Top—N问题 & 相关子查询
- chrome浏览器的scrollTop问题
- 算法分析-TOP-K问题-BFPRT算法
- IE7、IE8、ff下的margin-top问题 折叠margin
- SQL中ROW_NUMBER和APPLY在处理TOP N等类似问题的一点比较
- 父元素与子元素之间的margin-top问题
- left top right bottom问题
- iOS开发——Autolayout的Top Layout guide问题
- 排序问题进击之一:堆排序