Fenrier Lab

使用行为树实现应用程序命令行解析工具

不知道是不是我一开始想多了,在做本科毕业论文的时候,为了更方便地运行程序,绞尽脑汁写了一个命令行解析器。而后又经过几次迭代,感觉成熟了不少,但是回过头发现好像并用不着这样的解析器。。。当然主体程序跟现在要讨论的内容不相关就不说了,只是花了精力实现的东西还是希望记录下思路。 行为树的原理,简单来说,系统的状态从根节点出发,接收外部信息,每接受一个信息,就按照预定义的跳转表进行状态跳转。当所有信息都处理完之后,最终停留的那个状态一般都有个动作,运行之后便完成了对程序的控制。 所以实际上要完成两个阶段的任务,首先是利用待实现的命令行语句构建一颗行为树,语句里的每个单词都是一个状态跳转指示。然后实现一个语句解析器,负责读取语句,并进行相应的状态跳转。 构造行为树 预定义一颗行为树的方法...
点我阅读更多...

Java HashMap源码分析(1)

哈希表是一种常用而强大的数据结构,有鉴于此,许多语言都自带其实现,这就为我们这些使用者带来了很多方便。在Java中,HashMap是使用率最高的哈希表,本文将对其源码进行详细的解读。 HashMap是一个比较大的类,有两千多行代码,继承了一个类,实现了三个接口,以及大量的方法。如果上来就一行一行的读,那么将很快就陷入泥潭,无法自拔。所以我决定在看源码的同时,写一个简化版本的哈希表,一开始只关注哈希表本身,然后再逐步添加实际应用层面的功能(比如,我将先不考虑HashMap中的最大容量、序列化等等与哈希表结构无关的内容)。然后我想说下,我发现在IDEA中类名使用小写首字母并不会弹出警告,所以我决定在不造成困扰的情况下不遵从Java常用的驼峰命名规则,比如接下来我要实现的简化哈希表就叫has...
点我阅读更多...

支持向量机

考虑属于两个类别的样本集合 \[S = \{(x^{(i)}, y_i )\,\mid i = 1,,,n\}\] 其中 \(x^{(i)}\) 是维度为 d 的特征,\(y_i\) 表示样本类别,等于 1 或者 -1。如果两个类别线性可分,那么将特征点集合投影到二维面上大致如下图所示 为了对数据进行分类,我们可以选择一个超平面对两类数据进行切割,显然这里有无数种切割方式,但是有的分隔面比其他面效果更好。支持向量机的任务就是找到这样一个分隔面,使得所有特征点到它的最小距离达到最大值,或者换句话说就是,使得两类特征点到分隔面的最小距离相等,如下图所示 假设上图中的实线即为这样的超平面,设其方程为 \[\omega^T x +b = 0\] 我们说这样的分隔面使得特征点...
点我阅读更多...