查找问题:

  • 问题一:寻找一个序列中第k小的元素

对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素

分析思路:

假设无序序列存放在a[0 … n-1]中,若将a递增排序,则第k小的元素为a[k-1].

对于无序序列a[s … t],在其中查找第k小的元素

(1)若s>=t,其中只有一个元素或没有任何元素,

(2)若s=t且s=k-1,表示只有一个元素,a[k-1]即为所求结果

(3)s<t,表示该序列有两个或两个以上的元素,以基准为中心将其划分为a[s … i-1]和a[i+1 … t]两个子序列,基准a[i]即已归位,a[s … i-1]中所有元素均小于a[i],a[i+1 … t]中所有元素均大于a[i],即a[i]为第i+1小的元素存在以下三种情况

①若k-1=i,a[i]为所求结果
②若k-1<i,第k小元素在a[s … i-1]序列中
③若k-1>i,第k小元素在a[i+1 … t]序列中

代码:

#include<stdio.h>int QuickSelect(int a[],int s,int t,int k){int i=s,j=t;int tmp;if(s<t){  //区间内至少存在2个以上的元素 tmp=a[s];   //用区间第一个记录作为基准while(i!=j){    //区间两端指针向中间移动,直到i=j为止 while(j>i&&a[j]>=tmp)   j--;  //从右向左扫描,找到第一个关键字小于tmp的a[j] a[i]=a[j];  //将a[j]移动到a[i]的位置while(i<j&&a[i]<=tmp)i++;   //从左向右扫描,找到第一个关键字大于tmp的a[i] a[j]=a[i];   //将a[i]移动到a[j]的位置 } a[i]=tmp;if(k-1==i)return a[i];else if(k-1<i)return QuickSelect(a,s,i-1,t);   //在左区间中递归查找elsereturn QuickSelect(a,i+1,t,k);   //在右区间中递归查找 }else if(s==t&&s==k-1)     //区间中只有一个元素return a[k-1];
}
int main(){int n=10;int k,e;int a[]={2,5,1,7,10,6,9,4,3,8};for(k=1;k<n;k++){e=QuickSelect(a,0,n-1,k);printf("第%d 小的元素:%d\n",k,e);}
}


  • 问题二:查找最大和次大元素

对于给定的含有n个元素的无序序列,求这个序列中的最大和次大元素

分析思路:

(1)若a[low … high]中含有一个元素,则max1=a[low],max2=-INF(负无穷大)

(2)若a[low … high]中含有两个元素,则max1=max{a[low],a[high]};max2=min{a[low],a[high]};

(3)若a[low … high]中含有两个以上元素,按中间位置mid=(low+high)/2划分为a[low … mid] 和a[mid+1 … high]两个区间,求出左区间的最大元素lmax1和次大元素lmax2;再求出右区间的最大元素rmax1和次大元素rmax2

若lmax1>rmax1则max1=lmax1,max2=max{lmax2,rmax1};否则max1=rmax1,max2=max{lmax1,rmax2}

举例:
对于a[0 … 4]={5,2,1,4,3},mid=(0+4)/2,划分为左区间a[0 … 2]={5,2,1}和右区间a[3,4]={4,3}

左区间:lmax1=5,lmax2=2
右区间:rmax1=4,rmax2=3

再进行比较

代码:

