我正在研究一种使用二分搜索进行部分匹配的方法。这是我的代码:
public void checkCardIndexForMatches(List<String> wordsToCheck) throws IOException {
String[] cardIndexCache = cardIndexCreator.getCardIndexCache();
for (String text: wordsToCheck){
int i = Arrays.binarySearch(cardIndexCache, text.getText().toLowerCase().trim());
if (i > 0){
text.setCardIndexMatch(true);
}
//check if partial match
// else if
}
}
所以它到目前为止非常简单 - 基本上有一个外部文件可以被输入,文件中的每一行都作为一个数组存储在cardIndexCache中。当用户希望能够匹配数组中的“短语”(短语是多于一个单词,例如穆罕默德·阿里)时,就会出现问题。 wordsToCheck参数中的单词仅作为单个单词传递。所以第一个单词将是穆罕默德,但二进制搜索失败,因为它不知道第二个单词是什么。我想不出一个简单的方法来获得二进制搜索,以指示一个单词有可能成为匹配(第一部分匹配,只需附加下一个单词并查看是否匹配)。
任何想法都非常感谢!
答案 0 :(得分:0)
这是一个Trie,我写了一个基本上找到最大公共前缀的搜索功能,相似性搜索是可能的但是代价很高......
class TNode
{
public MapList<Char,TNode> next;
public TNode ()
{
next = new MapList<Char,TNode>();
}
}
class Trie
{
TNode head;
public Trie ()
{
head = new TNode();
}
public void insert (String t)
{
TNode cur = head;
for (Char c : t.toCharArray())
{
if (!cur.next.containsKey(c))
{
cur.next.put(c,new TNode());
}
cur = cur.next.get(c);
}
}
public boolean remove (String t)
{
Stack<Pair<Char,TNode>> path = new Stack<Pair<Char,TNode>>();
TNode cur = head;
Pair<Char,TNode> n = null;
for (Char c : t.toCharArray())
{
if (!cur.next.containsKey(c))
{
return false;
}
path.push(c,cur);
cur = cur.next.get(c);
}
while (path.size() > 0)
{
n = path.pop();
if (n.getSecond().next.get(n.getFirst()).next.size() > 1)
{
break;
}
else
{
n.getSecond().next.remove(n.getFirst());
}
}
}
public boolean search (String t)
{
TNode cur = head;
for (Char c : t.toCharArray())
{
if (!cur.next.containsKey(c))
{
return false;
}
cur = cur.next.get(c);
}
return true;
}
public String searchMaxPrefix (String t)
{
TNode cur = head;
String match = "";
for (Char c : t.toCharArray())
{
if (cur.next.containsKey(c))
{
match += c;
}
else
{
break;
}
}
return match;
}
}