线性时间选择算法-《数据结构》(结合例题讲解)

题目:给定一个包含 n 个元素的一维线性序列a[p:r],从这 n 个元素中找出第 k 小的元素,1

  1. 写出算法实现代码并截屏程序运行结果。
  2. 线性时间选择算法如何解决划分不平衡的问题?
  3. 分析线性时间选择算法的计算效率。

各位朋友,晚上好!我是小玥,”玥”代表着美好,愿各位好运连连!!!一个人的路很孤独,一群人的路不会孤单,咱们来玥方长!

线性时间选择算法(完整的代码,本题详细解析,附赠随机化划分算法)线性时间选择算法-《数据结构》(结合例题讲解)https://download.csdn.net/download/weixin_51620201/85045879 ;

文章比较详细,文字有点多啦!!!请耐心看完,文末有惊喜!!!!

先思考片刻!1s ,2s,3s,…..1min…………….

好,时间到!!!上思路

目录

一、题目分析

二、小玥解题

三、优化解题

四、线性时间选择算法

一、题目分析

题目给定了一个包含 _n_个元素的一维线性序列 a[0:14]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12},想要我们求第k小的元素。

注意看,a[0:14]是一个未排序好的数组!那么想要求第k小的元素,我们第一步要干啥?然后呢?接着呢?

第一步:先排序,排成递增数组

第二步:求出结果:a[k]。

嘿,是不是很简单???

问题来了,题目要求我们使用线性时间选择来求解!!!什么是线性时间选择???为什么要用线性时间选择???

别慌,小玥会一一讲解!!!

二、小玥解题

1、假如k=1,或者k=n,需要我们求的第k小元素,对应就是最小值和最大值。

这时只需要顺序查找比较便可直接求解,这很简单!!


