二叉搜索树的一些性质

<h4><span id="二叉搜索树的中序遍历的结果序列是一个递增排序的序列">二叉搜索树的中序遍历的结果序列是一个递增排序的序列。</span></h4><blockquote> <p>中序遍历的顺序是:左节点 - 根节点 - 右节点</p> </blockquote> <p

2020/9/21
阅读更多

跳表

<h2><span id="跳表为解决什么问题而诞生">跳表为解决什么问题而诞生</span></h2><p>​ 跳表本质上是一个查找结构,为了解决算法里面的查找问题而诞生。就是根据给定的key快速找到它所在的位置或者value。跳表基于一个有序链表,有序链表的查询时

2020/9/13
阅读更多

redis的事务

<h2><span id="什么是事务">什么是事务</span></h2><p>事务是<a href="https://zh.wikipedia.org/wiki/数据库管理系统" target="_blank" rel="noopener">数据库管理系统</a>执行过程中的

2020/9/10
阅读更多

redis数据类型及使用场景

<h2><span id="redis的数据类型">Redis的数据类型</span></h2><h4><span id="数据类型对应编码方式">数据类型对应编码方式</span></h4><table> <thead> <tr> <th align="center">数据类型

2020/9/7
阅读更多

二叉树非递归遍历统一写法

<h2><span id="前言">前言</span></h2><p>​ 二叉树的遍历,从编程方式上来说主要有两种写法,一种是递归的写法,一种是非递归的写法,其中递归的写法很容易,在<code>leetcode</code>上都是属于<code>easy</code>

2020/9/6
阅读更多

灵魂七问

<ul> <li><p>你为什么做这个东西?</p> </li> <li><p>它和其他东西有什么不同?</p> </li> <li><p>你可以做些什么,比起其他的呢?</p> </li> <li><p>你是怎么实现的?</p> </li> <li><p>实现过程中的核心问题是

2020/8/21
阅读更多

XPath线索追踪技术

<h3><span id="什么是xpath">什么是XPath</span></h3><p>​ XPath全称XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言。XPath基于XML的树状结构,提供在数据结构树中

2020/3/5
阅读更多

cron表达式小记

<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>​ Cron表达式的作用是用来配置定时任务,它是一个字符串,由七个元素或者说叫域组成的,元素之间用空格来分割。</p> <p>​

2019/4/8
阅读更多

计算广告核心问题总结

<p>计算广告的核心问题(目标):<br>$$<br>max \sum^T_{i=1}(r_i-q_i)<br>$$<br> 就是这个最优化问题。上面的<code>i</code>代表从第<code>1</code>次到第<code>T</code>次之间的广告展示,<code>

2019/3/28
阅读更多

实现一个简单的http服务器

<p><img src="https://raw.githubusercontent.com/vzardlloo/imageHub/master/avatar.jpg" alt=""><br>这篇文章主要写一下如何实现一个简单的http服务器,并且借由这个问题讨论一下别的相关问题

2018/2/10
阅读更多

由三次握手想到的...

<p><img src="http://oo3aq3ac8.bkt.clouddn.com/tcp.png" alt="tcp.png"><br>上面是一个tcp链接的过程,也就是俗称的三次握手,图上把每次握手做了什么也表示的比较清楚,不过这种表述的方式比较僵硬,没有自然而然的说

2017/12/1
阅读更多

Js原型链解读

<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>在JavaScript中没”子类”和“父类”的概念,进一步地也没有“类”和“实例”的的区分。它靠一种看上去十分古怪的”原型链“(prototype chain)模式来实现继承。学过JAVA等编程语言的人可能会认为这是对Java等语言的继承实现方式的一种拙劣并且失败的模仿,然而事实并非如此,原型链模式和我们常见的Class模式分别是两种编程范式prototype_base和class_base的实现,前者在动态语言中似乎十分常见,而后者主要在静态语言领域流行。下面是维基百科关于prototype_base模式的介绍:</p> <blockquote> <p>Prototype-based programming is a style of object-oriented programming in which behaviour reuse (known as inheritance) is performed via a process of reusing existing objects via delegation that serve as prototypes. This model can also be known as prototypal, prototype-oriented, classless, or instance-based programming. Delegation is the language feature that supports prototype-based programming.<br>Prototype object oriented programming uses generalized objects, which can then be cloned and extended. Using fruit as an example, a “fruit” object would represent the properties and functionality of fruit in general. A “banana” object would be cloned from the “fruit” object, and would also be extended to include general properties specific to bananas. Each individual “banana” object would be cloned from the generic “banana” object. Compare to the class-based paradigm, where a “fruit” class (not object) would be extended by a “banana” class</p> </blockquote> <p><a href="https://en.wikipedia.org/wiki/Prototype-based_programming">维基原文</a><br>

