收集请求k最大值

个人信息:就读于燕大本科软件project专业 眼下大三;

本人博客:google搜索“cqs_2012”就可以;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

博客时间:2014-5-15;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008;

制图工具:office 2010 powerpoint;

硬件信息:7G-3 笔记本;

真言

是问题就有方法去解决。

题目

集合里求出k个最大值。

思路

利用堆的特性去解决

建立K+1规模的小顶堆。然后不断更新堆顶,直至更新完,最后堆里除了堆顶外就是k个最大值

代码

主函数

std::pair<int *,int> KMaxOfArray(int * data,int const length,int K)
{
// 创建k+1规模的堆
int * pheap = new int[K+1];
for(int i = 0;i<K+1;i++)
{
pheap[i] = data[i];
}
Heap<int>::Heap_make(pheap,K+1,Heap<int>::Heap_min); // 遍历整个数组。然后得到K+1个最大数
for(int i = K+1;i<length;i++ )
{
pheap[0] = data[i];
Heap<int>::Heap_downcast(pheap,0,K+1,Heap<int>::Heap_min);
}
// 返回结果
return std::make_pair(pheap+1,K);
}

heap_make 函数

// 建堆操作 4
template<typename T>
void Heap<T>::Heap_make(T *data,int const length,bool (*pf)(T,T))
{
// 异常输入
if( data == NULL || length < 0 )
cout<<"异常输入"<<endl;
else // 正常输入
for(int i=0;i<length;i++)
{
Heap_upcast(data,i,length,pf);
}
};

heap_downcast 函数

// 堆得下溯操作
template<typename T>
void Heap<T>::Heap_downcast(T *data,int i,const int length,bool (*pf)(T,T))
{
if(data != NULL && length >= 0)
{
T max ;
// have two children
while(i*2+2 <length)
{
max = data[i];
//if(max >= data[i*2+1] && max >= data[2*i+2])
if(pf(data[i*2+1],max) == false && pf(data[i*2+2],max) == false)
break;
// right child bigger
//if( data[i*2+2]>data[2*i+1] && data[i*2+2]>max)
if(pf(data[i*2+2],data[2*i+1]) == true && pf(data[i*2+2],max) == true)
{
max = data[i*2+2];
data[i*2+2] = data[i];
data[i] = max;
i = i*2+2;
}
// left child bigger
//else if( data[i*2+1] >= data[2*i+2] && data[i*2+1]>max )
else if(pf(data[i*2+2] ,data[2*i+1]) == false && pf(data[i*2+1],max) == true)
{
max = data[i*2+1];
data[i*2+1] = data[i];
data[i] = max;
i = i*2+1;
}
}
// have one child
if(i*2+1 < length)
{
//if(data[i*2+1]>data[i])
if(pf(data[i*2+1],data[i]) == true)
{
max = data[i*2+1];
data[i*2+1] = data[i];
data[i] = max;
}
}
}
else
{
cout<<"exception of input Heap_downcast"<<endl;
}
};

heap_upcast 函数

// 堆得上溯操作
template<typename T>
void Heap<T>::Heap_upcast(T *data,int i,const int length,bool (*pf)(T,T))
{
if(data != NULL && length >= 0)
{
T max ;
// have two children
while( (i-1)/2 >= 0 )
{
max = data[i]; //if(max <= data[(i-1)/2])
if(pf(max,data[(i-1)/2]) == false)
break;
// child bigger, and go up
else
{
data[i] = data[(i-1)/2];
data[(i-1)/2] = max; i = (i-1)/2;
}
}
}
else
{
cout<<"exception of input Heap_downcast"<<endl;
}
};

版权声明:本文博客原创文章,博客,未经同意,不得转载。

面试题 收集请求k千里马的更多相关文章

  1. IOS试题收集1

    IOS试题收集1 1.Objective C中有多继承吗?没有的话用什么代替? Protocol 2.Objective C中有私有方法吗?私有变量呢? OC类里面只有静态方法和实例方法这两种,@pr ...

  2. 原 iOS面试题收集

    原 iOS面试题收集 发表于2年前(2013-07-22 13:47)   阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...

  3. 前端开发面试题收集 JS

    前端开发面试题收集-JS篇 收集经典的前端开发面试题 setTimeout的时间定义为0有什么用? javascript引擎是单线程处理任务的,它把任务放在队列中,不会同步执行,必须在完成一个任务后才 ...

  4. linux运维工程师面试题收集

    面试必考 mysql5和mysql6 有什么区别 mysql-server-5.5:默认引擎改为Innodb,提高了性能和扩展性,提高实用性(中继日志自动恢复) mysql-server-5.6:In ...

  5. 经典Java面试题收集

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...

  6. Android面试题收集

    Android是一种基于Linux的自由及开放源码的操作系统,主要使用于移动设备.如智能手机和平板电脑.由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题, ...

  7. android--------面试题收集

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题 ...

  8. Android面试题收集(有具体答案)

    Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每个Android应用程序都在它自己的进程中执行,都 ...

  9. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

随机推荐

  1. hdu 2147 SG函数打表(手写也可以) 找规律

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/1000 K (Java/Others) Total ...

  2.   PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。

    SBCL编译过程 - O.Nixie的专栏 - 博客频道 - CSDN.NET PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia).据说yEd也很不 ...

  3. 程序猿的量化交易之路(29)--Cointrader之Tick实体(16)

    转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top Tick:什么是Tick,在交易平台中很常见,事实上就 单笔交易时某仅仅证券 ...

  4. ubuntu14.04中virtualbox虚拟机无法启动

    近期升级了ubuntu14.04,还是按之前的方法安装了virtualbox(guest系统仍然使用升级之前的镜像文件),可是在启动guest系统时,总是报错,提演示样例如以下: Kernel dri ...

  5. junit测试时,出现java.lang.IllegalStateException: Failed to load ApplicationContext

    课程设计要求进行junit测试,我是在已经做好的ssh项目上做的测试,测试类代码如下 package com.zhang.web.services; import static org.junit.A ...

  6. Java线程面试题 Top 50(转)

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...

  7. 基于Predictive Parsing的ABNF语法分析器(十三)——rulelist、rule、rulename、define-as和elements

    我们来看看rulelist,它是整个ABNF文法的入口,就是说一个ABNF文法就是一个规则列表rulelist.一个rulelist由若干个rule规则组成,每个rule由规则名rulename.定义 ...

  8. 谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏

    这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. ...

  9. gcc入门

    gcc入门 1. 什么是gcc gcc的全称是GUN Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除 ...

  10. CodeForce 356A Knight Tournament(set应用)

     Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...