void solve(int a[],int low,int high,int &max1,int &max2){if(low==high){  //只有一个元素 max1=a[low];max2=-INF;}else if(low=high-1)  //有两个元素{max1=max(a[low],a[high]);max2=min(a[low],a[high]);} else {   //两个以上元素 int mid=(low+high)/2;int lmax1,lmax2;solve(a,low,mid,lmax1,lmax2); //左区间求 int rmax1,rmax2;solve(a,mid+1,high,rmax1,rmax2);  //右区间求 if(lmax1>rmax1){max1=lmax1;max2=max(lmax2,rmax1);}else{max1=rmax1;max2=max(rmax2,lmax1);}}
}

分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素相关推荐

  1. 求包含n(n>1)个元素的无序序列中第k小的元素。

    求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...

  2. 求序列中第k小的数_推荐算法序列建模现状

    本篇文章主要是自己记录的相关序列建模.用户行为embedding向量的调研现状. 目录 一.序言 二.序列编码 (a)RNN (b)CNN (c)Attention 三.相关文献 1.attentio ...

  3. 求序列中第k小的数_无理数的整数部分与小数部分

    小数,可分为整数部分和小数部分,无理数作为无限不循环小数,在初中阶段引入无理数之后,对于小数部分的理解难度略有增加,毕竟"无限"对于七年级学生依然属于半懂概念.而在教学过程中,对于 ...

  4. 减治算法——序列中第k大的数字

    现在有一个无序序列T,我们现在的需求是寻找其中第k大的一个数字. 这种问题我一般就直接sort然后返回了,但是这里使用减治法,我们可以参考之前的快速排序的思路,先把整个数组从轴值划分,但是不用像快排那 ...

  5. 分治法在求解“最近对”问题中的应用(JAVA)

    分治法在求解"最近对"问题中的应用 最近对问题在蛮力法中有过讲解,时间复杂度为O(n^2),下面将会采用分治法讲解这类问题,时间复杂度会降到O(nlogn) 我们将笛卡尔平面上n& ...

  6. 面试题:寻找一个字符串中出现次数最多的字符以及出现的次数

    要求编写代码实现:寻找一个字符串中出现次数最多的字符以及出现的次数. 解法一:用删除法实现 (挺巧妙的一种) public class FindTheMostAppearChar {public st ...

  7. 求一个序列中最大的子序列_最大的斐波那契子序列

    求一个序列中最大的子序列 Problem statement: 问题陈述: Given an array with positive number the task to find the large ...

  8. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  9. python取列表前几个元素_Python下几种从一个序列中取出元素的方法

    使用Python进行数据处理时,有时候会有这样的操作,比如从一个列表或者numpy array中随机取出一个元素,对一个列表中的元素进行shuffle,等等.虽然这些操作也可以通过编写很简短的程序完成 ...

最新文章

  1. slub object 内存布局
  2. linux shell概述,Linux学习 -- Shell基础 -- 概述
  3. day16T2改错记
  4. NYOJ 683 Jim的实验
  5. Java 字符串分割陷阱
  6. 四位共阳极数码管显示函数_数码管模块.doc
  7. gcc -fPIC选项
  8. 尚硅谷李老师Mysql基础笔记
  9. Java实现单词树(trie)
  10. spark学习-61-源代码:ShutdownHookManager虚拟机关闭钩子管理器
  11. window端口号被占用解决
  12. Java多线程共享变量控制
  13. 21-7-28 git学习复习
  14. 主流的质量管理和项目管理及研发管理体系探索
  15. 传统企业数字化营销转型必经之路
  16. 一篇文章教会你使用word域代码(seq field code )
  17. plotyy函数_MATLAB学习笔记 plotyy函数 | 学步园
  18. 冬瓜哥祝大家新年快乐!
  19. PLM与PDM的概念与区别
  20. c51单片机之数码管显示(共阳极数码管)

热门文章

  1. python编程入门 pdf-Python编程从入门到精通.pdf
  2. python编程是啥-python中type()是什么意思
  3. python儿童入门视频-老男孩Python视频教程全套完整版!无偿分享~
  4. 简单python脚本实例-五个python常用运维脚本面试题实例
  5. qq纯黑主题怎么设置_qq背景变黑色,怎么调过来
  6. 联合主键违反唯一性约束_(变强、变秃)Java从零学习024/252数据库之定义约束。...
  7. vue 导出Excel
  8. html图片使用glide,jQuery响应式幻灯片插件jquery.glide.js(支持触摸轻量级)
  9. SpringMVC控制器单例和多例
  10. spring集成Quartz时区问题造成任务晚执行八小时