![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习笔记
文章平均质量分 65
EnthusiasmsForme
你要默默的努力,然后惊艳自己。
展开
-
算法学习笔记(十三)
栈的例题 实现一个栈,该栈带有出栈、入栈、取最小元素3个方法。要保证这3个方法的时间复杂度是O(1)。 思路一: 1.创建一个整型变量min,用来存储栈中的最小元素。当第一个元素进栈时,把进栈元素赋值给min,即把栈中唯一的元素当做最小值。 2.之后每当一个新元素进栈,就让新元素和min比较大小。如果新元素小于min,则Min等于新进栈的元素;如果新元素大于或等于min,则不做改变。 3.当调用getMin方法时,直接返回min的值即可。 此时,该方法采用临时变量暂存栈的最小值,但是只考虑到了进栈的原创 2021-03-01 16:47:11 · 129 阅读 · 0 评论 -
算法学习笔记(十二)
一、算法例题 有一个单向链表,链表中可能出现环,如下图所示: 那么,如何用程序来判断该链表是否为环链表呢? 方法一: 首先从头节点开始,依次遍历单链表中的每一个节点。每遍历一个新节点,就从头检查新节点之前的所有节点,用新节点和此节点之前所有节点依次比较。如果发现新节点和之前的某个节点相同,则说明该节点被遍历过两次,链表有环,如果之前的所有节点中不存在与新节点相同的节点,就继续遍历下一个新节点,继续重复刚才的操作。如图中所示,当遍历到节点7的时候,从头方位节点5和节点3,发现已遍历的节点中并不存在节点7,则原创 2021-02-26 11:38:47 · 188 阅读 · 1 评论 -
算法学习笔记(十一)
一、桶排序 桶排序同样是一种线性时间的排序算法,类似于计数排序所创建的统计数组,桶排序需要创建若干个桶来协助排序。 桶(bucket) 代表一个区间范围,里面可以装载一个或者多个元素。 假设有一个非整数数列: 如下图 工作原理: 第一步: 创建桶,并确定每一个桶的区间范围。 具体创建多少个桶,如何确定桶的区间范围,有很多种不同的方式,这里创建桶的数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外,前面各个桶的区间按照比例来确定 **区间跨度=(最大值-最小值)/(桶的数量-1)** 第二步: 遍原创 2021-02-25 10:34:50 · 128 阅读 · 1 评论 -
算法学习笔记(十)
线性时间的排序之计数排序 回顾之前的排序: 冒泡排序:在一个数组中,如果左边的大于右边的,则它两互相交换位置。 堆排序:同样也是交换元素的位置 有一些特殊得排序并不基于元素比较,如计数排序、桶排序、基数排序。。 一、初始计数排序 假设数组中有20个随机数,取值范围为0~10,要求用最快得速度把这20 个整数从小到大进行排序。 根据这个有限的范围建立一个长度为11的数组,数组下标从0开始。元素初始值为0. 假设值为: 9,3,5,4,9,1,2,7,8,1,36,5,3,4,0,10,9,7,9 对这个无序的原创 2021-02-24 16:37:05 · 156 阅读 · 0 评论 -
算法学习笔记(九)
一、堆排序 回忆二叉堆的特性: 1.最大堆的堆顶是整个堆中的最大元素 2.最小堆的堆顶是整个堆中的最小元素 以最小堆为例,如果删除一个最小堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2小的元素就会交换上来,成为最大堆的新堆顶。 根据二叉堆的特性,每一次删除旧堆顶,调整后的新堆顶都是大小仅次于旧堆顶的节点,那么反复删除堆顶,反复调整二叉堆,所得到的集合就会成为一个有序集合。 由此可以归纳出堆排序算法的步骤。 1.把无序数组构建成二叉堆,需要从小到大排序,则构建成最大堆;需要从大到小排原创 2021-02-20 16:26:06 · 89 阅读 · 0 评论 -
算法学习笔记(七)
一、快速排序 和冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。不同之处:冒泡排序再每一轮中只把一个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。 关键词:基准元素,比它大,比它小。 这个思路叫分治法。这样的好处右什么呢? 假如一个数列为9个元素。冒泡排序则要比较8轮。每一轮把一个元素移动到数列的一端。,时间复杂度是O(n*2)。 脑补一下图。 在分治法的思想下,原原创 2021-02-18 16:52:25 · 84 阅读 · 0 评论 -
算法学习笔记(六)
根据时间复杂度的不同,可以将排序算法分为三大类: 1,时间复杂度为O(n*n): 冒泡排序 选择排序 插入排序 希尔排序 2,时间复杂度为O(nlogn)的排序算法 快速排序 归并排序 堆排序 3,时间复杂度为线性的排序算法 计数排序 桶排序 基数排序 除此之外其他的排序都是基于传统排序演变的。 其次还可以根据稳定性,分为稳定排序和不稳定排序。 稳定排序:如果值相同的元素在排序后仍然保持着排序前的顺序,则这样的排序算法是稳定排序。 不稳定排序:如果值相同的元素在排序后打乱了排序前的顺序,则这样的排序算法是不原创 2021-02-09 11:02:50 · 96 阅读 · 0 评论 -
算法学习笔记(五)
首先,先回顾队列的特点:先进先出。 1,入队元素放在队尾,出队元素从队头移出。 优先队列: 1,最大优先队列。 2,最小优先队列。 不再组合南浔先入先出的原则。 最大优先队列无论入队顺序如何,都是当前最大的元素优先出队。 最小优先队列无论入队顺序如何,都是当前最小的元素优先出队。 比如最大优先队列中有一元素为9,并且为该队列中最大元素,但是并不是队头元素,但是出队时,仍然让元素9首先出队。最小队列则相反,不论位置在哪儿,最小的优先出列。 2,二叉堆实现优先队列 2.1二叉堆的特性: 最大堆的堆顶是整个堆中的原创 2021-02-08 11:06:40 · 84 阅读 · 1 评论 -
算法学习笔记(四)
一,二叉堆 二叉堆本质上是一种完全二叉树,分为两个类型 1.最大堆。 2.最小堆。 最大堆:最大堆的任何一个父节点的值,都大于或等于它左,右孩子节点的值。 最小堆:最小堆的任何一个父节点的值,都小于或等于它左,右孩子节点的值。 二叉堆的根节点叫做堆顶。最大堆的堆顶是整个堆中的最大元素,最小堆的堆顶是整个堆中的最小元素。 二,二叉堆的操作 1,插入节点 2,删除节点 3,构建二叉堆 此处以最小堆举例: 1.插入节点:当二叉堆插入节点时,插入位置时完全二叉树的最后一个位置。(最后一个位置!!) 此时。若新节点的原创 2021-02-07 10:22:28 · 194 阅读 · 0 评论 -
算法学习笔记(三)
二叉树的遍历 二叉树的遍历不同于数组与链表的遍历,二叉树的遍历从节点之间的位置关系角度来看,可以分为4种遍历。 1.前序遍历。 2.中序遍历。 3.后序遍历。 4.层序遍历。 从更宏观的角度来看,又可以归结为两大类。 1.深度优先遍历(前序遍历,中序遍历,后序遍历) 2.广度优先遍历(层序遍历)。 1.1深度优先遍历: 1.前序遍历。 前序遍历的输出顺序为根节点----左子树----右子树。即从根节点开始,将左边的节点树依次遍历完成之后,再遍历右边的树。遵循全部先左后右的原则,包括子树 如上图所示,前序遍原创 2021-02-05 11:26:56 · 79 阅读 · 0 评论 -
算法学习笔记(二)
一,树 1,什么是树 树类似于家谱或者企业里的职级关系,树是一种非线性数据结构。 树(tree)是n(n>=0)个节点的有限集,当N=0时,称为空树。有如下两个特点: 1.有且仅有一个特定的称为根的节点。 2.当N>1时,其余节点可分为m(M>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。 在上图中5是根节点,1,3,7是树的末端,2,8又是5的子树。树的结构从根节点到叶子节点,分为不同的层级。 树的最大层级数,被称为树的高度或者深度。显然上图的树的高度是3. 二,原创 2021-02-04 15:22:29 · 71 阅读 · 0 评论 -
算法学习笔记(一)
一,队列和散列表 1.双端队列:即可以先入先出,也可以先入后出 2.优先队列:它遵循的不是先入先出,而是谁的优先级最高,谁先出队。 它不属于线性数据结构的范畴,是基于二叉堆来实现的。 3.散列表:也叫哈希表,这种数据结构提供了键和值的映射关系。只要给出key就可以高效的查找到它匹配的value,时间复杂度接近于O(1). 4.哈希函数:在java中常用的集合HashMap。每一个对象都有属于的自己的hashcode,这个hashcode是区分不同对象的重要标识。是一个整型变量。 转换改成数组的下标,最简单的原创 2021-02-03 11:24:08 · 109 阅读 · 0 评论 -
算法学习笔记(八)
一,单边循环法 上一节,我们学习到双边循环法,找到基准元素,与左右两边比较大小,将数列分成两部分。 此节,我们一起来学习什么是单边循环法。 双边循环法虽然直观,但是代码实现相对繁琐。而单边循环法,从名字来看就知道只从数组的一边对元素进行遍历和交换。同样给出以下数列: 4 7 3 5 6 2 8 1 首先,同样也是选择一个基准元素,并设置一个mark指针指向数列的开始位置,这个mark指针代表小于基准元素的区域边界。 基准元素:4 1,接着从基原创 2021-02-19 10:46:39 · 126 阅读 · 0 评论