面试题 收集请求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 ...
随机推荐
- Swift - 自定义单元格实现微信聊天界面
1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示 ...
- Swift编程语言学习9—— 存储属性和计算属性
属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性能够用于类.结构体和枚举里,存储属性仅仅能用于类和结构体. 存储属性和计算属性通经 ...
- sqlplus连接登录数据库时,出现 ORA-28009错误(转)
安装了oracle10g,打算用SQLPLUS 登录数据库进行操作.打开sqlplus后,可以看到要求输入用户名,口令和主机字符串.前面两个都知道,但是后一个却不明白,查了资料才知道是安装时的全局数据 ...
- IE6下position:fixed不支持问题及其解决方式
IE6有诸多奇葩,不支持position:fixed就是当中之中的一个.所以在做一些比方固定在顶部或者底部或者固定元素的效果时须要考虑兼容IE6的这个问题.解决方式是用Ie6的hack. *html ...
- grep与正则表达式,grep、egrep和fgrep
grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串. ...
- Android开发:TextView添加超链接的简便方法
TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...
- SQL SERVER CHARINDEX函数
CHARINDEX函数经常常使用来在一段字符中搜索字符或者字符串.假设被搜索的字符中包括有要搜索的字符,那么这个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的開始位数.即CHARIN ...
- POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 12296 Accepted: 6071 Desc ...
- 不要打开文件,阅读Rvt信息档案
叶老师,想问一下是否能基于revit API 2014,直接在开发时传递给程序要处理的文件名称和路径.而不用再在revit软件中打开为当前活动视图,就直接获得文件里信息.这样可行不? 答: 能够.你能 ...
- FreeNAS 9.1.1 发布,网络存储系统 - 开源中国社区
FreeNAS 9.1.1 发布,网络存储系统 - 开源中国社区 FreeNAS 9.1.1 发布,网络存储系统