从JDK源码看String(上)
Java 语言使用 String 类用来代表字符串,实际上 String 对象的值是一个常量,一旦创建后不能被改变。正式因为其不可变,所以它是线程安全地,可以多个线程共享。 相信对于 String 的使用大家都再熟悉不过的了,这里就了解下 JDK 中怎么实现 String 类的…
看图轻松理解数据结构与算法系列(基于数组的栈)
推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 栈是一种线性存储结构且运算受限的线性表,它的插入和删除运算操作被限制在表的一端,该端称为…
看图轻松理解数据结构与算法系列(二叉搜索树)
推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 对于树的数据结构大家都了解,只是树的类型有很多,所以可能又会对树产生一种陌生感。树其实就…
看图轻松理解数据结构与算法系列(双向链表)
推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 双向链表属于链表的一种,也叫双链表双向即是说它的链接方向是双向的,它由若干个节点组成,每…
看图轻松理解数据结构与算法系列(单向链表)
推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 单向链表属于链表的一种,也叫单链表,单向即是说它的链接方向是单向的,它由若干个节点组成,…
看图轻松理解数据结构与算法系列(数组)
推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 数组是最熟悉也是最基础的一种结构了,有限个相同数据类型的元素按顺序排列的集合为数组。数组…
双数组Trie树高效构建有向无环图
图是很常见的一种结构了,不管是数据结构算法中的各种图结构,还是机器学习中的概率图。图主要是由若干顶点及连接两顶点的边所构成的图形,通过它可以用来描述某些事物之间的某种特定关系。 有向无环图,即 Directed Acyclic Graph,属于有向图,图结构中不存在环,可用来表…
《字符串连接你用+还是用StringBuilder》续
前面的一篇文章《字符串连接你用+还是用StringBuilder》,有朋友找我反馈了一些问题,其中一位朋友说JDK10下生成的字节码跟文章中并不一样,这里继续看下是什么情况。 如下图,按照《字符串连接你用+还是用StringBuilder》的代码在 javap 后发现它并没有创…
我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
A text analyzer which is based on machine learning,statistics and dictionaries that can analyze text. So far, it supports hot word extracti…
AC自动机+trie树实现高效多模式匹配字典
经常会遇到一类需求,在一段字符串中查找所有能匹配上的模式,比如查找一段文字匹配上字典中哪些短语。这时为了高效处理,就会考虑 AC 自动机,即 Aho-Corasick 自动机算法。它的核心思想是通过有限自动机巧妙地将字符比较转化为了状态转移。 通过 AC 自动机能做到匹配时不需…
Java如何获取当前线程
Java 中经常会遇到要获取当前线程的情况,这时一般我们就会通过Thread.currentThread()来获取,接下去就看看执行该语句在 JVM 中做了什么吧。 以下是一个简单的例子,获取当前线程并打印线程名称,输出是"main",即主线程。 在 Thread 类中,cur…
聊聊从逻辑门到操作系统的计算机
现代计算机已经发展的非常复杂,要理解计算机的运行原理都已经变得异常艰难,虽说我们无法亲自去制造他,但我们可以了解下计算机系统是怎么从0发展而来的。 逻辑门是计算机的基础元件,通过它可以完成逻辑运算(也称布尔运算),这类运算输入输出都只有0和1。 执行“与”操作,两个输入一个输出…
同义词相似度可以怎样计算
词语的相似性的计算方法有很多,比如字面相似度计算方法、基于语义词典的计算方法、基于统计的相似度(向量空间模型)计算方法和基于神经网络的相似度计算方法。 本篇文章讲讲基于词林的语义相似性。 《同义词词林》是上世纪80年代出版的对汉语词汇进行语义分类的义类词典,共收录64223条词…
从Java到JVM到OS线程的优先级
Java 的线程的调度机制由 JVM 实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及“线程优先级”。 Java 把线程优先级分成10个级别,线程被创建时如果没有明确声明则使用默认优先级,JVM 将根据每个线程的优先级分配执行时间…
字符串连接你用+还是用StringBuilder
据我所知字符串确实已经成为 Java 开发人员最常用的类了,而且是大量使用。我们都知道,String 其实是封装了字符,所以俩字符串连接就是将字符串对象里面的字符连起来。很多人习惯使用+来连接字符串,也有人会用 StringBuilder 的append方法。 看看如果我们在程…
图灵机与计算理论
图灵机和计算理论是人工智能乃至整个计算机科学的理论基础,邱奇-图灵论题告诉我们一切可计算过程都可以用图灵机模拟。 图灵机,又称图灵计算、图灵计算机,是由数学家艾伦·麦席森·图灵(1912~1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的…
闲聊URL
URL 即统一资源定位符(Uniform Resource Locator)。它是互联网上标准资源的地址,通过它来对资源定位。 我们访问资源时会有不同的协议,比如http:、ftp:、news:。不同的协议对于客户端可用于区分不同的资源类型,比如 http 协议对应 web 服…
怎样衡量两个字符串的相似度(编辑距离动态规划求解)
目前计算句子相似性有很多不同的方案,比如基于语义词典的方法、基于相同词汇的方法、基于统计的方法和基于编辑距离的方法。这篇文章先介绍编辑距离的基础。 编辑距离其实就是指把一个字符串转换为另外一个字符串所需要的最小编辑操作的代价数。包括插入字符、替换字符和删除字符。编辑距离越小,相…
Java线程的状态
对于线程的状态的分类并没有严格的规定,只要能正确表示状态即可,如图,先看其中一种状态分类,一个线程从创建到死亡可能会经历若干个状态,但在任意一个时间点线程只能处于其中一种状态,总共包含五个状态:新建(new)、可运行(runnable)、运行(running)、非可运行(not…
怎样实现基于Trie树和字典的分词功能
目前做分词比较流行的是用深度学习来做,比如用循环神经网络和条件随机场,也有直接用条件随机场或隐马尔科夫模型的。前面也实现过上面几种,效果挺不错,基于隐马尔科夫模型的差一点,条件随机场的效果较好,而加入深度学习的效果最好。 而最最传统的分词做法很多都是基于字典的,然后通过最大匹配…