海量数据前N大

最大堆即大根堆 -- 求前n小
最小堆即小根堆 -- 求前n大
比如求前n小,对于当前元素,和最大堆的堆顶元素(即堆最大值)比较,如果小于堆顶元素,则替换堆顶元素,并调整堆。这样扫描一遍就可以得到最小的n个元素,效率非常高。
问题实例:
100w个数中找最大的前100个数
1 INT_MIN初始化最小堆
2 读入一个数,如果大于堆顶元素,则替换堆顶元素,并调整堆
//base index 1
#define LCHILD(i) (2*(i))
#define RCHILD(i) (2*(i)+1)

enum {
BIGHEAP=0,
SMALLHEAP=1,
};

//Adjust the heap
template <typename T>
void HeapAdjust(T *heap, size_t n, bool flg)
{
int i=1;
T root = heap[1];
while (i<n)
{
T ex;
if (flg == BIGHEAP) //最大堆
{
if (LCHILD(i)<=n)
{
ex = LCHILD(i);
if (RCHILD(i)<=n && heap[LCHILD(i)]<heap[RCHILD(i)])
ex = RCHILD(i);
}
else
break;

if (heap[ex] > root)
{
heap[i] = heap[ex];
i = ex;
}
else
break;
}
else //最小堆
{
if (LCHILD(i)<=n)
{
ex = LCHILD(i);
if (RCHILD(i)<=n && heap[LCHILD(i)]>heap[RCHILD(i)])
ex = RCHILD(i);
}
else
break;
if (heap[ex] < root)
{
heap[i] = heap[ex];
i = ex;
}
else
break;
}
}
heap[i] = root;
}

void FindNNumber(const char *file, size_t n, bool flg)
{
int *heap = new int[n+1];
int i;
for (i=1; i<=n; i++)
{
if (flg == BIGHEAP)
heap[i] = INT_MAX;
else
heap[i] = INT_MIN;
}

FILE *fp = fopen(file, "r");

int a;
while(fscanf(fp, "%d", &a)>0)
{
if (flg == BIGHEAP)
{
if (a < heap[1])
heap[1] = a;
}
else
{
if (a > heap[1])
heap[1] = a;

}
HeapAdjust(heap, n, flg);
}
fclose(fp);
for (i=1; i<=n; i++)
printf("%d\n", heap[i]);
}

void main()
{
//最小的n个数
FindNNumber("temp.txt", 10, BIGHEAP);
printf("\n\n");
//最大的n个数
FindNNumber("tt.txt", 10, SMALLHEAP);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react项目在ie空白解决

先安装babel-polyfill npm install babel-polyfill --save 2.在入口文件(main.js)最上方将其import进来 import babel-polyfill // 下面是别的代码&#xff0c;不需要动 import Vue from vue import App from ./App转载于:https://www.cnblogs.com/lcosima/p/8893799.html

元素不包括_干货 | FDA法规对元素杂质的限度控制及计算方法

元素杂质又称重金属&#xff0c;重金属原义指比重大于5的金属&#xff0c;元素杂质包括可能存在于原料、辅料或制剂中&#xff0c;来源于合成中催化剂残留、药品生产制备过程中引入或辅料中存在的、生产设备引入、或容器密闭系统引入。某些元素杂质不仅对药品的稳定性、保质期产…

web 日志分析工具 awstats 简单安装

awstats安装使用awstats是一个开源的日志分析工具&#xff0c;用perl编写。感觉还不错&#xff0c;把安装记录写下&#xff0c;也许有人用的到。可以分析大部分标准日志数据&#xff0c;如apache的&#xff0c;nginx的都可以首先下载awstats工具&#xff0c;http://awstats.sou…

MyOffic(经理评分)

1 public class SE2 {3 //员工类4 private int id;5 6 public int Id7 {8 get { return id; }9 set { id value; } 10 } 11 private string name; 12 13 public string Name 14 …

android二分查找法简书,【PYTHON】二分查找算法

二分查找&#xff1a;在一段数字内&#xff0c;找到中间值&#xff0c;判断要找的值和中间值大小的比较。如果中间值大一些&#xff0c;则在中间值的左侧区域继续按照上述方式查找。如果中间值小一些&#xff0c;则在中间值的右侧区域继续按照上述方式查找。直到找到我们希望的…

win7讲述人修复_揭秘:干掉了win7!为何win10屡被吐槽它却“永世留芳”

干掉了win7系统&#xff0c;win10似是更加地“肆无忌惮”了&#xff01;自微软宣布停止Windows 7的全部支持&#xff0c;而后win7的老用户越发频繁地收到win10的升级通知。要知道&#xff0c;“停止全部支持”也就意味着win7不再有任何新特性&#xff0c;在安全方面也不再能得到…

Ubuntu修改环境变量

修改用户环境变量 用户环境变量通常被存储在下面的文件中&#xff1a; ~/.profile~/.bash_profile 或者 ~./bash_login~/.bashrc上述文件在Ubuntu 10.0以前版本不推荐使用。 系统环境变量 系统环境变量一般保存在下面的文件中&#xff1a; /etc/environment/etc/profile/etc/ba…

Javasript设计模式之链式调用

写过jquery的可能都知道&#xff0c;jquery里面可以很方便的使用以下代码&#xff1a; // 不使用链式调用 const element $(ele); element.addClass(red); element.removeClass(green); element.show();// 链式调用 $(ele).addClass(red).removeClass(green).show(); 而jquery…

实现图片打乱_2020 回顾 | 25张图片,记录潮州的这一年

一年将近&#xff0c;万物更新这一年&#xff0c;不简单&#xff0c;也不容易让我们把时针拨回到1月通过镜头来回顾潮州这一年来令人难忘、激动和高光的时刻// 1月 //- January - 1月份的潮州充满了年味大家都沉浸在迎接新年的喜悦心情中期盼着新年的到来突如其来的疫情打乱了所…

html5 百度地图api文档,开发指南--百度地图JavaScript API大众版.doc

开发指南--百度地图JavaScriptAPI大众版开发指南--百度地图JavaScriptAPI大众版简介 JavaScript API大众版JavaScript API功能介绍百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口&#xff0c;它能够帮助您在网站中构建功能丰富、交互性强的地图应用&#xff…

如何导出SQL Azure脚本?

1). Tasks—Generate Scripts 2). In the “Generate and Publish Scripts” dialog, Next -- Next 3).Click “Advanced”, set likes following: 转载于:https://www.cnblogs.com/RobotTech/archive/2012/03/28/2420707.html

