查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
两种思路,无非就是时间与空间的妥协。
限制空间的时候要对原数组进行排序,最好的时间复杂度是O(nlogn),由此可见,当牺牲一部分空间的时候会换来时间复杂度的降低。进而再想到利用一个大小为K的临时数组,来存储K个最小的值,在遍历原数组的同时,更新临时数组里的数据就OK了。那么,现在的问题就是更新临时数组,怎样才能每访问一个数据,都能使临时数组里的数据是最小的K个。自然想到选出临时数组里面的最大值,和原数组里的新访问的值进行比较,判断是否替换最大值。遍历原数组的时间复杂度是O(n)那么,选择临时数组的最大值的时间复杂度要小于O(logn)才对得住牺牲的空间复杂度。。。
现在,马上想到的选择最大值的方法是进行一趟冒泡,但时间复杂度是O(K)不见得比O(logn)小。能比O(logn)小的,自然就想到了O(logk),见到logk就想到了二叉树或者说是堆。。。嗯,也就是大根堆
当元素个数小于k的时候,直接把原数组里面的数据直接放到临时数组里面,当达到k后,便建立大根堆——选出最大的和原数组的新数据进行比较(每次的时间复杂度为logk,这样共要进行n-k次,因此,时间复杂度是O(nlogk)。但是,还有一种做法,是原地比较,将原数组建成一个小根堆,然后输出k次,就可以在原数组末端得出最小的k个数据,这样的时间复杂度应该是max(O(n)[建堆]+O(klogn)[选出k个]),和利用临时数组的比不知哪个的时间复杂度会更低。
下面是利用临时数组的做法:
#include<stdio.h>
#include<stdlib.h>
void HeapAdjust(int* a,int length,int i){
int lchild = * i ;
int rchild = * i + ;
int max = i;
if(lchild < length&&a[max] < a[lchild])
max = lchild;
if(rchild < length&&a[max] < a[rchild])
max = rchild;
int temp = a[max];
if(max != i){
a[max] = a[i];
a[i] = a[max];
HeapAdjust(a,length,max);
}
}
void HeapSort(int*temp,int*a,int length,int k){//遍历原数组,更新临时数组
for(int i = k + ; i <= length; i++){
if(temp[] > a[i]){
temp[] = a[i];
HeapAdjust(temp,k,);
}
}
void HeapBuild(int* a,int length){
for(i = length / ; i > ; i--)
HeapAdjust(a,length,i);
}
void minKvalue(int* a,int length,int k){//所要求功能函数
if(k > length||k < ||length < )
return ;
int* temp = (int*)malloc(sizeof(int)*(k + ));
int i;
for(i = ; i <= k; i++)
temp[i] = a[i];
BuildHeap(temp,k);
HeapSort(temp,a,length,k);
for(i = ; i <= k; i++)
printf("%4d",temp[i]);
printf("\n");
free(temp);
}
int main(){//测试函数
int length,*a;
printf("输入数组长度:\n");
scanf("%d",&length);
a = (int*)malloc(sizeof(int)*(length + ));
printf("输入%d个数据:\n");
for(int i = ; i <= length; i++)
scanf("%d",a + i);
minKvalue(a,temp,length,k);
free(a);
查找最小的k个元素的更多相关文章
- 【编程题目】查找最小的 k 个元素
5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...
- 查找最小的k 个元素之C#算法实现
紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个.例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 ...
- 查找最小的K个元素,使用最大堆。
查找最小的K个元素,使用最大堆,具体代码如下: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace st ...
- 【Data Structure & Algorithm】 查找最小的k个元素
查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1, 2, 3, 4, 5, 6, 7和8这八个数字,则最小的4个数字为1, 2, 3和4. 分析:这道题最简单的思路是把输入的n ...
- 5.查找最小的k个元素[Kmin]
[题目] 输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. [分析] 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前 ...
- 5.查找最小的k个元素(数组)
题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想 ...
- 程序员面试50题(1)—查找最小的k个元素[算法]
题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数 ...
- 查找最小的k个元素 【微软面试100题 第五题】
题目要求: 输入n个整数,输出其中最小的k个. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 参考资料:剑指offer第30题. 题目分析: 解法一: 用快排 ...
- IT公司100题-5-查找最小的k个元素
问题描述: 输入n 个整数,输出其中最小的k 个. 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1. 分析: 时间复杂度O(nlogn)方法: ...
随机推荐
- C(n+m,m) mod p的一类算法
Lucas定理 A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])*C(a[n ...
- 菱形java代码
public class boy { //菱形 public static void main(String[] args) { int m=4; for (int i=0;i<=m;i++){ ...
- [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...
- getline函数
在我的印象中,getline函数常常出如今自己的视野里,模糊地记得它常常常使用来读取字符串 .可是又对它的參数不是非常了解,今天又用到了getline函数,如今来细细地总结一下: 首先要明确设计get ...
- Hadoop MapReduce链式实践--ChainReducer
版本号:CDH5.0.0,HDFS:2.3.0,Mapreduce:2.3.0,Yarn:2.3.0. 场景描写叙述:求一组数据中依照不同类别的最大值,比方,例如以下的数据: data1: A,10 ...
- nginx 使用安装问题及解决方案
如何安装清参考:http://www.runoob.com/linux/nginx-install-setup.html 可以先不用配置,等理解后在配置. 在启动nginx时,出现提示: nginx: ...
- python10min系列之面试题解析:python实现tail -f功能
同步发布在github上,跪求star 这篇文章最初是因为reboot的群里,有人去面试,笔试题有这个题,不知道怎么做,什么思路,就发群里大家讨论 我想了一下,简单说一下我的想法吧,当然,也有很好用的 ...
- [转]使用storyboard实现页面跳转,简单的数据传递
由于最近才接触到IOS,苹果已经建议storyboard来搭建所有界面了,于是我也追随时尚,直接开始使用storyboard.(不料在涉及到页面跳转的时候,遇到的问题是:点击后没有任何反应)众所周知, ...
- Oracle10g任务调度创建步骤
/* 创建可执行程序 */begin DBMS_SCHEDULER.CREATE_PROGRAM( program_name => 'peace_sj_his.PROG_DATASYNC', p ...
- 阿里云ECS每天一件事D1:配置SSH
近期因为项目需求,采购了两台阿里云ECS,选择的系统为CentOS 6.3 X64 安全加固版,额外买了160G的硬盘,应该够应付此项目的需求了. ECS默认已经配置好了sshd服务,可以使用root ...