2017/11/6
阅读更多

统计知识(1)

<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近为了参加一个数据分析比赛,在复习统计这块的知识。首先什么是统计呢?我采用北京大学出版社出版的《应用经济统计学》中的定义:统计学是一门对群体现象数量特征进行计量描述和分析推论的科学。从定义可以看出统计学主要干两件事一个是对群体现象特征进行计量描述,第二个是对群体数量进行分析得出推论。那我们一件一件事来,先来讲一下统计学干的第一件事:对群体现象特征进行计量描述。本文主要理一下脉络,对于细节不过多纠结(主要是Markdown打公式太麻烦……)<br>

2017/10/16
阅读更多

同步Github上的fork

<p>我们有时候会在Github上fork一个我们感兴趣的项目到自己的仓库,等一段时间过后这个项目已经更新了,但是自己仓库里还停留在刚fork时的状态,那么我们如何把自己fork到仓库的项目同步到作者的进度呢?这篇博客主要就是讲一下这个问题。<br>这个问题我有两种解决的办法:<br>一种是在Github上操作,把自己仓库的项目设成<code>base</code>,把作者的的项目设成<code>head</code>,然后给自己提pr,最后在pull下来就行了。这种方法的缺点就是要开网页点来点去,如果你正在沉迷在命令行里无法自拔可能不太喜欢这种方法。<br>

2017/10/13
阅读更多

Http协议杂谈

<h4 id="HTTP的特性"><a href="#HTTP的特性" class="headerlink" title="HTTP的特性"></a>HTTP的特性</h4><ul> <li>HTTP构建于TCP/IP协议之上,默认端口号是80</li> <li>HTTP是无连接无状态的</li> </ul> <h4 id="HTTP报文"><a href="#HTTP报文" class="headerlink" title="HTTP报文"></a>HTTP报文</h4><p>Http协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行、请求头、消息主题。类似于下面这样:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">GET /en-US/docs/Web/HTTP/Headers/Content-Disposition HTTP/1.1</div><div class="line">Host: developer.mozilla.org</div><div class="line">Connection: keep-alive</div><div class="line">Cache-Control: max-age=0</div><div class="line">Upgrade-Insecure-Requests: 1</div><div class="line">User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile Safari/537.36</div><div class="line">Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8</div><div class="line">Referer: https://hit-alibaba.github.io/interview/basic/network/HTTP.html</div><div class="line">Accept-Encoding: gzip, deflate, br</div><div class="line">Accept-Language: zh-CN,zh;q=0.8</div><div class="line">Cookie: csrftoken=0QVKqjybZR4MatNi0vCP03XIDrEWODO9; dwf_section_edit=True; dwf_sg_task_completion=False; _ga=GA1.2.817713072.1498834189; _gid=GA1.2.1652928103.1505806097</div><div class="line">If-None-Match: &quot;76da2643e0174c564b0a898793e76edda496498f&quot;</div></pre></td></tr></table></figure></p>

2017/9/19
阅读更多

JAVA虚拟机的类加载机制

<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>这篇博客讲一下JAVA虚拟机的类加载机制,一个类从被加载到虚拟机内存开始,到卸载处内存为止,它的整个生命周期包括:</p> <ol> <li>加载</li> <li>验证</li> <li>准备</li> <li>解析</li> <li>初始化</li> <li>使用</li> <li>卸载</li> </ol> <p>其中1,2,3,5,7这五个步骤的顺序是固定的,而解析却不一定,它可以在初始化之后再开始,这是为了支持JAVA语言的运行时绑定。下面开始逐一介绍每个步骤。<br>

2017/9/19
阅读更多

HashMap源码剖析

