算法与设计
NullPointerExcept
这个作者很懒,什么都没留下…
展开
-
BTree,B-Tree,B+Tree,B*Tree都是什么
B 树、 B- 树、 B+ 树、 B* 树都是什么 B 树 即二叉搜索树: 1. 所有非叶子结点至多拥有两个儿子( Left 和 Right ); 2. 所有结点存储一个关键字; 3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B转载 2017-04-12 15:27:33 · 535 阅读 · 0 评论 -
关于索引的B tree B-tree B+tree B*tree 详解结构图
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入...转载 2018-04-17 09:28:05 · 236 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历概念
1.深度优先遍历(DFS)(1)从某个顶点V出发,访问顶点并标记为已访问(2)访问V的邻接点,如果没有访问过,访问该顶点并标记为已访问,然后再访问该顶点的邻接点,递归执行 如果该顶点已访问过,退回上一个顶点,再检查该顶点的邻接点是否都被访问过,如果有没有访问过的继续向下访问,如果全部都访问过继续退回到上一个顶点,继续同样的步骤。深度优先遍历类似于树的先序遍历,深度优先遍历算法结果不唯一。选...转载 2018-04-17 11:11:53 · 1642 阅读 · 0 评论 -
图的遍历之 深度优先搜索和广度优先搜索
深度优先搜索的图文介绍1. 深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中...转载 2018-04-17 11:59:11 · 265 阅读 · 0 评论 -
最短路径之Dijkstra算法
最短路径之Dijkstra算法(看到i,j,k三个变量可以理解为需要三个for循环,方便记忆)本节来学习指定一个点(源点)到其余各个顶点的最短路径,也称为”单源最短路径”。与上篇的Floyed-Warshall算法一样,这里仍然使用二维数组a来存储顶点之间边的关系。如图:(假设我要求的是1号顶点到其余顶点的最短距离) 当然,我们还需要一个dis数组来存储1号顶点到其余顶点的当前距离,如图: 既然...转载 2018-04-17 14:56:46 · 1162 阅读 · 0 评论 -
最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种。看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解。比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优的问题,怎样修才是做好的,如下图:第一个是网全图,后三个图的修路方案都可以1.树的定义:有n个顶点和n-1条边,没有回路的称为树生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是...转载 2018-04-17 15:14:22 · 2732 阅读 · 0 评论 -
算法之详解最小生成树
深入解析最小生成树正文 所谓最小生成树,就是在一个具有N个顶点的带权连通图G中,如果存在某个子图G',其包含了图G中的所有顶点和一部分边,且不形成回路,并且子图G'的各边权值之和最小,则称G'为图G的最小生成树。 由定义我们可得知最小生成树的三个性质: •最小生成树不能有回路。 •最小生成树可能是一个,也可能是多个。 ...转载 2018-04-17 15:16:32 · 711 阅读 · 0 评论 -
堆排序
堆排序算法描述:堆排序是利用数据结构中堆的特性完成排序的算法。堆的定义:堆可以看成是一个完全二叉树,又有一定特性,父节点都大于或小于左右子节点。数学式子表示:1. 若array[0,...,n-1]表示一颗完全二叉树的顺序存储模式,则双亲节点指针和孩子结点指针之间的内在关系如下: 任意一节点指针 i:父节点:i==0 ? null : (i-1)/2 左孩子:2*i + 1...原创 2018-03-29 14:14:59 · 485 阅读 · 0 评论 -
也许,这样理解HTTPS更容易
摘要 本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样。但是这并不代表HTTPS的真实设计过程。在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还原”过程。 我们先不了聊HTTP,HTTPS,我们先从一个聊天软件说起,我们要实现A能发一个hello消息给B: 如果我们要实现这个聊天软件,本文只考虑安全性问题,要实现A发给B的hello消息包,即...转载 2018-04-18 09:30:55 · 160 阅读 · 0 评论 -
LeetCode之两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路一:最直接的思维,两次遍历查询,时间复杂度O(N*N)。代码:public static int[] t...原创 2018-04-18 14:17:21 · 3129 阅读 · 4 评论 -
LeetCode之两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:两个链表同时前移,先加低位的,如果大于10,则注...原创 2018-04-18 16:14:06 · 626 阅读 · 0 评论 -
LeetCode第五题之最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。示例 1:输入: "babad"输出: "bab"注意: "aba"也是一个有效答案。示例 2:输入: "cbbd"输出: "bb" 思路一:暴力寻找。思路二:中心扩展法。思路三:动态规划寻找最长回文字符串利用动态规划来求最长回文字符串经常要借助一个二维布尔数组,如图:每一个dp[i][j]代表图中一个方...原创 2018-04-23 18:31:11 · 361 阅读 · 0 评论 -
LeetCode第三题之无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。示例:给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。思路一:直接暴力求解,把所有的可能子串遍原创 2018-04-19 16:05:45 · 896 阅读 · 0 评论 -
LeetCode第六题之Z字形变换
将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:P A H NA P L S I I GY I R之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"实现一个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s = "PAYPALISHIRING", numRows ...原创 2018-04-24 10:44:32 · 2156 阅读 · 0 评论 -
LeetCode第七题之反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转。示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。思路一:用java自带的StringBuilder的reverse()...原创 2018-04-24 18:11:37 · 1148 阅读 · 0 评论 -
LeetCode第四题之两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。示例 1:nums1 = [1, 3]nums2 = [2]中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]中位数是 (2 + 3)/2 = 2.5 思路一:采用归并排序,然后查找中位数。时间复杂度O...原创 2018-04-20 17:48:20 · 2361 阅读 · 0 评论 -
LeetCode第八题之字符串转整数 (atoi)
实现 atoi,将字符串转为整数。在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。当字符串中的第一个非空字符序列不是个...原创 2018-04-25 11:02:44 · 1148 阅读 · 0 评论 -
Java源码解析-DualPivotQuicksort
前言一直都想阅读一些比较深层次的东西,但是自己的水平还没有达到那个层次,所以从比较基础也是比较底层的Java源码下手。排序应该是使用的比较多,性能比重比较大的算法之一,而快排更是排序中的经典。不论是C++的qsort还是Java的Arrays.sort都是快排实现,我一直很好奇这些语言设计者写出的快排是怎样的,不看不知道,一看吓一跳,果然跟我以前学的快排不一样,我们就来了解一下Java中的快排实现...转载 2018-03-28 15:10:17 · 176 阅读 · 0 评论 -
DualPivotQuicksort两枢轴快速排序
参考jdk DualQuickSort源码 普通快速排序一次把数据划分成两部分,两部分再分别递归,两枢轴,就是两个结点,把数据划分成三部分,三部分再分别递归,可参考下图 left part center part right part +-------------------------------...转载 2018-03-28 14:55:43 · 762 阅读 · 0 评论 -
红黑二叉树详解及理论分析
什么是红-黑二叉树? 红-黑二叉树首先是一颗二叉树,它具有二叉树的所有性质,是一种平衡二叉树。普通二叉树在生成过程中,容易出现不平衡的现象,即使是使用随机算法生成二叉树,也是有一定概率生成不平衡的二叉树. 如下图所示 : 为了解决二叉树的不平衡问题,“大牛”们终于研究出了转载 2017-05-24 18:20:35 · 464 阅读 · 0 评论 -
8大排序算法图文讲解
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文将依次介绍上述八大排序算法。算法一:插入排序插入排序示意图插入排序是一种最简单直观的排转载 2017-05-24 18:21:30 · 310 阅读 · 0 评论 -
[经典]技术面试宝典: 很全面的算法和数据结构知识(含代码)
本文汇总了技术面试时需要了解的算法和数据结构知识。 数据结构部分 链表链表是一种由节点(Node)组成的线性数据集合,每个节点通过指针指向下一个节点。它是一种由节点组成,并能用于表示序列的数据结构。单链表:每个节点仅指向下一个节点,最后一个节点指向空(null)。双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。转载 2017-07-12 09:33:48 · 523 阅读 · 0 评论 -
Bit-map空间压缩和快速排序去重
Bit-map是一种很巧妙的数据存储结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,可以大大节省存储空间。Bit-map在实际中也有着广泛的应用,比如快速排序,元素去重以及空间缩减等等。1. Bit-map的基本思想32位机器上,对于一个整型数,比如int a=1 在内存中占32bit位,这是转载 2017-08-01 09:16:06 · 592 阅读 · 0 评论 -
数据结构和算法:AVL自平衡二叉树
一、二叉树的基础知识1.1 二叉树二叉树(Binary Tree)是n个结点的有限集合,该集合或者为空集,或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成,且二叉树的左右要求是有顺序的。1.1.1 特殊种类的二叉树(1). 斜树:所有的结点都只有左子树的二叉树称为左斜树,所有结点都只有右子树的二叉树称为右斜树。(2). 满二叉树:在一棵二转载 2017-08-04 09:15:10 · 707 阅读 · 0 评论 -
插入排序
插入排序算法描述: 插入排序可以想象成摸扑克牌,第一张当成已经排序好的数组,后续的数据在已经排序好的数组里进行比较然后插入即可。注意总共有Array.length个数据,已经排序好的数组A[1,2...,j-1],剩下要排序的数组B[j,j+1...,Array.length],插入的数组要进行数据的移位操作。时间复杂度:O(n*n),插入排序效率的最好情况运行时间为...原创 2018-03-23 17:38:30 · 137 阅读 · 0 评论 -
冒泡排序
插入排序算法描述:通过循环比较相邻两个元素的大小,大的元素往右移(升序),经过多次循环即完成排序。举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1 第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1 第三次排序:8和2比较,8大于2...原创 2018-03-24 19:16:59 · 146 阅读 · 0 评论 -
归并排序
归并排序算法描述:归并排序,是一种利用分治策略,将一个有n个元素的数组分成两个长度为n/2的数组,然后利用对两个数组进行排序,然后合并。其中两个数组可以利用递归的方法进行继续分割,最终分割成最小单元已排序的数组,然后进行合并。(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)时间复杂度:O(n*lgn),空间...原创 2018-03-25 16:16:03 · 145 阅读 · 0 评论 -
直接选择排序
直接选择排序算法描述:所谓直接选择排序,就是假设有一个长度为n的数组Array,第一次从Array[0]~Array[n-1]中选取最小值,与Array[0]交换,第二次从Array[1]~Array[n-1]中选取最小值,与Array[1]交换,...,第i次从Array[i-1]~Array[n-1]中选取最小值,与Array[i-1]交换,以此类推,总共通过n-1次,得到一个按排序码从小到大...原创 2018-03-25 18:10:26 · 200 阅读 · 0 评论 -
希尔排序
希尔排序算法描述: 希尔排序也叫“缩小增量排序”,是由shell创立,也是插入排序的一种变异。每次设置一定的步长,一般设置delta=Array.length/2,从0开始,组成[0,0+delta,0+delta+delta,...],[1,1+delta,1+delta+delta,...]等子序列,每组子序列进行插入排序,知道最后delta=1,完成一次插入排序即完成最终排序。例如:假...原创 2018-03-26 11:10:28 · 157 阅读 · 0 评论 -
桶排序
桶排序算法描述:桶排序的思想近乎彻底的分治思想。假设现在需要对一百个数进行排序。我们可以将其等长地分到10个虚拟的“桶”里面,这样,平均每个桶只有10个数。如果每个桶都有序了,则只需要依次输出为有序序列即可。具体思路是这样的:1.将待排数据按一个映射函数f(x)分为连续的若干段。理论上最佳的分段方法应该使数据平均分布;实际上,通常采用的方法都做不到这一点。显然,对于一个已知输入范围在【0,100】...原创 2018-03-26 13:58:39 · 264 阅读 · 0 评论 -
计数排序
计数排序算法描述:是一种通过计数来达到排序的方法。1.选出数组的最大值k,创建一个k+1长度的数组countArray,countArray的数组下标代表array数组中的元素值,而countArray中的元素值代表的是array中每一个元素的出现次数。2.遍历array数组,统计每个元素的出现次数。例如array[0]是7,那么countArray[7]++,因为countArray的下标代表a...原创 2018-03-26 15:22:44 · 154 阅读 · 0 评论 -
基数排序
基数排序算法描述:分别比较个位,十位,百位,千位等数据的大小,比较方法依赖其他排序方法,可以计数排序。时间复杂度:O(d(r+n)) 空间复杂度:O(rd+n)注:r代表关键字基数,d代表长度,n代表关键字个数java实现:public static void radixSort(int[] arr, int radix, int d) { int[] tmp = new int[arr.le...原创 2018-03-26 16:09:53 · 255 阅读 · 0 评论 -
JDK中Arrays.sort排序
Jdk7以后,对应基本变量数组采用变异的快速排序方法DualPivotQuicksort,对于对象数组比较由原来的mergeSort改为ComparableTimSort方法,TimSort当数组大小小于32时,采用二分插入排序算法,当大于32时,采用基于块-区run的归并排序。所以TimSort是一种二分插入排序和归并排序的变种算法。对对象进行排序,没有采用快速排序,是因为快速排序是不稳...转载 2018-03-26 17:36:52 · 5018 阅读 · 0 评论 -
二分插入排序
二分插入排序算法描述: 二分插入排序通过从第二个数开始将需要排序的数分为两个部分,左边部分有序,右边部分无序,然后从右边部分第一个数开始,一个一个插入前面有序部分,与直接插入排序唯一不同的是:二分插入排序会先找出左边有序部分的中间值,然后与需要插入的值比较,所以在插入之前,就只需要与左边有序部分的一半值进行比较。因此,在数据量比较大的时候,二分插入排序算法就更加高效,速度更快。时间复杂度:O(n*...原创 2018-03-26 18:07:10 · 295 阅读 · 0 评论 -
快速排序
快速排序算法描述:快速排序又称划分交换排序,首先选择一个"基准"(基准的选择有多种,一般以Array[0]),从数组右边开始j=Array.length-1,j--的寻找小于"基准"数据,从左边i=0,i++的寻找大于"基准"数据,然后让小于"基准"的数据都放在左边,让大于"基准"的数据都放在右边,当i==j时,交换Array[i]与"基准"。这一趟下来数组划分成了两个子序列,这就是分治思原创 2018-03-27 18:36:00 · 195 阅读 · 0 评论 -
LeetCode第九题之回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。进阶:你能不将整数转为字...原创 2018-04-25 11:26:08 · 460 阅读 · 0 评论