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算法进行分析比较,并最终给出一种最优解——基于小根堆的筛选法。 假设我们需要用C语言实现一个函数,在一个包含m个无序整数的数组中选取最大的n个整数。该函数的定义如下: ```c int* top...
在这个特定的案例中,我们关注的是一个使用C++实现的、基于最小化堆的整型优先级队列。最小化堆是一种二叉堆,其中每个父节点的值都小于或等于其子节点的值,因此堆顶(根节点)总是具有最小的值。这种数据结构特别...
在本案例中,我们将探讨如何使用STL来实现大根堆和小根堆,以及它们在优先队列中的应用。 首先,大根堆和小根堆是堆数据结构的两种常见类型。堆通常是一个完全二叉树,其中每个父节点的值都大于或等于其子节点的值...
Python标准库中的`heapq`模块提供了基于堆队列算法的实现,可以用来构建最小堆。由于Python中没有内置的最大堆,可以通过一些技巧来实现最大堆的功能。 ##### heapq模块的基本操作: 1. **heapify**:将列表转换...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一特性。堆是一个近似完全二叉树的结构,并且满足堆的性质:父节点的值总是大于或等于(对于最大堆)或小于或等于(对于最小堆)其子节点的值。在升序...
根据是否利用历史数据进行实时更新,可以将最小二乘法分为一次计算最小二乘算法和递推最小二乘算法。 **1.1 一次计算最小二乘算法** 一次计算最小二乘法是基于所有可用的数据进行参数估计的方法。其核心在于求解一...
【部分内容】讨论了寻找最小k个数的几种方法,包括基于堆的实现和快速选择算法,特别是快速选择算法中的"五分化中项的中项"或"中位数的中位数"作为主元的选择策略,以确保在最坏情况下仍具有O(N)的时间复杂度。...
首先是传统的SVM-based RF算法,该算法首先进行初步检索,然后将顶部N张图像标记为相关或不相关,利用这些反馈图像训练SVM分类器。通过计算数据库中每个图像与分类超平面的距离来确定其相关性,根据得分重新排序并...
最常用的算法之一是高斯-牛顿法,它基于梯度下降的思想,利用了函数 \( f \) 关于参数 \( \boldsymbol{\theta} \) 的雅可比矩阵(Jacobian)来迭代更新参数。 高斯-牛顿法的基本步骤如下: 1. 初始化参数 \( \...
堆排序是一种基于比较的排序算法,其基本思想是构建一个大根堆或小根堆,然后将堆顶元素(即当前最大或最小元素)与末尾元素交换,接着对剩余元素重新调整堆,重复此过程,直至整个序列有序。在这个过程中,堆向上...
堆排序是一种基于最大堆(或最小堆)的比较排序算法。其主要步骤如下: 1. **构建最大堆**:首先将输入数组构建成一个最大堆。这可以通过遍历数组并执行SiftDown操作来完成。从最后一个非叶子节点开始(即数组长度...
12. **最小堆和最大堆**:它们在优先队列、Top K问题、堆排序中有着广泛的应用。 13. **位操作**:位操作在空间优化和高效计算中非常有用,如快速幂、求最大公约数和最小公倍数等。 这些知识点涵盖了算法学习的多...
5. **流式算法**:如果数据是连续流入的,可以使用布隆过滤器(Bloom Filter)初步过滤重复的数字,然后结合最小堆处理。布隆过滤器是一种空间效率高的概率型数据结构,用于判断一个元素是否在一个集合中,有一定的...
堆排序是一种基于比较的排序算法,它利用了堆这种特殊的树形结构来进行排序。在计算机科学中,堆通常指的是一种完全二叉树结构,其每个节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。 #### 二、...
5. **堆排序**:堆排序是一种基于比较的排序算法,通过构建最大(或最小)堆来实现排序。最大堆是父节点的键值总是大于或等于其子节点的键值的二叉树;反之,最小堆则相反。堆排序的时间复杂度为O(n log n)。 6. **...
堆排序是一种基于比较的排序算法,它通过构造一个最大(或最小)堆来实现数据的排序。在本案例中,我们关注的是如何利用堆排序从一亿条数据中快速找到最大的10000个数。这个任务对于大数据处理和高效率的算法设计...
本资源“数据结构基于C++的算法实现”详细介绍了多种数据结构及其C++实现,这对于学习者掌握数据结构和算法至关重要。下面将详细讨论其中涉及的主要知识点。 1. **数组**:是最基础的数据结构,提供了通过索引访问...
该算法用于寻找二维平面上一组点构成的最小凸多边形,即凸包。文章将重点介绍算法的基本原理、实现过程以及代码分析等内容。 ### 凸包算法概述 凸包问题在计算几何领域具有重要的地位,它是指在平面上给定一组点,...