算法章节 递归、排序、⼆分查找

递归

概念与特性函数调⽤函数⾃身的编程⽅式叫做递归,调⽤为”递“,返回为”归“
三个条件1. ⼀个问题的解可以分解为多个⼦问题的解;
2. 分解之后的⼦问题,除了数据规模不同,求解思路跟原问题相同;
3. 存在递归终⽌条件;
编程技巧1. 寻找将⼤问题分解为⼩问题求解的规律;
2. 找出递推公式终⽌条件,将其直接翻译成代码;
3. 切记不要⼈⾁⼀层⼀层的递归;
换句话说,也就是:如果⼀个问题A可以分解为若⼲⼦问题B、C、D,我们可以假设⼦问题B、C、D已经解决,在此基础上思考如何解决问题A。
我们只需要思考问题A与⼦问题B、C、D两层之间的关系即可,不需要⼀层⼀层往下思考⼦问题与⼦⼦问题,⼦⼦问题与⼦⼦⼦问题之间的关系。
 
应⽤场景递归是⼀种应⽤⾮常⼴泛编程技巧,很多数据结构和算法的编码实现都要
⽤到递归,⽐如快排、归并排序、DFS(深度优先搜索算法)、⼆叉树遍历、回溯等
其他知识点1. 避免堆栈溢出(限制调⽤层次;递归改为迭代;尾递归优化);
2. 避免重复计算(利⽤备忘录);
掌握程度

1. 熟练编写斐波那契数列、全排列、⼋皇后、快速排序;归并排序、DFS、⼆叉树遍历、链表反转递归实现等;
2. 掌握递归算法的时间、空间复杂度分析;其中时间复杂度通过递推公式或者递归树来分析;空间复杂度跟递归函数调⽤栈深度成正⽐; 

排序

概念与特性1. 稳定性:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变;
2. 原地:不额外申请⾮常量级的空间来临时存储排序数据;原地排序算法并不⼀定空间复杂度是O(1),空间复杂度是O(1)的排序算法⼀定是原地排序算法,⽐如快速排序是原地排序算法,但因为⽤到递归,函数调⽤栈会消耗⾮常量级的空间,所以,空间复杂度并⾮O(1),是O(logn)。
O(n^2)冒泡排序冒泡排序是稳定原地排序算法。 整个冒泡排序过程包含多遍冒泡操作。每次冒泡操作都会遍历整个数组,依次对相邻的元素进⾏⽐较,看是否满⾜⼤⼩关系要求,如果不满⾜,就将它们互换位置。⼀次冒泡操作会让⾄少⼀个元素移动到它应该在的位置,重复n次,就完成了n个数据的 排序⼯作。
插⼊排序插⼊排序是稳定原地排序算法。⾸先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有⼀个元素,就是数组中的第⼀个元素。插⼊算法的核⼼思想是取未排序区间中的元素,在已排序区间中找到合适的插⼊位置将其插⼊,并保证已排序区间数据⼀直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
选择排序选择排序算法是⾮稳定原地排序算法。其实现思路有点类似插⼊排序,也分已排序区间和未排序区间。
但不同点在于,选择排序算法每次会从未排序区间中,找到最⼩
的元素,将其放到已排序区间的末尾。
O(nlogn)快速排序快速排序是⾮稳定原地排序算法。空间复杂度是O(logn)。 如果要排序数组中下标从p到r之间的⼀组数据,我们选择p到r之 间的任意⼀个数据作为pivot(分区点),然后,遍历p到r之间 的数据,将⼩于pivot的放到左边,将⼤于pivot的放到右边,将 pivot放到中间。经过这⼀步骤之后,p到r之间的数据就被分成 了三个部分。假设pivot现在所在位置的下标是q,那p到q-1之 间数据都⼩于pivot,中间是pivot,q+1到r之间的数据都⼤于 pivot。根据分治、递归的处理思想,我们递归排序下标从p到 q-1之间的数据和下标从q+1到r之间的数据,直到区间缩⼩为 1,就说明所有的数据都有序了。
递推公式:quickSort(p…r)=quickSort(p…q-1) & quickSort(q+1…r)
归并排序归并排序是稳定⾮原地排序算法。空间复杂度是O(n)。 如果要排序⼀个数组,我们先把数组从中间分成前后两部分,然后,对前后两部分分别排序,再将排好序的两部分合并在⼀起,这样整个数组就都有序了。递推公式:mergeSort(p…r)=merge(mergeSort(p…q), mergeSort(q+1… r))
O(n)桶排序桶排序,顾名思义,会⽤到“桶”,核⼼思想是将要排序的数据分到⼏个有序的桶⾥,每个桶⾥的数据再单独进⾏排序。桶内排完序之后,再把每个桶⾥的数据按照顺序依次取出,组成的序列就是有序的了。要排序的数据需要很容易就能划分成m个桶,并且,桶与桶之间 有着天然的⼤⼩顺序。这样每个桶内的数据都排完序之后,桶与桶之间的数据不需要再进⾏排序。
计数排序

