![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
红鱼鱼
这个作者很懒,什么都没留下…
展开
-
数据结构之通俗易懂的堆
1.堆的简介堆(Heap)是一个可以被看成近似完全二叉树的数组。树上的每一个结点对应数组的一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。堆包括最大堆和最小堆(又称大小顶堆):最大堆的每一个节点(除了根结点)的值不大于其父节点;最小堆的每一个节点(除了根结点)的值不小于其父节点。 堆和完全二叉树最主要的区别是堆是用数组来实现的,上图红色编号即为数组下标,满足如下关系:最大堆:arr[i]>=arr[2*i+1]&&arr[...原创 2020-06-30 21:14:32 · 668 阅读 · 0 评论 -
二叉树的遍历汇总,刷题必备
1.简介二叉树的遍历主要分为深度优先遍历和广度优先遍历两大类,其中深度优先遍历又分为前序遍历、中序遍历、后序遍历。我们以下面这棵树来具体说明这些遍历之间的区别。 广度优先遍历:从左到右依次遍历每一层,即按1 2 3 4 5 6顺序遍历。前序遍历:先遍历父节点,再遍历左子树,最后遍历右...原创 2020-05-16 19:52:23 · 1779 阅读 · 6 评论 -
二叉树的Morris遍历——传说中的神级遍历算法
常用的二叉树遍历主要分为深度优先遍历(dfs)和广度优先遍历(bfs),其中dfs又有前序、中序、后序遍历之分。然而不管你用迭代还是递归的方法实现,它们的空间复杂度都为O(N)。而本文介绍的Morris算法,只需O(1)的空间复杂度,本质上是使用时间换取空间的一种方法。假设我们要遍历如下二叉树: 如果采用中序遍历,那么遍历顺序应该为1 2 3 4 5 6 7 8 9 10,...原创 2020-04-06 22:10:04 · 472 阅读 · 1 评论 -
有趣的约瑟夫问题
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因...原创 2020-04-01 22:17:06 · 320 阅读 · 1 评论 -
回溯与递归的区别
递归算法是为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来定义自己的方法,称为递归定义。比如最出名的一个问题,求斐波那契数列的第i位,如果用递归算法做,就需要不断递归得到前两位的值。而回溯算法的本质是为了得到可能存在的所有情况,当一个分支走到底之后,就返回顶点继续遍历下一个分支。在这个返回顶点的过程,就需要不断调用自身函数,这里的调...原创 2020-03-15 15:42:17 · 1683 阅读 · 2 评论 -
三道题弄懂回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。回溯算法的基本思想是:从一条路往前走,能进则进,不...原创 2020-03-14 22:29:53 · 328 阅读 · 2 评论 -
摩尔(Boyer-Moore)投票法
该算法用来寻找一个数组中出现次数超过1/k的元素,易得满足要求的元素最多有k-1个。摩尔投票法分为两个阶段:抵消阶段和计数阶段。抵消阶段:两个不同投票进行对坑,并且同时抵消掉各一张票,如果两个投票相同,则累加可抵消的次数;计数阶段:在抵消阶段最后得到的抵消计数只要不为0,那这个候选人是有可能超过一半的票数的,为了验证,则需要遍历一次,统计票数,才可确定。我们通过下面两道题来深入理解这个...原创 2020-03-11 21:46:51 · 1020 阅读 · 0 评论 -
BFPRT算法(TOP-K问题)
这个算法第一次我是在sift源码里面看见的,之前一直不知道叫什么名字,知道无意间看到一篇博客,才发现了BFPRT的大名。这个名字就挺奇怪的,那是因为该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出,所以就叫BFPRT。。。此算法可以用来求元素中第k大(或小)的值或是前k大(或小)的值。个人感觉它是对快速选择算法的一种改进,快速选择算法又是基于快速排序的思想。因此本文从快...原创 2020-03-02 09:37:20 · 879 阅读 · 3 评论 -
排序算法总结(二)——O(nlgn)时间复杂度排序
希尔排序我们前面讲的直接插入排序, 应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。可问题在于,两个条件本身就过于苛刻,现实中记录少或者基本有序都属于特殊情况。有条件当然是好,条件不存在,我们创造条件也是可以去做的。于是科学家希尔研究出了一种排...原创 2019-11-27 20:53:44 · 3901 阅读 · 0 评论 -
排序算法总结(三)——非比较排序
计数排序计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列...原创 2019-11-26 20:51:23 · 458 阅读 · 0 评论 -
排序算法总结(一)——O(n)时间复杂度排序
冒泡排序初级版冒泡排序冒泡排序(Bubble Sort) 一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。冒泡的实现在细节上可以有很多种变化,我们将分别就3种不同的冒泡实现代码,来讲解冒泡排序的思想。这里,我们就先来看看比较容易理解的一段。void bubble_sort0(int a[],int n) { for (int i = ...原创 2019-11-21 16:56:38 · 738 阅读 · 0 评论 -
哈希表(散列表)基础知识总结
目录1.散列表概述1.1散列表查找定义1.2散列表查找步骤2.散列函数的构造方法2.1直接定址法2.2数字分析法2.3平方取中法2.4折叠法2.5除留余数法2.6随机数法3.处理散列冲突的方法3.1开放定址法3.2再散列函数法3.3链地址法3.4公共溢出区法4.散列表查找实现4.1散列表查找算法实现4.2散列表查找性能分析...原创 2019-11-05 20:44:18 · 1921 阅读 · 0 评论 -
链表基础知识总结
链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。尽管两种结构都可以用来存储一系列的数据,但又各有各的特点。数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组中的第4个数据)的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但是,这种时间上的便利性,是因为数组在内存中占用了连续的空间,在进行类似的查找或者遍历时,本质是指针在内存中的定向偏移。然而...转载 2019-11-03 21:05:20 · 450 阅读 · 0 评论 -
动态规划详解
本文对原博客做了少量修改,包括个别错误的地方。代码改为了c++实现,原文使用的Java。1.动态规划介绍已知问题规模为n的前提A,求解一个未知解B。(我们用An表示“问题规模为n的已知条件”)此时,如果把问题规模降到0,即已知A0,可以得到A0->B.如果从A0添加一个元素,得到A1的变化过程。即A0->A1; 进而有A1->A2; A2->A3; …… ...转载 2019-11-01 19:04:01 · 387 阅读 · 0 评论 -
快速选择算法
简介在构造kd-tree中,我们需要对方差最大维度上的中位数进行计算。中位数计算方法的好坏一定程度上影响了树的构造时间。要计算中位数,我们一般想到的是将数据进行排序,然后取中间的数。排序算法最快的时间复杂度为O(nlogn)。但是实际上我们要求中位数,不需要将所有数据进行排序,有的排序步骤是无用的。所以有了选择算法,其平均时间复杂度为O(n),最坏时间复杂度为O(n2)。在Rob Hess 的s...原创 2019-10-23 12:16:00 · 11438 阅读 · 2 评论 -
kd树(K-dimensional tree)
kd-tree简介Kd-Tree(K-dimensional tree),是一种高维索引树形数据结构,经常使用于在大规模的高维数据空间进行最近邻查找,比如图像检索和识别中的高维图像特征向量的K近邻查找与匹配(查找与所给数据最接近的k个数)。kd树结构类似于高维的二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分。kd-t...原创 2019-10-21 20:59:43 · 10295 阅读 · 2 评论