摘要:
//查看占用内存最多的前K的程序ps aux | sort -k4nr | head -K//查看占用CPU最多的前K的程序 ps aux | sort -k3nr | head -K 阅读全文
摘要:
众所周知,归并排序的时间复杂度是O(N*lgN) 归并排序的时间复杂度推导书上网上一抓一把,但是多数证明都是基于N=2k这个假设来证明的,下面我给出一般情况的证明。 先上归并排序代码: 根据代码可以看出,时间消耗主要在我标红的3个地方,可以得出: 我们知道每一个整数都可以表示为2i+k的形式,如1= 阅读全文
摘要:
定义 给定两个字符串s1和s2,两者的编辑距离定义为将s1转换为s2的最小编辑操作数(等价于将s2转换为s1的最小编辑操作数)。 编辑操作有3种:插入一个字符、删除一个字符、替换一个字符。 例如:cat和cbt的编辑距离是1(将a替换为b);cat到ca的编辑距离是1(删除t);ct到cat的编辑距 阅读全文
摘要:
二分查找是一个非常常用且简洁的查找算法,相信很多人也知道它的时间复杂度是logN,但是我看网上的大多数博客给出的所谓推导过程都十分不严谨,于是我花了些时间自己写了推导过程。 首先上二分查找的代码: 下面是推导过程: 假设数据的规模为N(即每次调用时的high-low),程序执行的比较次数表示为C(N 阅读全文
摘要:
最近买了本《算法 第4版》打算看看算法,本来抱着割草的心理想快速过完第一章的基础知识然后去看红黑树神马的,结果居然被第一章的算法分析里一个小问题卡住了半天时间。决定记录一下。 问题描述 问题灰常简单,可以简单描述为:请问下面代码当n=100的时候,最终count等于多少(即最内层的for循环执行了多 阅读全文
摘要:
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停;等到线程B修改了条件condition,使condition满足了线程A的要求时,A再继续执行。 自旋实现的等待通知 最简单的实现方法就是将cond 阅读全文
摘要:
概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放、共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和Semaphore,AQS还可以混合两种模式使用,读写锁ReentrantReadWriteLock 阅读全文
摘要:
概述 ReentrantLock,即重入锁,是一个和synchronized关键字等价的,支持线程重入的互斥锁。只是在synchronized已有功能基础上添加了一些扩展功能。 除了支持可中断获取锁、超时获取锁、非阻塞获取锁这些显示锁的常见功能外,ReentrantLock还支持公平锁(synchr 阅读全文
摘要:
概述 上一篇我们讲了AQS的使用,这一篇讲AQS的内部实现原理。 我们前面介绍了,AQS使用一个int变量state表示同步状态,使用一个隐式的FIFO同步队列(隐式队列就是并没有声明这样一个队列,只是通过每个节点记录它的上个节点和下个节点来从逻辑上产生一个队列)来完成阻塞线程的排队。 这里FIFO 阅读全文
摘要:
Jdk1.5中包含了并发大神Doug Lea写的并发工具包java.util.concurrent,这个工具包中包含了显示锁和其他的实用同步组件。Doug Lea在构建锁和组件的时候,大多是以队列同步器(AbstractQueuedSynchronizer)为基础的,因此AbstractQueued 阅读全文