- 博客(37)
- 资源 (3)
- 收藏
- 关注
原创 树与二叉树
树的概念为了解释树的概念,我们用一幅图来说明:父节点:A节点就是B节点的父节点。子节点:B节点就是A节点的子节点。兄弟节点:B、C、D三个节点的父节点是同一个节点A,所以它们之间就是互为兄弟节点。根节点:没有父节点的节点,比如E就是根节点。叶子节点:又叫叶节点,没有子节点的节点就是叶子节点或叶节点,比如G、H、I、J、K、L都是叶子节点。节点高度:就是节点到叶...
2019-08-30 16:19:06 282
原创 Hash算法及其应用
Hash算法其实hash和散列表示的一个意思,所以hash表就是散列表,hash算法就是散列算法,hash函数就是散列函数。这说的hash算法,什么是hash算法?有一句很easy的总结:将任意长度的二进制串映射为固定长度的二进制串,这个映射规则就是hash算法。通过映射之后得到固定长度的二进制串值就是hash值。工业界的hash算法有很多比如md5、sha等。ps:hash算法无...
2019-08-30 14:43:40 537
原创 散列表-LRU缓存淘汰算法
LRU缓存淘汰算法,也就是最近最少使用缓存淘汰策略实现的算法。这里我们使用散列表和链表实现提高操作的时间复杂中度,达到O(1)
2019-08-30 14:07:32 364
原创 查找算法-跳跃表(SkipList)入门及复杂度分析
什么是跳表对于单链表这种数据结构,如果我们想查找一个结点需要从头到尾遍历所有结点,时间复杂度为O(n)效率非常低效。如果我们想办法在单链表的一些结点上加索引呢?如图图中原始链表每隔2个节点就抽出一个结点作为索引,抽出的这一层我们称之为“索引层”,第一层索引层我们称之为第一层索引。就比如我们想此时要查找10这个节点,我们需要遍历6个节点就可以找到。如果再抽取一个索引层...
2019-08-28 17:37:57 3812
原创 查找算法-二分查找的几种变体
唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》第三卷中说:“尽管第一个二分查找算法出现于1946年,然而第一个完全正确的二分查找算法直到1962年才出现。”
2019-08-28 11:17:57 328 1
原创 查找算法-有序数组的二分查找
二分查找的思想二分查找,在一个数组有序(比如从小到大)的情况下,如果想查找某个数值是否存在于数组中,这个时候就可以使用二分查找了。具体做法就是找出数组的中间下标的元素,然后拿查找值与其比较,如果查找值小于中间元素值,则缩小查找范围在小于中间元素的范围查找;否则,在大于中间元素值得范围查找。一直到找到查找值,或者区间缩小为0.图解:代码可以使用循环来实现,也可以使用递归。...
2019-08-27 16:37:26 3176
原创 排序算法-基数排序的时间复杂度分析
基数排序的思想基数排序,基数排序的思想是把位数相同的一组数组依次从后往前比较其每一位上的大小,经过几轮比较使得数据达到有序的做法。比较的次数跟数据的位数有关系。比如要比较一组手机号码从小到大排列,可以比较手机号每一位大小,然后比较11次,手机号达到有序。注意:基数排序每次位的比较可以使用线性排序的方式,比如桶排序或者计数排序,因为它们的时间复杂度为O(n),而且每轮的比较需要保证每次比较数...
2019-08-26 16:46:06 11413
原创 排序算法-计数排序的时间复杂度分析
计数排序的思想计数排序,当数据范围max不大的时候,可以使用一个长度为max+1,即[0,max]的数组用以存储数据出现的次数。根据这个数据出现的次数,通过一定的计算,就可以知道这个数据之前到底有多少个数据,那么自然就很容易知道这个数据在总体数据中的位置了。利用这个思想,我们就可以对一个范围不大的数组进行计数排序。计数排序的时间复杂度计数排序的时间复杂度是O(n),当然这个前提是数据范...
2019-08-26 15:45:58 3606
原创 排序算法-桶排序的时间复杂度分析
桶排序思想桶排序,是一种基于非比较的排序方式,时间复杂度O(n),因此它是是属于一种“线性排序”。思想:桶排序的思想是将一组数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。每个桶内都排序完成后,再加上本身桶之间已经是有序的,那么按照桶的顺序依次取出每个桶内的数据,最终组成的序列就是有序的。桶排序的时间复杂度分析:假如排序数组的元素个数为n,均匀分布在个数为m的桶中,那么每...
2019-08-26 14:05:36 12894 2
原创 在O(n)的时间复杂度内查找第K大的元素
这道题目其实是快速排序算法的一个延伸,如何做到在O(n)的时间复杂度内查找数组内第K大的元素?学习过快速排序就知道,快排每次分区会把数据分为三个部分,a[0,p-1],a[p]以及a[p+1,n-1]三个区间。每次分区我们都将大于分区点元素放置在分区元素左边,小于分区元素的统一放到分区元素右边,那么这样一来,我们就可以利用快速排序实现从大到小的数组排序了。但是,这里说这个不是为了排序,而是想说...
2019-08-24 23:58:51 629
原创 排序算法-快速排序的时间复杂度分析
快速排序的思想是在数组[p,r]中选择一个分区点q,将数组一分为2,同时将小于分区点的数值的放到分区点左侧[p,q-1],大于分区点的数值的放到分区点右侧[q+1,r],重复这个过程。快速排序也是用到了分治思想和递归实现方式,这一点跟归并排序是一样的,但是快速排序的实现跟归并是完全不一样的。归并排序是先分解再合并,从下到上解决问题。快速排序是从上到下进行分区实现排序。俯视这个过程像是层...
2019-08-23 23:36:45 8465
原创 ♫大道至简之算法狂想.
一直相信,大道至简。站在佛家的角度,这个世界无非是成、住、坏、空。于是想当然觉得,这个世界上的一切事情,无非都是增删查改。哪怕是学习数据结构与算法这门课,这种思想都一直在潜移默化中引导着我,甚至是从事了多年的程序开发。我从未怀疑过这点,因为毕竟这6年中,做的东西无论是简答或复杂其实都是增删查改。但是,面对数据结构和算法这门课,我的观点动摇了!面对数据结构,算法们除了对其做增...
2019-08-22 20:58:34 356 4
原创 排序算法-选择排序的时间复杂度分析
选择排序思想跟插入排序很像,也将数组分为未排序区间和已排序区间。不同的是,选择排序是将未排序区间中选择一个最小值放在已排序区间的后边。跟插入排序不同,不需要不停往后移动数据,选择排序直接替换最小值到指定位置即可。代码也很简单: /** * 选择排序 * @param a * @param n */ public static void ...
2019-08-22 20:29:59 7216
原创 排序算法-插入排序的时间复杂度分析
插入排序的原理是,将数组分为已排序区间和未排序区间两部分,从未排序区间中依次取元素跟已排序区间的元素一一对比,找到适合插入的位置。对于任何数据结构和算法的学习,要充分理解数据结构本身的特点以及熟练数据结构的各种操作(比较、移动方式等)
2019-08-22 18:07:44 20319
原创 排序算法-冒泡排序的时间复杂度分析
冒泡排序算法是一种基于比较的排序算法,每次冒泡过程,都会有一个数据确定位置。经过n次冒泡后,就有n个数据确定了位置。如图所示,对数组[4,5,6,3,2,1]进行冒泡排序。起初,按照最原始的想法,代码是这样写:/** * 冒泡排序算法 * @param arr * @param n */ public static void bub...
2019-08-22 16:27:40 26556
原创 求众数
求众数的方法有很多,这里主要说明的是暴力破解法和hash表两种方法来实现。什么是求众数?在leetCode上169题有这个定义。给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例1:输入: [3,2,3]输出: 3示例2:输入: [2,2,1,1,1,2,2]...
2019-08-22 10:21:03 1131
原创 三数之和(Three Sum)
取自leetCode第15题,三数之和。给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1...
2019-08-21 23:58:45 1005
原创 数组-动态扩容+增删改查操作+合并有序数组
这一篇我们来主要演示数组相关的练习,这里主要涉及数组的动态扩容、数组的增删改查操作以及合并两个原本有序的数组为一个新数组。数组动态扩容需求:支持数组的尾部插入、按照index位置插入,当数组容量满后将数组扩容为原来的两倍,并迁移原来的数组数据到新的数组中。这里我将数组的增删查改操作和数组的扩容放到一个代码中。package com.study.algorithm.array;/*...
2019-08-21 16:36:50 463
原创 图解-环形队列的实现及阻塞队列
如果我们使用数组来实现队列,当队列尾部没有空闲空间时,即便整个队列有空闲空间,新数据也将无法入队。除非采用“数据搬移”的方法,将队尾的数据全部搬移到队列头部,这样队列尾巴才有空间可以进行入队操作。那么,有没有别的办法呢?这里就用到了环形队列。
2019-08-20 17:01:12 1493
原创 合并两个有序单链表
首先了解下合并有序的链表的思想* 思想:两个有序的链表进行合并,使用两个指针分别指向链表的头结点,* 比较两个节点的最小值,作为新链表的头结点,然后移动找到最小值的那个链表的指针向后移一位。继续比较取得最小值,将最小值插入到新链表的后边,继续移动找到最小值的那个链表的指针,向后移动一位。直到其中一个链表指针指向为空。将另外一个非空链表直接插入到新链表的后边。这里贴一下思路,画图其实是...
2019-08-19 15:29:21 655
原创 判断一个单链表中是否含有“环”
判断单链表是否有环的问题,其实也可以使用快慢指针来解决,思想也是非常简单。不知道你发现没有,其实快慢指针就是解决问题的思路,你能否想到这个思路呢?到底思路从哪里来?我觉得这是一个值得思考的问题,比如我们处理过类似问题可以获得思路,我们脑海中突发灵感可以获得思路。除了这里提到的经验、灵感,你还能从哪里获得思路呢?说下这个问题的解法:判断一个单链表中是否含有环:思想:使用快和慢两...
2019-08-19 11:32:12 219
原创 单链表删除倒数第N个节点
难度:两星如何删除单链表得倒数第N个节点?这里依然利用快慢指针的办法,让slow指针指向第一个节点,让fast指针和slow间隔N个节点,即指向第N个节点。然后同时移动slow和fast,每次前进一步,直到fast指针到最后一个指针,此时slow指针就是倒数第N个节点,是不是觉得很巧妙?这里找到了第N个节点之后需要删除掉这个节点,那么因为是单链表,我们必须保留被删除节点之前的这个节点,以及被删...
2019-08-16 17:27:38 382
原创 单链表求中间节点
难度:两星单链表求中间节点分为两种情况:1 单链表长度为奇数时,如abcde,那么中间节点就是c。2 单链表长度为偶数时,如abcdef,那么中间节点有两个c和d。本文简单起见就取第二个中间节点。思想:其实思想很简单,其实就是跟《判断单链表存储的字符串是否为“回文串”》中求中间节点的方法一模一样,使用快慢指针来求解。理解了思想,代码就很容易实现了,这里直接贴上来。pack...
2019-08-16 16:04:12 1689 1
原创 使用单链表逆置字符串
难度:二星如何逆置一个单链表存储起来的 字符串?实现的方法有很多,这里我描述的是一个通过迭代和指针向后移动,翻转当前指针指向的方式来 实现的。看完这句话,我相信你也一定么有看懂,我一直觉得学数据结构和算法这门课,想通过文字来明白其中的原理是非常困难的。因为毕竟数据结构还是有很强的空间感的,尤其是指针指来指去的很可能就绕进去了,所以画图递进步骤是我觉得的一个好办法。这里其实我是先写出了代码并...
2019-08-16 14:51:08 569
原创 跟我一起使用腾讯云webIDE-Cloud Studio,让云端开发模式飞起来
今天学习的是如何在云端进行技术开发,比如我是做java的,有些时候由于某些原因,我们无法使用本地IDE进行开发,那么我们就只能在网页上进行开发,在这些情境下云端IDE显得很有必要。这里介绍的是腾讯云的Cloud Studio这款webIDE,这里仅仅是作为使用的入门,具体详细一点的还需要你自己动手去探索.肯定得有一个账号吧!首先,进入https://studio.dev.tence...
2019-08-16 11:40:40 2391
原创 判断单链表存储的字符串是否为“回文串”
难度:二星回文串是啥?我想不用解释了,如果不懂什么是回文串可以自己百度一下。这里讲解的是当使用单链表来存储一个字符串的时候,如何通过单链表这种存储结构,判断这个字符串是不是回文串。先说下思想:我们使用快慢两个指针,初始状态下快指针和慢指针都指向单链表的头结点。快指针每次走两步,慢指针每次走一步,一直到快指针走到单链表的最后一个结点位置。此时慢指针恰巧会走到字符串的中间位置。如果我们...
2019-08-14 21:50:38 2047
原创 那些放在抽屉里的技术
那些放在抽屉里的技术。 那些沾满灰尘的技术。 不知道何时才会打开抽屉看一眼的技术。 你是我曾经充满向往的技术。 是我魂牵梦绕的技术。 ...
2019-08-13 10:51:10 360
原创 mongoDB数据库命令行基本操作
为方便对mongodb的日常基本操作,之前的项目中很少用到这种文档类型的数据库,不过由于其具有灵活性强的特点,如今还是用到了它,出来混迟早是要还的,一点不假。特整理一篇mongoDB的基本操作,若有常用语句也会不时更新。//1.进入my_test数据库use my_test//2.向数据库的user集合中插入一个文档 db.users.insert({...
2019-08-04 12:23:29 1477
原创 Navicat 12 for MongoDB破解步骤
先安装Navicat 12 for MongoDBNext,选择安装目录一路Next,安装关闭杀毒软件,右键以管理员身份打开Navicat_Keygen_Patch_v3.7_By_DFoX_URET.exe弹出以下提示表明可以继续下一步了打开mongodb安装软件,点击弹出框注册打开注册机,选择Products为Mon...
2019-08-04 12:08:29 9786 9
原创 windows环境下mongoDB安装与开机启动
我这里选择的版本是3.2.4的windows64位,据说偶数位的(比如3.x,x是偶数)是稳定版本。下载地址:https://www.mongodb.com/download-center/community安装直接右键-安装,一路Next。选择一下安装路径,这里我安装到 D:\Program Files\MongoDB\Server\3.2\finish,安装...
2019-08-03 23:25:50 1081
画画板软件.zip
2019-07-08
windows下配置zk伪集群及加入windows服务
2018-02-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人