如何对BinarySearch()进行部分匹配

时间:2012-09-27 15:07:06

标签: java data-structures binary-tree

我正在研究一种使用二分搜索进行部分匹配的方法。这是我的代码:

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参数中的单词仅作为单个单词传递。所以第一个单词将是穆罕默德,但二进制搜索失败,因为它不知道第二个单词是什么。我想不出一个简单的方法来获得二进制搜索,以指示一个单词有可能成为匹配(第一部分匹配,只需附加下一个单词并查看是否匹配)。

任何想法都非常感谢!

1 个答案:

答案 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;
    }
}