迭代器以及迭代器的作用

#迭代器迭代是访问集合元素的一种方式,迭代器是一个能够记住遍历位置的对象 迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束 如果想访问一个元素,需要把这个元素前面的所有元素都遍历后,才可以访问#1.可迭代的对象,像(1),(2)这些对象称之为可迭代对象(Ite…

jh锂电保护电路_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计

锂电池特性首先&#xff0c;芯片哥问一句简单的问题&#xff0c;为什么很多电池都是锂电池&#xff1f;锂电池&#xff0c;工程师对它都不会感到陌生。在电子产品项目开发的过程中&#xff0c;尤其是遇到电池供电的类别项目&#xff0c;工程师就会和锂电池打交道。这是因为锂电…

ImageView相关

ImageViewActivity.java package src.com; import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView; public class ImageViewActivity extends Activity { /* 声明 Button、ImageView对…

html怎么设置闪烁字,HTML最简单的文字闪烁代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Titlekeyframes blink{0%{opacity: 1;}50%{opacity: 1;}50.01%{opacity: 0;}100%{opacity: 0;}}-webkit-keyframes blink {0% { opacity: 1; }50% { opacity: 1; }50.01% { opacity: 0; }100% { opacity: 0; }}-moz-keyframes blin…

as上的git到码云操作_如何使用git从码云克隆项目到本地?

https://www.cnblogs.com/gbb123/p/6784822.html前段时间&#xff0c;有读者微信问我&#xff0c;如果使用Git从码云或者Github 克隆代码到本地&#xff0c;然后进行提交代码的操作 。可能是新手&#xff0c;刚接触编程&#xff0c;我就从网上找到了这篇文章给他看&#xff0c;…

48、多用块枚举,少用for循环

本文概要&#xff1a; 1、首先列举了四种可用于遍历的方式&#xff1a;标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。 2、对每一种遍历都给出对于NSArray、NSDictionary、NSSet三种容器的代码举例&#xff0c;读者可…

linux显示中文乱码

经常使用linux终端&#xff0c;有人上传中文命名的文件显示出中文乱码&#xff0c;下面是解决方法。 默认显示的字符编码# echo $LANGen_US.UTF-8修改i18n文件# vi /etc/sysconfig/i18nLANG"zh_CN.GB18030"LANGUAGE"zh_CN.GB18030:zh_CN.GB2312:zh_CN"SUPP…

ruijie交换机lacp动态_Server2016和华为s5720交换机链路聚合增加带宽

一、 背景1、server端企业中一台server2016利用两块1G网卡组成teaming生成一张2G的虚拟网卡&#xff0c;业务数据在这张带宽为2G的虚拟网卡上运行。这块网卡不仅带宽可以提升1倍&#xff0c;而且可以实现冗余&#xff0c;负载均衡&#xff0c;故障自动切换&#xff0c;保证业务…

如何用Netty实现一个轻量级的HTTP代理服务器

为什么会想通过Netty构建一个HTTP代理服务器&#xff1f;这也是笔者发表这篇文章的目的所在。 其主要还是源于解决在日常开发测试过程中&#xff0c;一直困扰测试同学很久的一个问题&#xff0c;现在我就来具体阐述一下这个问题。 在日常开发测试过程中&#xff0c;为了确保上线…