今天学习了二分法查询词典库,现将代码粘贴如下:
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