Fork me on GitHub

随笔分类 - 备战阿里

摘要:Zookeeper 分布式协调服务 应用之处:发布、订阅,命名服务,分布式协调和分布式锁 对比 Chubby: Chubby 被定义为 分布式的锁服务 为分布式系统提供 松耦合、粗粒度 的分布式锁功能 其由两部分组成 提供数据的读写接口并管理相关配置数据的服务端 另一部分是客户端使用的 SDK 为对 阅读全文
posted @ 2019-02-19 14:53 郑斌blog 阅读(1378) 评论(0) 推荐(0) 编辑
摘要:递归实现 时间、空间复杂度均为 O(logN) 非递归实现 时间复杂度为 O(logN),空间复杂度为 O(1) 简单应用:在有序数组中查找某数 num 的出现次数 m 给定数组 arr 和要找的数为 num。 首先确定 num 最左出现的下标位置,记为 indexL,再确定 num 在数组中最右出 阅读全文
posted @ 2017-03-22 23:41 郑斌blog 阅读(903) 评论(0) 推荐(0) 编辑
摘要:特征 完全二叉树是指除了最后一层之外,其他每一层的结点数都是满的。最后一层如果也满了,是一颗满二叉树,也是完全二叉树。最后一层如果不满,缺少的结点也全部的集中在左边,那也是一颗完全二叉树。 下面介绍一个简单应用,完全二叉树的相关操作以后补充。 判断一棵二叉树是否为完全二叉树 阅读全文
posted @ 2017-03-19 21:38 郑斌blog 阅读(604) 评论(0) 推荐(0) 编辑
摘要:特征 1、空树是平衡二叉树。2、如果一棵树不为空,并且其中所有的子树都满足各自的左子树与右子树的高度差都不超过 1。 下面介绍一个简单应用,平衡二叉树的相关操作以后补充。 判断一棵二叉树是否为平衡二叉树 给定一颗二叉树的头结点 head,判断一棵树是否是平衡二叉树。 1.1、左子树是否为平衡二叉树1 阅读全文
posted @ 2017-03-19 21:35 郑斌blog 阅读(526) 评论(0) 推荐(0) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 层次遍历 二叉树的层次遍历是指,从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中从左至右依次遍历。 按层打印 按层打印要求,在不同的层打印后加上换行。问题的关键就是如何知道该换行了。只需要两个 node 类型的变量 last 和 nlast 阅读全文
posted @ 2017-03-18 18:44 郑斌blog 阅读(5155) 评论(0) 推荐(0) 编辑
摘要:简述 二叉树的遍历分为先序遍历、中序遍历和后序遍历。如下图所示: 递归遍历 递归遍历实现比较简单,递归利用函数栈来保存信息。 非递归遍历 非递归需要额外自己申请数据结构来代替函数栈。 先序遍历: 1.申请一个栈 stack。然后将头结点 head 压入 stack 中。 2.从 stack 中弹出栈 阅读全文
posted @ 2017-03-17 22:52 郑斌blog 阅读(1299) 评论(0) 推荐(0) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 简述 计数排序基于桶排序。 比如待排数组 A[5]={101, 100, 103, 102, 105}; 那么就需要建造 105(max)-100(min)+1=6 大小的临时数组,将这 5 个元素按照,值减 100(min) 作为下标存储在临时数组中。 阅读全文
posted @ 2017-03-16 18:46 郑斌blog 阅读(380) 评论(0) 推荐(0) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 排序过程 以数组 A[6]={23, 14, 101, 72, 84, 11}为例,调用基数排序过程如下图所示: 基本思想是:将整数按位切割成不同的数字,然后对每个数的同一位进行排序。具体做法:将所有待排序数值统一为同样的数位长度,数位较短的数前面补零。 阅读全文
posted @ 2017-03-16 17:33 郑斌blog 阅读(1523) 评论(0) 推荐(0) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 简述 归并排序是将两个或两个以上的有序表组合成一个新的有序表。 其基本思想是:先将 N 个数据看成 N 个长度为 1 的表,将相邻的表成对合并,得到长度为 2 的 N/2 个有序表,进一步将相邻的合并,得到长度为 4 的 N/4 个有序表,以此类推,直到 阅读全文
posted @ 2017-03-16 12:34 郑斌blog 阅读(999) 评论(0) 推荐(0) 编辑
摘要:持续更新系列。参考自:《数据结构与算法分析——Java语言描述》、《算法导论》排序 数据结构——快速排序 数据结构——堆排序 阅读全文
posted @ 2017-03-15 21:08 郑斌blog 阅读(2402) 评论(4) 推荐(3) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 什么是堆? 堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个节点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层可能除外(最后一层从最结点的左子树开始填)。如果给定了某个结点的下标 i,那么其父结点为 PARENT(i)= 阅读全文
posted @ 2017-03-15 20:59 郑斌blog 阅读(1623) 评论(0) 推荐(0) 编辑
摘要:系列文章:数据结构与算法系列——从菜鸟到入门 描述 快速排序是基于分治模式的,下面按分治模式来进行分析: 分解: 数组 A[p..r]被划分成两个(可能空)子数组,A[p..q-1]和 A[q+1..r],使得 A[p..q-1]中的每个元素都小于等于 A(q),也小于等于 A[q+1..r]中的元 阅读全文
posted @ 2017-03-15 12:19 郑斌blog 阅读(2000) 评论(0) 推荐(0) 编辑
摘要:简介 什么是代理模式? 代理模式就是多一个代理类出来,代替原对象进行一些操作。比如说租房的中介、打官司的律师、旅行社,他们可以代替我们做一些事情,这就是代理。 代理模式的应用场景: 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:1. 修改原有的方法来做到改进。但这样违反了“对扩 阅读全文
posted @ 2017-03-07 12:03 郑斌blog 阅读(1000) 评论(1) 推荐(2) 编辑
摘要:简介 信号量为多线程协作提供了更为强大的控制方法。也可以说,信号量是对锁的扩展。无论是内部锁 synchronized 还是重入锁 ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。 其构造函数如下: 常用方法: 应用场景 Semaphor 阅读全文
posted @ 2017-03-06 11:18 郑斌blog 阅读(845) 评论(0) 推荐(0) 编辑
摘要:简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执行的情况。 和 Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 Interr 阅读全文
posted @ 2017-03-05 17:59 郑斌blog 阅读(1317) 评论(1) 推荐(0) 编辑
摘要:简述 这两个操作就好比播放器的暂停和恢复。 但这两个 API 是过期的,也就是不建议使用的。 不推荐使用 suspend() 去挂起线程的原因,是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行 resume() 方法后,被挂 阅读全文
posted @ 2017-03-05 16:59 郑斌blog 阅读(11534) 评论(0) 推荐(1) 编辑
摘要:简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”。 ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现锁的关键)来实现锁的获取与释放。 其可以完全替代 synchronized 关键字。JDK 5.0 阅读全文
posted @ 2017-03-05 09:08 郑斌blog 阅读(6846) 评论(0) 推荐(0) 编辑
摘要:概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息,不得不需要结 阅读全文
posted @ 2017-03-02 15:44 郑斌blog 阅读(8937) 评论(8) 推荐(5) 编辑
摘要:持续更新系列。参考自Java多线程系列目录(共43篇)、《Java并发编程实战》、《实战Java高并发程序设计》。 基础Java多线程——过期的suspend()挂起、resume()继续执行线程;Java多线程——sychronized Java中Volatile关键字详解;Java中SynchronizedMap与ConcurrentHashMap的对比;Java中ThreadLocal的深入理解 阅读全文
posted @ 2017-02-23 22:18 郑斌blog 阅读(2674) 评论(0) 推荐(1) 编辑
摘要:持续更新系列。 参考自《深入理解Java虚拟机》、《Java性能权威指南》、《分布式Java应用基础与实践》。 Java的内存结构 JVM内存结构——运行时数据区 JVM——代空间的划分 JVM——判断对象的死活 Java内存模型 Java中内存溢出与内存泄露 JVM——深入分析对象的内存布局 垃 阅读全文
posted @ 2017-02-21 20:49 郑斌blog 阅读(1935) 评论(0) 推荐(2) 编辑