ICTCLAS 2分法查询词典库

今天学习了二分法查询词典库,现将代码粘贴如下:

public int findInOriginalTable(int index, String res, int handle) {
        int result = -1;

        if (res != null && wts != null) {
            WordTable wt = wts.get(index);
            if (wt != null && wt.getCount() > 0) {
                int start = 0;
                int end = wt.getCount() - 1;
                int mid = (end + start) / 2;
                ArrayList<WordItem> wis = wt.getWords();
                while (start <= end) {
                    WordItem wi = wis.get(mid);
                    int cmpValue = GFString.compareTo(wi.getWord(), res);//词典中的相对位置
                    if (cmpValue == 0 && (wi.getHandle() == handle || handle == -1)) {//1
                        if (handle == -1) {
                            while (mid >= 0 && res.compareTo(wis.get(mid).getWord()) == 0) {
                                mid--;
                            }
                            if (mid < 0 || res.compareTo(wis.get(mid).getWord()) != 0)
                                mid++;
                        }

                        result = mid;
                        return result;

                    } else if (cmpValue < 0 || cmpValue == 0 && wi.getHandle() < handle && handle != -1)//2
                        start = mid + 1;
                    else if (cmpValue > 0 || cmpValue == 0 && wi.getHandle() > handle && handle != -1)//3
                        end = mid - 1;

                    mid = (start + end) / 2;
                }
            }
        }
        return result;
    }


在这里我想说的不是2分法的实现,我是想说方法中的几种情况如上图代码中1,2,3所在位置,我在思考除了这几种情况外是否还有其他的情况,显然是有的如:

(1) if (cmpValue < 0 || cmpValue == 0 && wi.getHandle() > handle && handle != -1)   

(2)if (cmpValue > 0 || cmpValue == 0 && wi.getHandle() < handle && handle != -1)

那么现在讨论这种情况,解释下为什么这种情况没有在代码中出现:

自己臆想的这么认为当cmpValue<0时也就是词典中的词的顺序在所要查词的前面,而   wi.getHandle() > handle所隐含表示的是词典中的词的顺序在所要查词的后面,应该是相互矛盾。所以这种情况不存在 。在开始读到此处时,感觉从少了点什么。当看到如下图时才知道是这样的,自己又确定了不少,真心的希望各位大猿们给予建议.

如果想更好地了解此方面知识:http://www.cnblogs.com/zhenyulu/articles/668024.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值