List.add(int[])的问题,链表添加数组或对象问题

由于List.add(),追加的数值,则List记录数值, 而如果是对象,则记录地址。对于数组来说,相互传递的地址,那么运行下面的函数会发现,List中add追加的都是同一个地址,并且对应的值都是最后一次更新后的值。 private List<int[]> permutedFpt(int[] v) {        List<int[]> VList =new ArrayList<int[]>();        VList.add(v);        for (int i = 1; i < simHash.blockNum; i++) {            int[] tempV = v;            int k=this.moveBits*i;   //移动的元素个数            tempV = Reverse(tempV, 0, this.hashbits-k-1);            tempV = Reverse(tempV, this.hashbits-k, this.hashbits-1);            tempV = Reverse(tempV, 0, this.hashbits-1);            VList.add(tempV);        }        return VList;    }       private int[] Reverse(int[] v, int b, int e) {        for(; b < e; b++, e–)        {        int temp = v[e];        v[e] = v[b];        v[b] = temp; … 继续阅读

String,StringBuffer与StringBuilder

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String … 继续阅读

java导入UTF-8词典第一行不匹配问题

做字符串匹配过程中要经常导入一些usrdict or stopdict,但是把文件转为utf-8格式,并且在java中以utf-8方式导入时都会出现词典第一行字符无法匹配的问题,但是debug变量,字符显示是完全一样的,那么问题出在那里? 把正常的dict和有问题的dict用UltraEdit打开: 然后利用UltraEdit用16进制看两个文件的不同,会发现有问题的dict文件表头多了一串二进制。 问题应该是出在从其他格式文件转向UTF-8时。所以最好是直接复制一份没问题的UTF-8文件然后导入词典。 不要太相信字符串显示

Reading two Patents about Chinese Query Refinement by Google Inc.

1. Systems and methods for translating Chinese pinyin to Chinese characters [Link]        a). Systems and methods to process and translate pinyin to Chinese characters and words are disclosed.        b). 2. Systems and methods for spell correction of non-roman characters … 继续阅读

simHash是否适合短文本的相似文本匹配

附注:用BigInteger类型来存储64位的hash码 http://doc.java.sun.com/DocWeb/api/all/java.math.BigInteger 很好用,xor()异或、BigInteger.bitLength()取位长、.bitCount()取位为1的个数。 simHash算法流程: 1): 计算simHash码 a). 字符串String分词得到tokens;        b). 计算每个tokens的64位Hash码;        c). 按Hash码的位进行标记,1则标记为1、否则标记为-1;        d). 把每个tokens的Hash码按位进行统计求和;        e). 进行签名,大于0则为1,否则为0,得到64位simHash指纹。 2): 把64位simHash码均分为汉明距离n+1块,方便后续查找的所有近邻simHash码; 3): 计算两个simHash码的汉明距离,        方法一:给出simHash的64位二进制码字符串:str1.charAt(i) != str2.charAt(i);        方法二:给出simHash的int值:先做异或,然后统计异或后二进制位数为1的个数 问题!?:simHash在短文本的可行性! 测试相似文本的相似度与汉明距离 测试文本:20个城市名作为词串:北京,上海,香港,深圳,广州,台北,南京,大连,苏州,青岛,无锡,佛山,重庆,宁波,杭州,成都,武汉,澳门,天津,沈阳 相似度矩阵: simHash码: 勘误:0.667, Hm:13 是对比的msg 1与2。 可见:相似度在0.8左右的Hamming距离为7,只有相似度高到0.9412,Hamming距离才近到4,此时,反观Google对此算法的应用场景:网页近重复。 … 继续阅读

关于SimHash算法原理

最近发邮件讨论Semantic Hashing的同学和同事很多,推荐李老师的文献列表供大家参阅:http://cs.nju.edu.cn/lwj/L2H.html 前言: SimHash: Similarity Estimation Techniques from Rounding Algorithms 2002 A locality sensitive hashing scheme: sim(x,y). is a method of performing probabilistic dimension reduction of high-dimensional data. MinHash(Min-wise independent permutations): is a technique for quickly estimating how similar two … 继续阅读