实际上,计数排序是桶排序的⼀种特殊情况。当要排序的n个数据,所处的范围并不⼤的时候,⽐如最⼤值是k,我们就可以把数据划分成k个桶。每个桶内的数据值都是相同的,省掉了桶内排序的时间。

基数排序基数排序对要排序的数据也是有要求的,需要可以分割出独⽴的“位”来⽐较,⽽且位之间有递进的关系:如果a数据的⾼位⽐ b数据⼤,那剩下的低位就不⽤⽐了。除此之外,每⼀位的数 据范围不能太⼤,可以使⽤其他线性排序算法来排序,否则,基数排序的时间复杂度就⽆法做到O(n)了。
应⽤场景⼯程中的排序函数⼀般使⽤O(nlogn)的快排、归并或者堆排序作为主排序算 法,当数据规模较⼩时,转⽽选择使⽤更加简单的插⼊排序。
其他知识点

为了避免快速排序时间复杂度退化为极端情况O(n^2),我们使⽤更加⾼级的 分区点选择⽅式,⽐如三数取中法、随机法等。

掌握程度1. 熟练掌握冒泡、插⼊、选择、快速、归并排序的原理、代码实现;
2. 熟练掌握快速、归并排序的时间和空间复杂度分析;
3. 掌握桶排序、计数排序、基数排序的原理

⼆分查找

概念与特性⼆分查找针对的是⼀个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对⽐,将待查找的区间缩⼩为之前的⼀半,直到找到要查找的元素,或者区间被缩⼩为0。
操作与复杂度⼆分查找的时间复杂度是O(logn)
⼆分查找变体变体⼀:查找第⼀个值等于给定值的元素
变体⼆:查找最后⼀个值等于给定值的元素
变体三:查找第⼀个⼤于等于给定值的元素
变体四:查找最后⼀个⼩于等于给定值的元素
掌握程度熟练掌握⼆分查找、⼆分查找变体的代码实现

相关图片

 

参考链接

  • 菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces 50A-C语言解题报告

50A题目网址 解题报告-others 题目解析 1.输入n x m大小的木板,使用21大小的多米诺去填满,求最多的多米诺数目 2.通过分析把木板分为奇数和偶数的情况 1)有一边是偶数的情况: 使用2去填满 2)两个边都是奇数 奇数-1偶数 还是让木板的(奇数-1)边去和2平行,再加上 (m-1)/2(n/1)…

Java命令:jps — 查看进程信息

文章目录一、简介二、常用命令1、jps2、jps -l3、jps -q4、jps -m5、jps -v6、jps失效一、简介 JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 功能: 显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启…

操作系统概述 记录操作系统相关知识

操作系统 现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。上面提到的这些东西都属于硬件资源,用户不会直接和硬件进行交互,计算机安装了一层软件,这层软件能够通过响应用户输入的…

JDK工具使用大全

文章目录一、简介一、简介 在JDK的bin目录下有很多命令行工具: 常用工具使用详解如下: Java命令:jps — 查看进程信息 Java命令:jstack — 获取线程dump信息 Java命令:jmap — 打印指定进程的共享对象内存映射或…

Linux进程 excel族函数的用法

介绍 使用fork创建一个进程之后,经常会在新进程中调用exec函数执行别的程序当前进程调用exec函数之后,这个进程会被完全替代换成新的程序,即便如此仍然是同一个进程,进程ID不变函数族 execl execlp execle execvp execvpe头文件 …

C++primer 12章 动态内存和智能指针

