堆的应用:解决海量数据,从复杂度优化

#pragma
#include<iostream>
#include<time.h>
#include<vector>
using namespace  std;
//从十万个数中找出最大的前K个,用小堆
#define N 100000
#define K 100
vector<int> Data;
//产生海量数据
void  GetData()
{
	srand(unsigned(time(0)));
	for (int i = 0; i < N; ++i)
	{
		Data.push_back(rand() % N + 1);//产生随机数在1到length间
	}
}
void AdjustDown(int a[], int size, int parIndex)
{
	int chiIndex = parIndex*2+1;
	while (chiIndex < size)
	{
		if (chiIndex + 1 < size&&a[chiIndex + 1] < a[chiIndex])
			++chiIndex;
		if (a[chiIndex] < a[parIndex])
		{
			swap(a[chiIndex], a[parIndex]);
			parIndex = chiIndex;
			chiIndex = parIndex * 2 + 1;
		}
		else
			break;
	}
}
void GetTopK(vector<int>& Data)
{
	int heapArray[K];
	for (int i = 0; i < K; ++i)
	{
		heapArray[i] = Data[i];
	}
	//调整此堆为小堆
	for (int i = (K - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(heapArray, K, i);
	}
	for (int i = K-1; i < N; ++i)
	{
		if (heapArray[0] < Data[i])
		{
			heapArray[0] = Data[i];
			AdjustDown(heapArray, K, 0);
		}
	}
}

void Test1()
{
	GetData();
	GetTopK(Data);
}
时间: 2024-12-28 01:24:21

堆的应用:解决海量数据,从复杂度优化的相关文章

FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法

http://25swf.blogbus.com/tag/FluorineFx/ FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法 在FLASH里,假如在一个方法里,同事使用几个不同的NetStream.play 一个相同的标识,会发现只有一个能正常播放. 进行以下修改 RtmpConnection.cs 里的NewPlaylistSubscriberStream 方法if (streamId < StreamId)        return null;改

C语言switch/case圈复杂度优化重构

软件重构是改善代码可读性.可扩展性.可维护性等目的的常见技术手段.圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度量指标之一. C语言开发的项目中,switch/case代码块是一个很容易造成圈复杂度超标的语言特性,所以本文主要介绍下降低switch代码段的重构手段(如下图).switch圈复杂度优化重构可分为两部分:程序块的重构和case的重构.程序块重构是对代码的局部优化,而case重构是对代码的整体设计,

百度推广优化 关键字质量度优化指南

百度推广中的质量度是关键词的一项属性,它是百度推广系统根据关键词的创意质量.点击率.账户结构.帐户历史表现(账户生效时间.账户内其它关键词的点击率)等多种因素计算得出的值.在帐户中,质量度来说分为10个级别,10颗星是优,1颗星是差. 高质量度的好处主要有:对于广告主来说,可以用更低的点击价格获得更优的排名,从而降低整体推广费用,提高投资回报率.同时质量度的提高,广告可能跳左,提高点击率.对于搜索用户来说,搜索用户越感兴趣,越多人点击,访问者体验越好,质量度越高,对提高用户体验度有帮助. 第一篇

matlab中增加Java VM 的堆空间(解决xml_io_tools出现的OutOfMemory问题)

今天用MATLAB写程序,调用了xml_io_tools(很赞的一个xml读写工具包)中的函数,但是由于我要书写的文件比较大,5m左右,运行时不知道xml_io_tools中的哪一块超出了java中的内存限制,于是就来研究下怎么增加matlab中Java VM的堆空间,首先用英文在墙外搜了半天,google搜出来的前几条都是使用Jconsole来分配空间的,但是需要下载相应的matlab的版本的JDK的,中间各种曲折,详见文尾,最后放弃治疗的用中文搜了一下,发现早就有了官方的解答了,汗,将文章复

海量数据、高并发优化方案

一.应用服务器负载均衡 1.链路负载均衡 通过DNS解析域名时,将客户端的访问解析成不同的IP,分配到不同的入口,同时尽可能保证所访问的入口是所有入口中可能较快的一个. 2.软件负载均衡 访问时生成页面的任务会被分配给其中一台服务器完成,这个过程要保证公正.公平.平均. 3.硬件负载均衡 二.页面优化 1.减少请求次数 通过合并CSS和Javascript文件来减少请求次数或是将资源文件分布在多个域名下来绕过浏览器并发加载的限制. 2.压缩CSS和Javascript代码. 通过对文件代码内容删

UI的流畅度优化

Android中所有的界面绘制工作都是在UI线程中进行的,提高UI流畅度的最核心根本在于释放UI线程.即:不在主线程中做耗时的操作. 很多人都知道,耗时的操作要放到子线程中去做,比如访问网络,比如读写sd卡.像这类操作大家都会很自然的想到使用子线程来完成耗时的操作,等操作结束之后,再通过Handler通知主线程进行界面的更新.这是非常正确的方法.但是有一类方法,它必须得运行在在UI线程中,就是布局文件的加载.如果这类方法花的时间太多了,也是会对流畅度产生很大的影响.今天我们就来讲讲布局文件的优化

彻底解决 Intellij IDEA 卡顿 优化笔记,重要的快捷键

由于工作中经常出现分支各种切换,使用Eclipse便不再像以前那么舒服了,不停的修改工作空间,每次修改完工作空间又是一堆一堆的个性化设置,来回的切换,真的很累.我们做软件的,怎么能不去尝试新鲜的呢,毕竟,再难走的路,也有人已经走过,我们只需要Google一下而已. 本篇适用于Idea 14.x 15.x 16.x 这次在使用了2天的IDEA之后,我发现这玩意简直屌爆了! 这次我重新进行征服IDEA过程中,遇到了很多很多的问题,当然,有一句话说的很好,遇到一件很难搞的事情,但凡你有半点犹豫,那就肯

Flex内存泄露解决方法和内存释放优化原则

本文向大家简单介绍一下Flex内存泄露问题,主要包括Flex内存释放优化原则和Flex内存泄露解决方法两大部分内容,希望你会感兴趣. 作者:vipoyb来源:csdn.net|2010-07-29 14:08   你对Flex内存泄露的概念是否了解,这里和大家分享一下Flex内存释放优化原则和Flex内存泄露解决方法,希望本文的介绍能让你有所收获. Flex内存释放优化原则 1.被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉: 2.父对象内部的子对象被外部其他对象引用了,

Android 滚动RecyclerView加载图片时的流畅度优化

实现:使用onScrollStateChanged回调检测滚动状态,并在RecyclerViewAdapter内部设置类似isScrolling的状态值来控制网络图片的加载. 下面是代码举例: // BaseAdapter中添加如下代码 public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { …… protected boolea