摘要: 搜索绝对不仅仅是搭起框架,跑出结果就完成的工作,之后分词、排序等等的优化才是重头戏。先交代下背景:这个搜索是我一个人负责搭建并优化的项目,主要索引对象为歌曲、歌手MV等等。使用技术:Lucene、IK_Analyzer既然这篇博客是关于中文分词的优化,那么先看我现在的搜索有什么问题存在:分词不准确 ... 阅读全文
posted @ 2015-09-24 15:27 @瞪着太阳的乌鸦 阅读(9000) 评论(2) 推荐(5) 编辑
摘要: 大家都知道,在多线程或多进程的环境中,对统一资源的访问需要特别小心,特别是在写资源时,如果不加锁,将会导致很多严重的后果,Lucene的索引也是如此,lucene对索引的读写分为IndexReader和IndexWriter,顾名思义,一个读,一个写,lucene可以对同一个索引文件建立多个Inde... 阅读全文
posted @ 2015-09-17 11:13 @瞪着太阳的乌鸦 阅读(4679) 评论(2) 推荐(0) 编辑
摘要: 无向图:一些关于图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成。连通图:如果从任意一个顶点都存在一条路径到达另一个任意顶点,就称为连通图,一个非连通图由若干连通的部分组成,都称为极大连通子图。无向图:即连接两个顶点的边是没有方向的。无向图的数据结构:使用邻接表来表示图:如上图所示,使用一个... 阅读全文
posted @ 2015-09-14 09:55 @瞪着太阳的乌鸦 阅读(28386) 评论(1) 推荐(3) 编辑
摘要: 平衡查找树在之前的二分搜索和二叉查找树中已经能够很好地解决查找的问题了,但是它们在最坏情况下的性能还是很糟糕,我们可以在查找二叉树中,每次动态插入或删除某结点时,都重新构造为完全二叉树,但是这样代价太大,所以就引出了平衡查找树。详细的数学定义就不给出了,因为既不直观也记不住,直接给出一个平衡二叉树的... 阅读全文
posted @ 2015-09-10 10:42 @瞪着太阳的乌鸦 阅读(4974) 评论(2) 推荐(1) 编辑
摘要: 二分查找二分查找的原理很简单:在一个有序数组中(本文讨论的是升序,降序同理)从数组中间的元素开始,如果A[mid]大于被查找元素key,那么就在A[0]到A[mid-1]中查找,反之在A[mid++]到A[A.lenth - 1]中查找。从这看来,递归的意味又很浓啊,当然也可以用非递归的方式,效率更... 阅读全文
posted @ 2015-09-09 11:23 @瞪着太阳的乌鸦 阅读(4744) 评论(0) 推荐(0) 编辑
摘要: 优先队列我们经常会碰到下面这种情况,并不需要将所有数据排序,只需要取出数据中最大(或最小)的几个元素,如排行榜。那么这种情况下就可以使用优先队列,优先队列是一个抽象数据类型,最重要的操作就是删除最大元素和插入元素,插入元素的时候就顺便将该元素排序(其实是堆有序,后面介绍)了。二叉堆二叉堆其实是优先队... 阅读全文
posted @ 2015-09-07 12:35 @瞪着太阳的乌鸦 阅读(2598) 评论(2) 推荐(0) 编辑
摘要: 快速排序快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。在归并排序中,递归调用发生在处理整个... 阅读全文
posted @ 2015-09-06 15:37 @瞪着太阳的乌鸦 阅读(2354) 评论(0) 推荐(1) 编辑
摘要: 归并排序归并排序基本的操作是合并两个已排序的数组,如下面的例子:A:{1,2,4,7}B:{2,2,5,9}第一步:比较A[0]和B[0],A[0] mid) a[k] = b[j++]; //第二个有序子数组已经遍历完 el... 阅读全文
posted @ 2015-09-05 14:43 @瞪着太阳的乌鸦 阅读(2008) 评论(0) 推荐(1) 编辑
摘要: 基本排序算法 阅读全文
posted @ 2015-09-04 18:53 @瞪着太阳的乌鸦 阅读(38619) 评论(3) 推荐(1) 编辑
摘要: 前面介绍了Ternary Search Tree和它的实现,那么可以用Ternary Search Tree来实现搜索框的只能提示,因为Ternary Search Tree的前缀匹配效率是非常高的,总体思路如下(其中很多可以根据自己的需要修改,我只是写出我的做法):比如搜索歌曲时智能提示:建立Te... 阅读全文
posted @ 2015-06-18 14:29 @瞪着太阳的乌鸦 阅读(712) 评论(1) 推荐(0) 编辑