`
lotusyu
  • 浏览: 34353 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

基于最小堆(小根堆)的topn算法

阅读更多
topn指的是从已经存在的数组中,找出最大(或最小)的前n个元素。
topn算法实现思路(找最大的n个元素)
1:取出数组的前n个元素,创建长度为n的最小堆。
2:从n开始循环数组的剩余元素,如果元素(a)比最小堆的根节点大,将a设置成最小堆的根节点,并让堆保持最小堆的特性。
3:循环完成后,最小堆中的所有元素就是需要找的最大的n个元素。
代码如下:
import java.util.Comparator;

/**
 * 堆数据结构应用实例
 * 
 * @author Administrator
 * 
 */
public class HeapApp {

	public static int[] toPrimitive(Integer array[]) {
		if (array == null)
			return null;
		if (array.length == 0)
			return new int[0];
		int result[] = new int[array.length];
		for (int i = 0; i < array.length; i++)
			result[i] = array[i].intValue();

		return result;
	}

	/**
	 * 1:取出数组的前n个元素,创建长度为n的最小堆。
	 * 2:从n开始循环数组的剩余元素,如果元素(a)比最小堆的根节点大,将a设置成最小堆的根节点,并让堆保持最小堆的特性。
	 * 3:循环完成后,最小堆中的所有元素就是需要找的最大的n个元素。
	 * 
	 * @param array
	 * @param n
	 * @return
	 */
	public static int[] topn(int[] array, int n) {
		if (n >= array.length) {
			return array;
		}
		Integer[] topn = new Integer[n];
		for (int i = 0; i < topn.length; i++) {
			topn[i] = array[i];
		}

		Heap<Integer> heap = new Heap<Integer>(topn, new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// 生成最大堆使用o1-o2,生成最小堆使用o2-o1
				return o2 - o1;
			}
		});
		for (int i = n; i < array.length; i++) {
			int value = array[i];
			int min = heap.root();
			if (value > min) {
				heap.setRoot(value);
			}
		}
//		heap.sort();
		return toPrimitive(topn);
	}

	public static void main(String[] args) {
		int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 11, 9, 10, 100 };
		array = new int[] { 101, 2, 3, 4, 5, 6, 7, 8, 11, 9, 10, 100 };
		int[] result = topn(array, 5);
		for (int integer : result) {
			System.out.print(integer + ",");
		}
	}

}


分享到:
评论

相关推荐

    寻找最优的topn算法

    本文将对几种常见的TopN算法进行分析比较,并最终给出一种最优解——基于小根堆的筛选法。 假设我们需要用C语言实现一个函数,在一个包含m个无序整数的数组中选取最大的n个整数。该函数的定义如下: ```c int* top...

    6_7.rar_C++_inventedjoc_probablyjzn_基于最小化堆的整型优先级队列

    在这个特定的案例中,我们关注的是一个使用C++实现的、基于最小化堆的整型优先级队列。最小化堆是一种二叉堆,其中每个父节点的值都小于或等于其子节点的值,因此堆顶(根节点)总是具有最小的值。这种数据结构特别...

    STL_quene.rar_crowd7oc_优先队列 堆_大根堆_大根对 c++_小根堆

    在本案例中,我们将探讨如何使用STL来实现大根堆和小根堆,以及它们在优先队列中的应用。 首先,大根堆和小根堆是堆数据结构的两种常见类型。堆通常是一个完全二叉树,其中每个父节点的值都大于或等于其子节点的值...

    python算法数据结构课程视频含代码之堆2G

    Python标准库中的`heapq`模块提供了基于堆队列算法的实现,可以用来构建最小堆。由于Python中没有内置的最大堆,可以通过一些技巧来实现最大堆的功能。 ##### heapq模块的基本操作: 1. **heapify**:将列表转换...

    数据结构:堆排序(升序排序建大堆),TOP-K问题

    堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一特性。堆是一个近似完全二叉树的结构,并且满足堆的性质:父节点的值总是大于或等于(对于最大堆)或小于或等于(对于最小堆)其子节点的值。在升序...

    各种最小二乘法汇总

    根据是否利用历史数据进行实时更新,可以将最小二乘法分为一次计算最小二乘算法和递推最小二乘算法。 **1.1 一次计算最小二乘算法** 一次计算最小二乘法是基于所有可用的数据进行参数估计的方法。其核心在于求解一...

    TOP,K算法.pdf

    【部分内容】讨论了寻找最小k个数的几种方法,包括基于堆的实现和快速选择算法,特别是快速选择算法中的"五分化中项的中项"或"中位数的中位数"作为主元的选择策略,以确保在最坏情况下仍具有O(N)的时间复杂度。...

    浅析CBIR中基于SVM的相关反馈算法

    首先是传统的SVM-based RF算法,该算法首先进行初步检索,然后将顶部N张图像标记为相关或不相关,利用这些反馈图像训练SVM分类器。通过计算数据库中每个图像与分类超平面的距离来确定其相关性,根据得分重新排序并...

    ,非线性最小二乘拟合的计算方法,实用型,谢谢合作

    最常用的算法之一是高斯-牛顿法,它基于梯度下降的思想,利用了函数 \( f \) 关于参数 \( \boldsymbol{\theta} \) 的雅可比矩阵(Jacobian)来迭代更新参数。 高斯-牛顿法的基本步骤如下: 1. 初始化参数 \( \...

    数据结构课程设计报告-(1)

    堆排序是一种基于比较的排序算法,其基本思想是构建一个大根堆或小根堆,然后将堆顶元素(即当前最大或最小元素)与末尾元素交换,接着对剩余元素重新调整堆,重复此过程,直至整个序列有序。在这个过程中,堆向上...

    最大堆实现排序(从大到小输出)

    堆排序是一种基于最大堆(或最小堆)的比较排序算法。其主要步骤如下: 1. **构建最大堆**:首先将输入数组构建成一个最大堆。这可以通过遍历数组并执行SiftDown操作来完成。从最后一个非叶子节点开始(即数组长度...

    常用到的一些算法学习.zip

    12. **最小堆和最大堆**:它们在优先队列、Top K问题、堆排序中有着广泛的应用。 13. **位操作**:位操作在空间优化和高效计算中非常有用,如快速幂、求最大公约数和最小公倍数等。 这些知识点涵盖了算法学习的多...

    一亿取100数字Top100

    5. **流式算法**:如果数据是连续流入的,可以使用布隆过滤器(Bloom Filter)初步过滤重复的数字,然后结合最小堆处理。布隆过滤器是一种空间效率高的概率型数据结构,用于判断一个元素是否在一个集合中,有一定的...

    堆排序代码

    堆排序是一种基于比较的排序算法,它利用了堆这种特殊的树形结构来进行排序。在计算机科学中,堆通常指的是一种完全二叉树结构,其每个节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。 #### 二、...

    经典算法代码实现.zip

    5. **堆排序**:堆排序是一种基于比较的排序算法,通过构建最大(或最小)堆来实现排序。最大堆是父节点的键值总是大于或等于其子节点的键值的二叉树;反之,最小堆则相反。堆排序的时间复杂度为O(n log n)。 6. **...

    堆排序的应用:从1亿条数据中从大到小取前10000条

    堆排序是一种基于比较的排序算法,它通过构造一个最大(或最小)堆来实现数据的排序。在本案例中,我们关注的是如何利用堆排序从一亿条数据中快速找到最大的10000个数。这个任务对于大数据处理和高效率的算法设计...

    数据结构基于C++的算法实现

    本资源“数据结构基于C++的算法实现”详细介绍了多种数据结构及其C++实现,这对于学习者掌握数据结构和算法至关重要。下面将详细讨论其中涉及的主要知识点。 1. **数组**:是最基础的数据结构,提供了通过索引访问...

    我写的凸包模板,具体算法是算法导论上的经典算法

    该算法用于寻找二维平面上一组点构成的最小凸多边形,即凸包。文章将重点介绍算法的基本原理、实现过程以及代码分析等内容。 ### 凸包算法概述 凸包问题在计算几何领域具有重要的地位,它是指在平面上给定一组点,...

Global site tag (gtag.js) - Google Analytics