收集请求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. 积累的VC编程小技巧之文件操作

    1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = ...

  2. 判断指定进程是否为x64的方法(在ntdll判断某个x64函数是否存在)

    BOOL IsWow64ProcessEx(HANDLE hProcess) { // 如果系统是x86的,那么进程就不可能有x64 bool isX86 = false; #ifndef _WIN6 ...

  3. HDU4869:Turn the pokers(费马小定理+高速幂)

    Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. S ...

  4. MongoDB -- 更新

    $pull: db.collection.update( <query>, { $pull: { <arrayField>: <query2> } } ) $pul ...

  5. WM_PAINT产生原因有2种(用户操作和API)——WM_PAINT和WM_ERASEBKGND产生时的先后顺序不一定(四段讨论)

    1. 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再 ...

  6. [置顶] EasyMock构建单元测试

    1. 背景 单元测试作为程序的基本保障.很多时候构建测试场景是一件令人头疼的事.因为之前的单元测试都是内部代码引用的,环境自给自足.开发到了一定程度,你不得不到开始调用外部的接口来完成你的功能.而外部 ...

  7. 4.锁--无锁编程以及CAS

    无锁编程以及CAS 无锁编程 / lock-free / 非堵塞同步 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被堵塞的情况下实现变量的同步,所以也叫非堵塞同步(Non-b ...

  8. SilkTest高级进阶系列6-motif tag

    看SilkTest代码的时候不小心看到winclass.inc里面的一些类申明使用的是motif tag,例如: [-] winclass MessageBoxClass : DialogBox [ ...

  9. 编程算法 - 萨鲁曼的军队(Saruman&#39;s Army) 代码(C)

    萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...

  10. 【Cocos2d-X开发学习笔记】第01期:PC开发环境的详细搭建

    本文使用的是cocos2d-x-2.1.4版本 ,截至目前为止是最新稳定版 所谓的开发环境就是制作游戏的地方,打个比方读者就会十分清楚了.比如提到做饭,人们都会想到厨房.这是 因为厨房有炉灶.烟机.水 ...