数据结构与算法
文章平均质量分 66
介绍常用的数据结构与算法
白夜行515
世界上有两样东西不能直视:一是太阳,二是人心!
展开
-
【剑指offer】51-67题
51.在一个长度为n的数组里的所有数字都在0到n-1的范围内,找出数组中任意一个重复的数字思路:若下标大于length,则减去length,最后再加上length,若下标的数组值大于length,则返回true。或使用辅助空间(HashSet)代码实现:public boolean duplicate(int numbers[],int length,int [] duplication) {原创 2017-11-02 19:26:50 · 6036 阅读 · 4 评论 -
【剑指offer】41-50题
41.输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序思路:定义两个指针,分别递增,寻找和为s的序列。代码实现: public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> arrayList = n原创 2017-11-02 19:25:28 · 3975 阅读 · 0 评论 -
【剑指offer】31-40题
31.求连续子数组(包含负数)的最大和思路:若和小于0,则将最大和置为当前值,否则计算最大和。代码实现:public int FindGreatestSumOfSubArray(int[] array) { if (array == null || array.length == 0) return 0; int cur = array[0]; int gre原创 2017-11-02 19:23:47 · 4579 阅读 · 10 评论 -
【剑指offer】21-30题
21.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路:定义两个栈,一个存放入的值。另一个存最小值。代码实现:public void push(int node) { stack1.push(node); if (stack2.isEmpty()) { stack2.push(node); }else { if (st原创 2017-11-02 19:22:34 · 6241 阅读 · 4 评论 -
【剑指offer】11-20题
11.给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,不需要考虑大数问题思路:不能用==比较两个浮点数是否相等,因为有误差。考虑输入值的多种情况。代码实现:public double Power(double base, int exponent) { double res = 0; if (equal(b原创 2017-11-02 19:21:10 · 8770 阅读 · 7 评论 -
【剑指offer】1-10题
1.赋值运算函数思路:将返回值类型声明为该类型的引用把传入的参数类型声明为常量引用释放实例自身已有的内存判断传入的参数和当前的实例是不是同一个实例2.单例设计模式思路及代码实现请参考:单例设计模式代码实现3.在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从右上角或左原创 2017-11-02 19:18:54 · 31493 阅读 · 13 评论 -
【算法】一致性哈希算法
1.历史一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。2.特点平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都原创 2017-08-02 08:01:08 · 348 阅读 · 0 评论 -
【算法】负载均衡
1.定义负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行,负载均衡基本概念有:实服务、实服务组、虚服务、调度算法、持原创 2017-08-02 07:25:19 · 427 阅读 · 0 评论 -
【算法】RSA加密算法
1.历史RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。2.公钥与密钥的产生假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:随意选择两个大的质数p和原创 2017-08-01 20:35:40 · 499 阅读 · 0 评论 -
【数据结构】红黑树详解
红黑树的定义R-B Tree(Red-Black Tree),又称为“红黑树”,它一种特殊的二叉查找树,也是一种比较高效的平衡查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)红黑树来自平衡查找树中的2-3查找树,这种数据结构在插入之后能够进行自平衡操作,从而保证了树的高度在一定的范围内进而能够保证最坏情况下的时间复杂度。但是2-3查找树实现起来比较困难,原创 2017-07-21 13:20:19 · 642 阅读 · 0 评论 -
【数据结构】hash冲突的解决方法
hash表的定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key),对应关系f 称为散列函数, 又称为哈希( Hash) 函数采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(hash table)散列函数的构造方法1.直接定址法取关键字的某个线性函数值为散列地址 f ( key ) =a原创 2017-07-21 15:01:36 · 1584 阅读 · 0 评论 -
【数据结构】B树、B+树与B*树详解
B树1.B树的定义B树(B-tree)是对2-3树数据结构的扩展,又称为多路平衡查找树,它的一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B树是一种自平衡树数据结构,可以保持数据排序,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构B树针对读写大数据块的系统进行了优化。B树的算法减少定位记录时所经历的中间过程,从原创 2017-07-21 11:05:28 · 3668 阅读 · 0 评论 -
【数据结构】AVL树
1.AVL树的定义平衡二叉树是一种高度平衡的二叉排序树(父节点大于左子树、小于右子树)。平衡二叉树的每一个节点的左子树和右子树的高度差至多等于1 。二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF ,取值为-1,0,或1最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1 的结点为根的子树2.AVL树失衡调整数组a[]={4,5,6,3,2,8,7,0,1}构建一棵AVL原创 2017-07-16 17:26:56 · 580 阅读 · 0 评论 -
【排序算法】简单选择排序
简单选择排序是一种选择排序。1.简单选择排序的定义每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。2.简单选择排序的流程从待排序序列中,找到关键字最小的元素;如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。实例注:红色数字是位置发生变化的数值。原创 2017-07-11 15:07:33 · 674 阅读 · 0 评论 -
【排序算法】冒泡排序
1.冒泡排序的定义冒泡排序( Bubble Sort) 一种交换排序,两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。2.冒泡排序的流程比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到原创 2017-07-11 19:25:47 · 297 阅读 · 0 评论 -
【排序算法】归并排序
1.归并排序的定义归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将原创 2017-07-13 16:01:29 · 438 阅读 · 0 评论 -
【排序算法】直接插入排序
1.直接插入排序的定义每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。2.直接插入排序的流程每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。实例原创 2017-07-11 16:14:00 · 434 阅读 · 0 评论 -
【排序算法】快速排序
1.快速排序的定义快速排序是冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序将数组划分为两个部分,然后分别对两个部分进行排序。将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。快速排序还采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,2.快速排序的基本思想在数组中选择一个基准点,原创 2017-07-13 17:33:11 · 499 阅读 · 0 评论 -
【排序算法】堆排序
1.堆排序的定义堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的升序排序中,需要使用的就是大根堆,因为根据大 根堆的要求可知,最大的值一定在堆顶。2.堆排序的原理原创 2017-07-13 20:48:40 · 374 阅读 · 0 评论 -
【排序算法】折半插入排序
1.折半插入排序的定义 折半插入算法是对直接插入排序算法的改进,它通过“折半查找”在比较区查找插入点的位置,这样可以减少比较的次数,但移动的次数不变。2.折半插入排序的流程把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,插入过程:对于折半插入排序而言,当需要插入第i个元素时,它不会逐个原创 2017-07-14 09:52:33 · 709 阅读 · 0 评论 -
【排序算法】基数排序
1.基数排序的定义基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。基数排序分为:最高位原创 2017-07-14 10:42:50 · 446 阅读 · 0 评论 -
【排序算法】十种排序算法的总结
1.排序算法的分类插入排序:直接插入排序、二分法插入排序、希尔排序。交换排序:冒泡排序、快速排序。选择排序:简单选择排序、堆排序。归并排序基数排序2.插入排序基本思想:依次遍历元素,在已排序的序列中找到合适的位置将当前遍历的元素插入,直到所有元素都已排序。方法:直接插入排序、二分插入排序、希尔排序(1)直接插入排序基本思想:把新的数据插入到已经排好的数据列中。(2)二分排序(折半插原创 2017-07-14 11:28:45 · 491 阅读 · 0 评论 -
【数据结构】线性表的顺序存储结构
1.顺序存储结构的定义在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的。2.顺序存储结构的特点顺序存储结构的主要优点是节省存储空间,因原创 2017-07-15 10:04:45 · 905 阅读 · 0 评论 -
【数据结构】单链表的插入与删除
1.链接存储结构的定义在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点.链式存储结构又分为单链表、双链表、循环链表。2.链式存储结构的特点比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的原创 2017-07-15 10:38:48 · 13334 阅读 · 4 评论 -
【数据结构】循环链表与双向链表
1.双向链表的定义双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。2.双向链表的插入与删除操作插入删除代码实现public class DoubleLinked { private class Node{ public int getData() {原创 2017-07-15 16:21:56 · 851 阅读 · 0 评论 -
【数据结构】栈与队列
1.栈的定义栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。表中没有元素时称为空栈。栈为后进先出(Last In First Out)的线性表,简称为LIFO表。栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中”最新”的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才原创 2017-07-15 19:24:14 · 400 阅读 · 0 评论 -
【数据结构】KMP算法
1.朴素算法朴素算法即暴力匹配算法,对于长度为n的文本串S和长度为m模式串P,在文本串S中是否存在一个有效偏移i,其中 0≤ i < n - m + 1,使得 S[i… i+m - 1] = P[0 … m-1](注:下标从0开始),如果存在则匹配成功,否则匹配失败。由于在匹配过程中一旦不匹配,就要让模式串P相对于文本串S右移1,即i需要进行回溯,其时间复杂度为O(n*m)。代码实现class Vi原创 2017-07-16 09:50:34 · 1164 阅读 · 0 评论 -
【数据结构】二叉树概述
1.树的定义树( Tree’ )是n(n~O) 个结点的有限集。n=O 时称为空树。在任意-棵非空树中: ( 1 )有且仅有-个特定的称为根( Root )的结点: (2) 当n>1 时,其余结点可分为m (m>O) 个互不相变的有限集T1 、T2、……、Tm . 奠中每一个集合本身又是一槐树,并且称为根的子树( SubTree )节点分类结点拥有的子树数称为结点的度(Degree) 。度为0原创 2017-07-16 10:35:00 · 506 阅读 · 0 评论 -
【数据结构】二叉树的前中后序遍历(递归与非递归)
1.前序遍历:根左右若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树, 再前序遍历右子树。前序遍历的顺序为: ABDGHCE I F 。2.中序遍历:左根右若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点) ,中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树中序遍历的顺序为: GDHBAE I CF 。3.后序遍历:左右根若树为空,则空操作返回,否则从左到原创 2017-07-16 11:38:45 · 1426 阅读 · 0 评论 -
【数据结构】图的介绍
1.图的定义图是一种复杂的非线性结构。在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E)2.图的相关概念(1)有向图与无向图有向图:顶点对< x ,y >是有序的;无向图:顶点对< x,y >是无序的。无向图:图中任意两个顶点时间的边都是无向边(顶点Vi到Vj之间的边没有方向)。(原创 2017-07-16 15:22:06 · 531 阅读 · 0 评论 -
【排序算法】希尔排序
1.希尔排序的定义希尔排序(缩小增量排序),是对直接插入排序算法的优化和升级。 2.希尔排序的原理将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,对所有元素进行一次直接插入排序。因此,采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而原创 2017-07-11 17:37:11 · 911 阅读 · 0 评论