从头学习C/C++hexo d!

唉~ 最近一直在看java并发,走到了ConcurrentHashMap, 不论是JDK1.7版本还是JDK1.8版本都大量依赖sun.misc.Unsafe, 而它又大量依赖底层的native方法, 于是又编译了openjdk8, 可是无奈很多底层的锁啊,并发啊,native啊都和jvm的实现有关,而这种实现就是c/c++写的. 唉,虽然写算法一直用的c/c++, 但是都是比较简单的c/c++, 从未系统学习过c/c++,当时谭浩强的c/c++学是学了,但是早就荒废了. 于是,我依旧鼓起勇气重拾c/c++

要想真正理解java、操作系统,c/c++是绕不开的坎!!!

一切付出都是值得的!!!

java 调用 native 方法实例

缘起

最近因为在读《java并发编程实践》,看到第五章,想了解ConcurrentHashMap的源码,但是发现不论是JDK1.7还是JDK1.8, 都要使用一个sun.misc.Unsafe。 而这个是一个工具类(关于它,后面我会继续写文章的). 它里面几乎所有的方法都是native的. 所以不经激起了我的好奇心——native方法~ 嗯,它广泛存在与java中,但是我们平时只是CRUD,没有仔细去了解它~ 现在才发现,已经到了不得不去了解它的原理的地步了. 而且发现,不了解c/c++的java程序员是根本没办法真正理解java的!!!

Read More

ConcurrentHashMap jdk7 源码解读

线段树应用之线段覆盖总长度(另一种建树方式)

缘起

【1】中我们给出了线段树求解若干条线段覆盖区域总长度算法. 但是发现之前的建树方式有点麻烦——因为线段树分左右孩子的时候是没有端点重合的. 例如 [1,10]分割成[1,5]和[6,10]而漏掉了[5,6]区间. 但发现在处理着眼于线段、区间的问题中,这种建树方式是要做一些补救措施的——例如【1】中做的那样. 这是因为【1】中建树的方式着眼于”端点”, 【1】中建树的方式尽管不会漏掉任何一个端点,但是会漏掉一个区间, 我们把这种线段树成为点线段树. 点线段树对于处理只涉及端点的问题——例如【2】和【3】的时候很有效——或者说处理起来很优雅. 但是对于涉及线段啊,区间本身的时候,就显得力不从心、捉襟见肘了,例如【1】,所以我们针对【1】这种问题,再考虑另一种建树方式——区间线段树.

Read More

线段树

缘起

源于一道大厂的面试题

有一个日志文件,存放当天用户ID和上线,下线的时间(时间为从0 点开始到当前的秒数),这个日志文件有10亿条记录。请你设计一个算法,根据这个日志文件绘制当天在线人数曲线图。
日志文件内容如下:

1
2
3
4
5
6
UID       上线时间       下线时间
112 200 5000

342 1320 20080

………………总共有10亿条

Read More