
算法与数据结构基础
文章平均质量分 75
JeffCoding
热爱移动互联网,热爱安卓,热爱Java
展开
-
二叉排序树的建立和查找(面试常考)
在众多查找方法中,二叉排序树查找是比较好的一种查找,其效率比顺序查找,折半查找,插值查找,斐波纳契查找等都要好。二叉排序树的建立首先要了解而叉排序树如何建立,给定一组数组,建立一个而叉排序树#include <iostream> typedef struct BitNode{ int data; struct BitNode *lchild, *rchild; }BitNode, *B原创 2016-11-07 22:12:59 · 11232 阅读 · 1 评论 -
单链表中实现O(1)时间复杂度删除节点
当删除单链表中某个节点时,一般我们想到的方法是:找到待删节点p的前一个节点q,然后把q的next指针指向p的next节点。q.next = p.next;但这种方法因为需要找到p的前驱节点,遍历时间复杂度O(n)。其实我们的思想被禁锢了,提要说删除节点,其实可以让待删除节点的下一个节点覆盖待删除节点,然后将节点删除就行了,例如: 1->2->3->4->5,要删除3,可以将4赋给3, 1->2-原创 2017-03-22 00:10:22 · 2989 阅读 · 5 评论 -
红黑树精讲
首先需要理清一个概念,二叉树,平衡二叉树(AVL),二叉搜索树 (BST):数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树) 红黑树基于平衡二叉树,它是一个自平衡的二叉搜索树,二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有序或者逆序的数据,那么二叉搜索树的执行速度就变得很慢。因为当插入数值有序时转载 2017-02-11 21:03:40 · 773 阅读 · 0 评论 -
基数排序
基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。它是这样实现的:将所有待比较数值(正整数)统一为同样的数转载 2017-08-08 10:35:26 · 752 阅读 · 0 评论 -
计数排序
计数排序的特征当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合转载 2017-08-08 09:54:29 · 544 阅读 · 0 评论 -
排序算法总结
一、插入排序1. 时间复杂度最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动。因此时间复杂度为O(n) 最坏的情况下:逆序有序,这样每一个元素就需要比较n次,共有n个元素,因此实际复杂度为O(n2) 平均情况下:O(n2)2. 稳定性稳定 在插入排序中,K1是已排序部分中的元素,当K2和K1比较时,直接插到K1的后面(没有必要插到K1的前面,这样做还需要移动!!),因此,转载 2017-03-21 00:25:49 · 430 阅读 · 0 评论 -
2017秋招编程题
1. 01串问题(网易内推批)如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: “1”,”10101”,”0101010”都是交错01串。 小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。 输入描述: 输入包括字符串s,s的长度length(1 ≤ length ≤原创 2017-08-19 23:50:37 · 1144 阅读 · 0 评论 -
清晰理解红黑树的演变---红黑的含义
前言 红黑树,对不少人来说是个比较头疼的名字,在网上搜资料也很少有讲清楚其演变来源的,多数一上来就给你来五条定义,红啊黑啊与根节点距离相等之类的,然后就开始进行旋转、插入、删除这些操作。一通操作下来,连红色和黑色怎么来的,是什么含义,有什么作用都云里雾里的,能搞清楚就怪了。 本文介绍红黑树,暂时不涉及任何代码,只是帮助你理解红黑树的演变来源,树结构中红黑色具体含转载 2017-08-06 16:11:27 · 2109 阅读 · 2 评论 -
经典排序算法:快速排序(Quick Sort)
快速排序算法快速排序算法被称为20世纪十大算法之一,是最重要的算法之一,是一定要掌握和熟练的! 快速排序的基本思想是:通过一趟排序,将无序序列分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小,然后再对这两部分记录分别进行排序,从而达到整个无序序列达成有序。案例分析假如现在我们要对这个序列,{50,10,90,30,70,40,80,60,20}进行快速排序,序列的原始状态是这样的:原创 2016-11-10 13:01:37 · 2258 阅读 · 0 评论 -
经典排序算法:堆排序(Heap Sort)
什么是堆首先堆是一个完全二叉树,但同时他具有这样的要求:每一个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每一个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图是一个大顶堆 在此要补充一个二叉树的性质:二叉树的某个节点下标为i,则它的左孩子的下标一定为2i,右孩子下标一定为2i+1。案列分析假如现在我们要对这个序列,{50,10,90,30,70,40,80,60,20}进行原创 2016-11-09 23:06:06 · 964 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历转载 2017-03-21 21:13:20 · 323 阅读 · 0 评论 -
经典排序算法:冒泡排序(Bubble Sort)
冒泡排序(Bubble Sort)冒泡排序作为排序中的经典算法,其思想是非常具有意义的,同时也是面试官很经常提问面试者的考题。 它的基本思想是:两两比较相邻的记录的关键字,如果反序则交换,知道没有反序的记录为止。案例分析假设我要对这么一个数组进行排序: 9,1,5,8,3,7,4,6,2冒泡图: 冒泡顾名思义就是从下往上冒,因此我们的循环从底开始,即从2开始。第一轮,2先与6比较,2小于6,原创 2016-11-08 20:05:46 · 6857 阅读 · 0 评论 -
查找算法和树总结
查找算法二分查找:主要是利用了树查找的思想,所以时间复杂度为树的深度,树的深度性质:具有n个结点的完全二叉树的深度为[log2n] + 1,由此导出二分查找的时间复杂度为O(logn),最好的情况就是O(1),刚好就在mid位置 二叉排序树查找:最好O(logn),当数据时有序状态,达到最差,称为斜树,所以最差时间复杂度为O(n)哈希查找:如果没有碰撞的时候,时间复杂度为O(1),当数字发生全部碰撞原创 2017-03-21 20:11:08 · 1527 阅读 · 0 评论 -
散列(Hash)建立和查找(面试常考)
散列技术首先要谈谈什么是散列(Hash)技术,散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每一个关键字key对应一个存储位置。散列函数既然散列技术就是值跟地址的映射关系,那么我们的问题就是如何确定这个地址,散列函数就是用来计算散列地址的。散列函数的实现有多种方法,例如直接取址,平方取中法,除留余数法等。在此分析最常用的 除留余数法。 除留余数法基本公式: f(a)原创 2016-11-08 00:32:47 · 729 阅读 · 1 评论 -
经典排序算法:希尔排序(Shell Sort)
希尔排序希尔排序是Shell在1959年提出的一种排序算法,它出现的重要意义在于,之前的排序算法基本都是O(n²),希尔算法是突破这个时间复杂度的第一批算法之一,所以它绝对值得我们了解掌握!希尔排序的基本思想是: 把记录按increment(增量)分组,对每组记录采用直接插入排序方法进行排序。 随着增量逐渐减小,所分成的组包含的记录越来越多,当增量的值减小到 1 时,整个数据合成为一组,构成一组原创 2016-11-09 00:20:53 · 1147 阅读 · 0 评论 -
图的邻接矩阵和DFS遍历
图的存储结构相对于线性表和树来说,是复杂了许多,而不是用一个线性表或者链表就能定义的。对于图来说,它的存储方式有邻接矩阵,邻接表,十字链表,邻接多重表和边集数组。在这里,要介绍的是如果使用邻接矩阵和邻接表来存储图结构。一、邻接矩阵图的邻接矩阵存储是用两个数组来完成的。一个一维数组存储定点信息(称为顶点数组),一个二维数组存储边信息(称为边数组)。 下面介绍不同类型的邻接矩阵的定义。1. 无向图的邻原创 2016-11-23 18:58:52 · 15701 阅读 · 2 评论 -
Abbott的复仇(Abbott's Revenge)BFS算法实现
The questionThe 1999 World FinalsContest included a problem based on a “dicemaze.” At the time the problem was written, the judges were unable todiscover the original source of the dice maze concept. S原创 2016-11-24 00:19:40 · 3225 阅读 · 0 评论 -
图的邻接表和DFS遍历
邻接矩阵和邻接表的对比之前一篇文章我们学习了 图的邻接矩阵和DFS遍历, 邻接矩阵对于图来说是一种很不错的存储结构,但是也有特殊的情况,例如边数很少的时候。此时的邻接矩阵,只有(v0,v1)和(v1, v0)有值,其他都是0或无穷。然而,所以对于邻接矩阵来说,其它的空间都被浪费掉了,图中结点数很少的时候,影响不大,但是对于结点数多,且边数少的时候,性能影响就明显了。所以我们可以考虑另外一种方式,使用原创 2016-11-24 21:52:34 · 12321 阅读 · 0 评论 -
弗洛伊德(Floyd)算法求图的最短路径
弗洛伊德基本思想弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。 基本思想: 弗洛伊德算法定义了两个二维矩阵: 矩阵D记录顶点间的最小路径 例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10; 矩阵P记录顶点间最小路径中的中转点 例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:原创 2016-11-26 11:44:02 · 150705 阅读 · 68 评论 -
贪心算法 迪杰斯特拉算法求最短路径
之前我们学习过弗洛伊德算法求最短路径,但是使用了三重循环,导致时间复杂度是O(n^3),而迪杰斯特拉算法应该是求最短路径的最好的算法了。迪杰斯特拉算法原理迪杰斯特拉算法实际上是使用贪心算法和bfs来求最短问题的,它的核心思想是,按照顶点来迭代,每一次迭代挑选当前离源点最短的路径(贪心思想),然后以挑选的这个最短路径的顶点作为源点,再发起贪心选择当前离源点最短的路径。它的核心实现使用了三个数组: d原创 2016-12-11 14:19:47 · 12295 阅读 · 2 评论 -
算法入门实例(一)
一:蛇形填数在n*n的矩阵中,填入矩阵维度,然后形成一个蛇形矩阵,例如,当填入维度为4时,形成的蛇形矩阵: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4思路分析可以想象对这个蛇形矩阵的绘制时,是在绘制一条路。笔的起点是在第一行的最后一列。笔的轨迹是下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。那么关键点原创 2016-11-16 00:44:58 · 605 阅读 · 0 评论 -
前k小、前k大算法
问题面试常考的问题,给定一个数组,求前k小或者前k大。 解法: 1. 快速排序 2. 堆排序 3. 冒泡排序解法(前k大和前k小思路相反,只说前k大情况)1. 快速排序利用partition分割成两个数组left[] 和 right[]如果此时分割点mid,小于k,说明left中都是前k大的,而且还要在right中取(k-mid)个数如果mid大于k,说明前k大的数全部在left中,然原创 2017-03-20 20:31:31 · 5263 阅读 · 0 评论 -
经典排序算法:归并排序(Merging Sort)
public class MergeSort { public void sort(int[] array, int start, int end, int[] tmp) { if (start < end) { int mid = (start + end) / 2; sort(array, start, mid, tmp原创 2017-03-20 23:59:38 · 767 阅读 · 0 评论