图解二叉堆(最小堆&最大堆)
二叉堆二叉堆是一颗完全二叉树,该树中的某个节点的值总是不大于(不小于)其左右子节点的值,包括最小堆和最大堆。可以通过下图理解,为什么会使用数组来保存呢?因为利用完全二叉树的性质,我们可以通过数组来表示完全二叉树(数组下标与完全二叉树节点存在映射关系,比如父节点可以通过Math.floor((inde
图解二叉堆(最小堆&最大堆)
二叉堆二叉堆是一颗完全二叉树,该树中的某个节点的值总是不大于(不小于)其左右子节点的值,包括最小堆和最大堆。可以通过下图理解,为什么会使用数组来保存呢?因为利用完全二叉树的性质,我们可以通过数组来表示完全二叉树(数组下标与完全二叉树节点存在映射关系,比如父节点可以通过Math.floor((inde
人机对话系统与自然语言处理
前言一两年前由于工作需要重点研究过自然语言处理与人机对话系统,本文将会列出的它们的知识点以及自己的思考。nlp与人机对话对于普通企业,人机对话目前主要的应用是任务型人机对话系统。不管是nlp亦或是chatbot,学术上和工程上都有不同的实现手段。学术界上人机对话系统的研究成果以及最新的研究趋势在工程
UMA架构与NUMA架构下的自旋锁(CLH锁与MCS锁)
关于自旋锁我们知道自旋锁是实现同步的一种方案,它是一种非阻塞锁。它与常规锁的主要区别就在于获取锁失败后的处理方式不同,常规锁会将线程阻塞并在适当时唤醒它。而自旋锁的核心机制就在自旋两个字,即用自旋操作来替代阻塞操作。某一线程尝试获取某个锁时,如果该锁已经被另一个线程占用的话,则此线程将不断循环检查该
现实世界的模型与理论
模型与理论为了去分析理解现实世界的万物与人类的思想,我们引入了很多概念,从而形成概念体系。概念体系则被称为模型,将逻辑应用于模型得到的见解称为理论。比如数学有很多概念,这些概念组成数学模型,有很多应用在数学上的逻辑则是数学理论。数学模型非常严格,所以应用面非常广。一般模型理论的正确性可通过逻辑或实验
不确定世界的模型
复杂的世界我们生活在一个极其复杂的世界,不管是小到分子原子亦或是大到整个宇宙,其复杂程度都是超乎想象。或许你不曾深入去思考过身边事物的复杂性,那是因为你已经对你日常所见习以为常。所有在你出生之前发明的事物都是这个世界的自然组成部分,所以很多事物给人的感觉都是这个世界本来的样子。复杂世界像人类这样复杂
linux内核的一些知识点(下)
页内核以物理页作为内存的基本单位,内存管理单元(MMU)正式以页作为单位进行处理,内存管理单元硬件负责将虚拟地址转为物理地址。所以从虚拟内存的角度来看,页就是最小的单位。多数32位体系结构的页大小为4KB,而64位体系结构则为8KB。也就是说1G大小的内存会被划分为262144个页来进行管理。lin
linux内核的一些知识点(中)
系统调用内核为用户进程提供的交互接口,可以为用户进程提供受限制地访问硬件设备、申请操作系统资源以及创建进程和进程通信等能力。linux中的每个系统调用都对应一个系统调用号,调用号用于指明具体哪个系统调用。系统调用既为应用程序提供了请求接口,又保证了系统的安全和稳定。用户空间的程序不能直接访问内核代码
linux内核的一些知识点(上)
前言应用层通常专注于API的使用,认为将其看成是一个黑盒即可,但了解操作系统的一些机制将有助于我们更好地使用它,也有助于避免犯错误。unix系统1969年,unix从贝尔实验室诞生,由一个失败的操作系统multics发展而来,它发布时带上了源码,以至于很多组织都对其进一步改进。它由C语言编写,且只有
聊聊大数据与人工智能
关于数据这些年人类生产的数据呈爆发式增长,从十几年前移动智能设备的兴起,到如今人们身上穿戴的各种传感器设备,都在24小时不断产生大量数据。这些数据包括文本、语音、图像、视频等等。大数据大数据这个词最早出现在20世纪90年代,当时只是用来描述数据量很大,但并没有给出明确的定义和概念意思。出现后没有受到
数学的公理化及抽象化
高度分工现如今社会进入了高度分工的阶段,人们干的事被越来越局限在某个领域,甚至是某个领域很小的范围内。人们受到的教育也越来越长,研究的问题也越来越细越来越深越来越抽象。现在要想诞生以前的全才几乎不太可能了,主要是因为以前很多方面学科都都还比较浅,很多现在看似很简单的成果都能载入史册。印象比较深的全才
那些主流编程语言的知识,C语言(Ⅰ)
前言对于编程语言来说,经常看到有因为各自支持的语言阵营而互怼的,其实根本没那个必要,都只是一种工具而已。当多数主流语言都会使用时也许你就不会有偏见了,本质不过都是用来描述计算机的一个任务,只是每门语言设计时考虑的侧重点不一样而已。大家最好不要停留在语言层面去争执,不如把时间花在计算机实现原理和结构的
Unsafe穿透Java层到JVM层,提供CPU级别和操作系统级别的操作
关于UnsafeJava从一开始就被定为一个安全的编程语言,它屏蔽了指针和内存的管理,从而减少犯错的风险。但Java仍然为我们留下了一个后门,通过这个后门能够进行一些低级别、不安全的操作,比如内存的申请/释放/访问等操作、底层硬件的原子操作、内存屏障、对象的操作等等。这个后门就是Unsafe类,该类
那些常见的并发模型相关知识
并发与并行并发和并行都可以是相对于进程或是线程来说。并发是指一个或若干个CPU对多个进程或线程之间进行多路复用,用简单的语言来说就是CPU轮着执行多个任务,每个任务都执行一小段时间,从宏观上看起来就像是全部任务都在同时执行一样。并行则是指多个进程或线程同一时刻被执行,这是真正意义上的同时执行,它必须
大数据和人工智能工程上的一些点
大数据大数据这个词最早出现在上世纪90年代的美国,直到2012年后才火起来。大数据没有一个明确的概念,之所以称之为大是因为数据量太大超过了单台计算机的资源,这时就需要分布式的数据处理工具,以便能在用户可容忍的时间内进行数据处理。大数据从业人员肯定会去了解谷歌的mapreduce论文和hadoop开源
从赌博中的概率到AI中的概率
我们生活的这个世界里面普遍具有不确定性,除了很少一部分事件具有确定性,其它大部分事件都是不确定的。而这些不确定事件我们就需要概率来描述,目前概率论已经渗透进各个学科,可以说它是人类知识体系中非常重要的部分。概率论是科学的,科学理论也需要概率论去支撑。 如果有人跟你说明天太阳从东…
大数据和人工智能工程上的一些点
大数据这个词最早出现在上世纪90年代的美国,直到2012年后才火起来。大数据没有一个明确的概念,之所以称之为大是因为数据量太大超过了单台计算机的资源,这时就需要分布式的数据处理工具,以便能在用户可容忍的时间内进行数据处理。大数据从业人员肯定会去了解谷歌的mapreduce论文和…
作者的新书《图解数据结构与算法》上市了,全彩印刷!
《图解数据结构与算法》的写作初衷是为大家提供一种形象且易于理解的方式来学习常见的数据结构和算法,本书采用一步一图的方式来呈现数据结构中常见概念以及算法的步骤,降低了理解难度和阅读压力。 对于不是专门写算法的程序员来说,其实我们更需要的是一种形象且更加容易理解的方式来帮助我们学习…
那些主流编程语言的知识,C语言(Ⅰ)
对于编程语言来说,经常看到有因为各自支持的语言阵营而互怼的,其实根本没那个必要,都只是一种工具而已。当多数主流语言都会使用时也许你就不会有偏见了,本质不过都是用来描述计算机的一个任务,只是每门语言设计时考虑的侧重点不一样而已。大家最好不要停留在语言层面去争执,不如把时间花在计算…
并发原理抽丝剥茧,线程本地变量ThreadLocal的实现原理
ThreadLocal我们经常称之为线程本地变量,通过它能够实现线程与变量之间的绑定,也就是说每个线程只能读写本线程对应的变量。对于同一个ThreadLocal对象,每个线程对该对象读写时只能看到属于自己的变量,这样来看ThreadLocal也是一种线程安全的模式。Thread…