面试题 收集请求k千里马
收集请求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千里马的更多相关文章
- IOS试题收集1
IOS试题收集1 1.Objective C中有多继承吗?没有的话用什么代替? Protocol 2.Objective C中有私有方法吗?私有变量呢? OC类里面只有静态方法和实例方法这两种,@pr ...
- 原 iOS面试题收集
原 iOS面试题收集 发表于2年前(2013-07-22 13:47) 阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...
- 前端开发面试题收集 JS
前端开发面试题收集-JS篇 收集经典的前端开发面试题 setTimeout的时间定义为0有什么用? javascript引擎是单线程处理任务的,它把任务放在队列中,不会同步执行,必须在完成一个任务后才 ...
- linux运维工程师面试题收集
面试必考 mysql5和mysql6 有什么区别 mysql-server-5.5:默认引擎改为Innodb,提高了性能和扩展性,提高实用性(中继日志自动恢复) mysql-server-5.6:In ...
- 经典Java面试题收集
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...
- Android面试题收集
Android是一种基于Linux的自由及开放源码的操作系统,主要使用于移动设备.如智能手机和平板电脑.由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题, ...
- android--------面试题收集
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题 ...
- Android面试题收集(有具体答案)
Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每个Android应用程序都在它自己的进程中执行,都 ...
- 100道Java基础面试题收集整理(附答案)
不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...
随机推荐
- 与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)
原文:与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任 ...
- 内核编程实例,多文件的Makefile
内核编程实例,多文件的Makefile 经典的hello word测试 ////# cat hello.c #include <linux/module.h> #include <l ...
- 【Demo 0016】SQLite 数据库
本章学习要点: 1. 熟悉SQL语句: 2. 掌握SQLit库的基本用法; 3. 掌握SQLite封装:
- [eclipse] 三个操作技巧
[eclipse] 三个操作技巧 1.快捷键Ctrl+Shift+i:Debug调试中直接获取方法的返回值 在下图代码中,想知道getHost(),则在调试时运行完该句代码后,选中"urlU ...
- Swift - 使用网格(UICollectionView)进行流布局
一.网格UICollectionView最典型的例子是iBooks.其主要属性如下: 1,layout 该属性表示布局方式,有Flow.Custom两种布局方式.默认是Flow流式布局. 2,Acce ...
- MongoDB -- 更新
$pull: db.collection.update( <query>, { $pull: { <arrayField>: <query2> } } ) $pul ...
- vs2008编译QT开源项目三国杀(五篇文章)
请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...
- POJ1291-并查集/dfs
并查集 题意:找出给定的这些话中是否有冲突.若没有则最多有多少句是对的. /* 思路:如果第x句说y是对的,则x,y必定是一起的,x+n,y+n是一起的:反之x,y+n//y,x+n是一起的. 利用并 ...
- Delaunay三角剖分算法
在图像处理中,经常会使用到三角剖分算法: 具体定义及其算法可以参考:http://baike.so.com/doc/5447649.html 下面放出来代码: Delaunay接口为存C: 测试是使用 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...