C引入智能指针的目的 使用智能指针来管理动态分配的对象,当一个对象应该被释放的时候,指向他的智能指针确保自动释放它 内存分配 静态内存:局部static对象、类static数据成员、定义在任何函数之外的变量栈内存:定义在函数内的非…

Mac下iTerm2的安装与配置

目录一、iTerm2简介二、下载以及安装三、iTerm2主题配置四、配置Oh My Zsh1、安装方式(1)一键安装(2)手动安装3、切换zsh4、修改主题五、配置Meslo字体六、声明高亮七、自动建议填充八、iTerm2快速隐藏和显示九、iTerm2隐藏用户名…

Java命令:jinfo — 查看进程参数

目录一、简介二、常用命令1、jinfo -flags pid : 打印当前指定java进程中已经设定的所有JVM参数信息2、jinfo -flag pid : 打印指定名称的参数3、jinfo -flag [|-] pid : 打开或关闭参数4、jinfo -sysprops pid : 打印当前java进程中设定的系统环境参数一、简介 jinfo 是 JDK …

C++primer第八章 IO库 8.1 IO类

IO库设施 istream (输入流)类型,提供输入操作。ostream (输出流)类型,提供输出操作。cin,—个 istream对象,从标准输入读取数据。cout, 一个ostream对象,向标准输出写入数据。cerr…

2014年英语一作文partB漫画作文

题目 Write an essay of 160-200 words based on the following drawing.In your essay you should describe the drawing brieflyexplain its intended meaning,give your comments 做题点 1.使用三段式,第一段:图片内容;第二段:图片暗示;第三段:写自己的评论 2.描述图片…

Spring Cloud 系列之 Nacos 配置中心

目录一、Nacos简介二、Nacos安装及配置1、环境准备2、安装包下载(1)源码方式(2)发行包方式3、启动Nacos服务4、Nacos数据库配置(1)MySQL数据源(2)初始化 MySQL 数据库(3&…

C++primer第八章 IO库 8.2 文件输入输出

8.2文件输入输出 头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件。在17.5.3节中(第676页)我们将介绍如何对同一个文件流既读…

SpringBoot 集成 Nacos

目录一、前言二、Nacos集成1、引入Nacos依赖2、设置Nacos配置3、加载Nacos配置中心配置项4、Nacos集成验证5、Nacos配置中心配置项动态生效Nacos安装详见:Spring Cloud 系列之 Nacos 配置中心 一、前言 上一篇已经讲解了怎样安装安装、启动、配置 Nacos&#xff0c…

C++primer第八章 IO库 8.3string流

8.3string流 sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream既可从string读数据…

英语口语海报演讲--东软

海报 海报上的内容 Nuclear waste water 1.Damage the devastating impact of nuclear radiation on the world 2.Marine life genetically mutated or dead 3.water resources polluted water resources 4.the future of humanity genetic damage/food and environment destr…

C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览

一个容器就是一些特定类型对象的集合。顺序容器(sequentialcontainer)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。与之相对的,我们将在第11章介绍的有序和无序关联容器,则根据…

C++primer第九章 顺序容器 9.3 顺序容器操作

9.3顺序容器操作 顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到了元素如何存储、访问、添加以及删除。上一节介绍了所有容器都支持的操作(罗列于表9.2(第295页))。本章剩余部分将介绍顺序容器所特…

C++primer第九章 顺序容器 9.4 vector对象是如何增长的

为了支持快速随机访问,vector将元素连续存储,每个元素紧挨着前一个元素存储。通常情况下,我们不必关心一个标准库类型是如何实现的,而只需关心它如何使用。然而,对于vector和string,其部分实现渗透到了接口中。假定容器…

C++primer第九章 顺序容器 9.5 额外的string操作

除了顺序容器共同的操作之外,string类型还提供了一些额外的操作。这些操作中 的大部分要么是提供string类和C 风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本。标准库string类型定义了大量函数。幸运的是,这些函数使用了重复的…

Zookeeper Mac下安装操作

目录一、下载Zookeeper二、修改配置1、设置启动配置文件2、修改配置三、启动Zookeeper服务命令1、bin目录下执行(1)启动Zookeeper命令(2)查看Zookeeper状态命令(3)停止Zookeeper命令2、配置环境变量执行&am…