<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>这篇博客讲一下JAVA集合类中的HashMap。HashMap底层是通过维护一个数组来保存元素。当创建HashMap实例的时候,会通过指定的数组大小以及负载因子等参数创建一个空的数组,当在容器中添加元素的时候,首先会通过hash算法求得key的hash值,再根据hash值确定元素在数组中对应的位置,最后将元素放入数组中的对应位置。这里我们需要考虑的一个问题是hash冲突问题,即两个元素key的hash值一样,这就要求我们一方面hash算法要足够”发散”来避免这种情况,另一方面我们也要采取措施来解决这种冲突,在HashMap中采取的方法是链地址法,即当两个元素的key的hash值是一样的,首先判断key值是否是一样的,如果是一样的则替换value值。如果key的值不一样,则把后面添加的元素链接到之前添加的值的后面,形成一个链表。所以HashMap的数据结构实际是:hash表+单向链表。通过链表的形式把所有冲突元素放到了数组同一个位置,但是又引出另一个问题就是当链表过长时会影响HashMap的存取效率,因为在数组长度固定的情况下,存储的数据越多,hash冲突是不可避免的,那么控制hash冲突可以通过扩容来解决,在HashMap中有个负载因子(loadFactor)的概念。HashMap允许实际存储的元素的个数size = loadFactor*数组长度,一旦容器元素超出了这个size,HashMap就会自动扩容,并对所有元素重新执行hash操作,重新调整位置。最后说明本文基于Oracle JDK 1.8。<br>

2017/9/8
阅读更多

Java中的锁

<p>这篇博客主要讲一下Java中的各种各样五花八门的锁。这些五花八门的锁肯定不是工程师没事做闲着无聊倒腾出来的,他们都是为了在某些环境下的性能而对传统的锁做了些改造。</p> <h4 id="公平锁和非公平锁"><a href="#公平锁和非公平锁" class="headerlink" title="公平锁和非公平锁"></a>公平锁和非公平锁</h4><p>公平锁是指当多个线程在等待同一锁时,必须按照申请锁的先后顺序排成一个等待队列依次来一次获得锁。<br>非公平锁是指加锁时不用考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待,是抢占式的。<br>对比:非公平锁的性能比公平锁搞5~10倍,因为公平锁需要在多核的情况下维护一个队列。但是非公平锁有可能会导致饥饿问题。</p> <h4 id="自旋锁"><a href="#自旋锁" class="headerlink" title="自旋锁"></a>自旋锁</h4><p>由于Java的线程是映射到操作系统的原生线程上的,如果要阻塞一个线程或者唤醒一个线程,都需要操作系统来帮忙完成,需要操作系统从用户态转换到核心态。因此状态转换需要耗费很多处理器时间。同时虚拟机的开发团队注意到许多应用上共享数据的锁定状态只会持续很短的一段时间,如果一个线程只是很短暂的占用一个共享资源,当在它短暂占用这段资源的时候如果有别的线程试图占用这个资源的时候,后来的线程会因为该资源被占用而陷入阻塞状态,丢失对时间片的占用,这会导致资源的大量浪费。所以针对这种情况开发团队设计出了自旋锁,即如果物理机器有一个以上的处理器,可以让两个或两个以上的线程同时并行执行,我们就可以让后面的线程“稍等一下”,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),等待锁被释放。<br>但是自旋也不可以替代锁,自旋虽然避免了线程切换的开销,但是它是要占用处理器时间的,因此,如果锁被占用的时间很短,自旋等待的效果会非常好。如果锁被占用的时间很长。那么自旋只会白白占用处理器的资源。因此自旋等待时间必须要有一定限制,如果自旋超过一定次数(默认是10次,使用-XX:PreBlockSpin来更改)没有获得锁,就应该使用传统的方式去挂起线程了。需要注意的是自旋是在轻量级锁中使用的,在重量级锁中,线程不能用自旋锁。</p>

2017/9/7
阅读更多

关于volatile

<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>volatile关键字可以说是JAVA比较难理解的一个关键字了,很多书感觉讲的都不太清楚。这篇博客主要梳理一下它的含义,是对自己学习的一个总结,参考了不少资料和博客,希望可以到帮助别人。本文的主要讲一下下面几件事:</p> <ul> <li>JAVA内存模型简介</li> <li>volatile的语义:<code>可见性</code>、<code>禁止重排序</code>。</li> <li>为什么volatile不能保证一致性。</li> <li>volatile的应用场景举例。</li> </ul> <h4 id="JAVA内存模型简介"><a href="#JAVA内存模型简介" class="headerlink" title="JAVA内存模型简介"></a>JAVA内存模型简介</h4><p>这块知识必须要对JAVA内存模型有个基本的认识,所以先简单讲一下JAVA内存模型。<br><img src="http://oo3aq3ac8.bkt.clouddn.com/jmm.png" alt=""><br>

2017/8/29
阅读更多

修复hexo博客的一个bug

<p>之前不小心把JAVA分类写成了java发布了,然后又改了回来,并且手动地在博客<code>public/categories/</code>和<code>.deploy_git/categories/</code>下的java文件夹改成JAVA重新发布,结果在点击JAVA分

2017/8/25
阅读更多