public class exam1 {
    public static void main(String[] args)     //当k=1,k=n时,求数组的最小值和最大值
    {
        int a[]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12};
        int min=a[0];     //初始化min,max
        int max=a[0];
        for(int i=0;ia[i+1])
            {
                min=a[i+1];
                a[i]=min;
            }
            if(max

运行结果:

线性时间选择算法-《数据结构》(结合例题讲解)

2、现在咱们的 k=8,数组a[0:14]一共有15个元素,要求第8小元素,就是求数组的中位数!!!

这就要比上面的1难度增大了!!

活学现用,我们可以用我发表过的文章里的方法:快速排序中的partition划分算法。

基本思路:

  1. 数组a[p:r],选择一个基准元素,默认首元素为基准,base=a[p].
  2. 开始划分,把比基准base小的元素放在基准的左边,把比基准base大的元素放在基准的右边。
  3. 返回基准元素的下标j,也就是说,基准元素在原数组中的排位是j+1。
  4. 把k跟j+1比较,如果k==j+1,那么第k小元素就找到了,即为基准base.
  5. 如果k
  6. 直到找到第k小的元素,运行结束!

来人!!!上代码:

 public static int partition(int[] a,int p,int r)
     {
        int x=a[p];     //默认首元素为基准
        int i=p,j=r;    //i,j为游标
        while(true)
        {
            while(a[i]x && j>=i)   //在右边找一个比基准小的元素a[j]
                j--;
            if(i>=j)                //如果i>=j,则不符合交换的条件
                break;
            Math.swap(a,i,j);            //调用交换算法
        }
        return j;                   //返回基准的下标
      }

上面为partiton划分算法,怎么样!!!

完整的代码:

public class exam2
{
    public static int partition(int[] a,int p,int r)
     {
        int x=a[p];     //默认首元素为基准
        int i=p,j=r;    //i,j为游标
        while(true)
        {
            while(a[i]x && j>=i)   //在右边找一个比基准小的元素a[j]
                j--;
            if(i>=j)                //如果i>=j,则不符合交换的条件
                break;
            Math.swap(a,i,j);            //调用交换算法
        }
        return j;                   //返回基准的下标
      }
    public static int search(int[] a,int p,int r,int k)
    {
      if(p==r) return a[p];
      int i=Partition.partition(a,p,r);   //i为基准元素的下标
      int j=i-p+1;            //j为基准元素在原数组的排位
      if(k

运行结果:

线性时间选择算法-《数据结构》(结合例题讲解)

经检验,运行结果正确!!!

三、优化解题

partition划分算法分析:

在最好的情况下,默认的首元素为基准刚好就是数组的中位数,那么数组被划分为平衡的两部分,问题规模减少一半,时间复杂度为O(n)。

在最坏的情况下,假如基准刚好是最小值或者最大值,会出现划分不平衡的情况,数组划分后,会出现一个空的数组,问题规模每次只减少了1,时间复杂度为O(n2).

那么,有没有更优化的算法啊?当然有啦!!!partition算法,每次都默认首元素为基准,如果我们设置随机化的基准,那么问题是不是可以解决?

随机化划分算法:randompartition算法,即把基准的设置随机化,在平均情况下,时间复杂度可以达到O(n),这比partition算法跟优化啦!!!

回归题目,让我们使用线性时间选择算法,这算法也是比patition算法更优的,在最坏的情况下,时间复杂度可以达到O(n),也就是题目的题意所在!!!

四、线性时间选择算法

基本思路:

  1. 数组a[p:r],设置一个阈值,问题规模为n(即为数组的元素个数),当n
  2. 把原数组划分为n/5组,一般除了最后一组元素不足5个外,其他都满足5个。
  3. 把每组元素进行冒泡排序,找出中位数,那么一共有n/5个中位数。
  4. 把n/5个中位数提取出来,再进行冒泡排序,得到”中位数中的中位数”x,作为基准。
  5. 利用partition划分算法,返回基准x的下标j,并对应计算出x在原数组中的排位i。
  6. 把k与i比较,如果k
  7. 返回步骤1,以相同的策略递归找到第k小元素!!!

各位耐心看到这的朋友,是不是觉得这算法难度加大了???别慌,这很正常,越优化的算法,底层的理论都有点深奥,但是细心理解了,那么你就是王者!!!

你看下面,线性时间选择算法,小玥笨笨的弄出来啦!!!

部分代码:

public static void main(String[] args)    //线性时间选择算法
    {
        int[] a=new int[]{2,9,11,3,14,7,10,8,15,4,13,1,6,5,12};
        int k=8;
        int m=select(a,0,a.length-1,8);
        System.out.println("第"+k+"小的元素是"+m);
    }

运行结果:

线性时间选择算法-《数据结构》(结合例题讲解)

线性时间选择算法(完整的代码,全套资源,附随机化划分算法)线性时间选择算法-《数据结构》(结合例题讲解)https://download.csdn.net/download/weixin_51620201/85045768 ;

完整的线性时间选择算法代码,划分平衡分析以及时间效率公式计算,想要的朋友可以点击上方卡片链接下载哦,有问题随时联系小玥,附赠随机化划分算法randompartition !!!
创作不易,请多多指教!!!

Original: https://blog.csdn.net/weixin_51620201/article/details/123779944
Author: 来玥方长
Title: 线性时间选择算法-《数据结构》(结合例题讲解)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/694058/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python 数据可视化———绘制饼状图(bar)

    python 数据可视化———绘制饼状图(bar) 从入门到入门,快速上手饼状图 前言 Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。…

    人工智能 2023年7月14日
    084
  • 常用Java接单平台一览

    不少主攻Java的程序员兄弟除了工作,还会在空闲时间选择接单来增加自己的收入;对于那些生活在二三线的程序员兄弟们,通过接单,来获得与一线城市对等的收入。具体该怎么做,且听我娓娓道来…

    人工智能 2023年7月29日
    078
  • Neo4j使用方法总结

    导读 知识图谱由于其数据包含实体、属性、关系等,常见的关系型数据库诸如MySQL之类不能很好的体现数据的这些特点,因此知识图谱数据的存储一般是采用图数据库(Graph Databa…

    人工智能 2023年6月1日
    0138
  • nginx1.18.0 安装vts

    wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master nginx-mo…

    人工智能 2023年6月28日
    0134
  • Python中的图像处理(第十一章)Python图像锐化及边缘检测(1)

    Python中的图像处理(第十一章)Python图像锐化及边缘检测(1) 前言 一. Python准备 二. Python仿真 三. 小结 前言 随着人工智能研究的不断兴起,Pyt…

    人工智能 2023年6月18日
    0104
  • 2021年电赛D题图像处理经验分享

    1:写在前面 感谢四天三夜以来,我们所做的所有努力! 2:思路 3: 实现过程 简易版图像腐蚀和膨胀 首先要对图像进行处理: 4:总结 讨论一天才确定下来选题导致时间十分紧张。开始…

    人工智能 2023年6月22日
    084
  • 吃透这25个技术栈,面试官绝对另眼相看

    我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring M…

    人工智能 2023年6月27日
    079
  • java实现语音播放功能

    注: java实现文字转语音播放功能(仅限Windows系统); 在写代码之前先确定使用的电脑是否可以正常的播放外音(即:在电脑上直接播放音乐、电视等可以正常听到外放声音,或者插入…

    人工智能 2023年5月27日
    081
  • 【nlp学习】浅谈实体识别

    文章目录 前言 一、实体识别简介 * 1.实体识别 2.复杂情况下的实体识别 二、几种标注方法 * 1.指针标注 2.多头标注 3.片段排列+分类 三、数据层面的问题 前言 参考资…

    人工智能 2023年6月26日
    0100
  • 粒子群算法(PSO)优化的BP神经网络预测

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    人工智能 2023年7月25日
    057
  • 时空图卷积网络:一种用于交通预测的深度学习框架

    由于交通流的高度非线性和复杂性,传统方法不能满足中长期预测任务的要求,其往往忽略了空间和时间依赖性。在本文中,我们提出了一种新的深度学习框架,时空图卷积网络(STGCN),以解决交…

    人工智能 2023年6月15日
    065
  • Learning算法中常用的特征选择方法有哪些

    特征选择方法在机器学习中的作用 特征选择是机器学习中至关重要的一步,它是从原始数据中选择最重要的特征,以提高模型的准确性、降低训练时间和消除过拟合等问题。在本文中,将详细介绍机器学…

    人工智能 2024年1月1日
    035
  • dataframe普通切片与loc,iloc选取数据

    import pandas as pd import numpy as np url = ‘https://raw.githubusercontent.com/HoijanLai/…

    人工智能 2023年7月7日
    081
  • opencv源码下载编译

    1.源码下载 GitHub – opencv/opencv: Open Source Computer Vision Library 选择需要下载的opencv版本。 …

    人工智能 2023年7月19日
    055
  • Apache shiro框架

    一、初识shiro框架 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何…

    人工智能 2023年6月29日
    084
  • 自适应迁移学习核极限学习机用于预测

    目录 0、前言 1、自适应迁移学习核极限学习机原理 1.1 结构风险最小化 1.2 联合分配 1.3 流行正则化 1.4 核极限学习机模型参数​求解公式 1.5 自适应迁移学习核极…

    人工智能 2023年6月18日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球