匹配字符串前缀以构建Radix搜索树的最快方法是什么?

时间:2014-09-09 11:42:17

标签: java string algorithm data-structures boggle

完全披露这是针对算法类中的赋值,但我不是在寻找某人为我编写任何代码或握住我的手。无论如何我们必须做Boggle游戏。对于那些没有意识到的人,基本上你会得到一个Boggle板,并且必须找到尽可能多的单词,这可能会花费大量的时间给出递归的字符串可能性。

为了缩短OP时间,我们鼓励使用我们想要尝试的任何算法,并在我们进行时“清除”字符串。目前我有一个系统可以通过将它们存储在字典中找到所有可能的3个字母后缀,如果字符串有3个字母但不匹配任何有效的后缀,则递归停止。

问题的关键,我正在尝试实现Radix后缀树,目前它看起来像这样

public static class BoggleRadix
{
    private Node root;

    public BoggleRadix()
    {

    }

    public class Node
    {
        public Node()
        {
           List<Edge> nodeEdges = new List<Edge>() 
           {

           }
        }

    }

    public class Edge
    {
        public String edgeString;
        public Node edgeNode;

        public Edge()
        {

        }
        public Edge(String s, Edge e)
        {
            this.edgeString = s;
            this.edgeNode = e;
        }

    }

} 

所以我将指针存储在一个无序列表中,这意味着如果我正在检查后缀,我可以预期,更糟糕的情况下,26个操作甚至可以找到我需要继续在树下继续的后缀指针。

有没有办法加快插入速度,流程排队?是否值得在内存中为每个节点构建一个小字典,以检查后缀存在的第一个字母?这是微不足道的,甚至不重要吗?

1 个答案:

答案 0 :(得分:1)

我同意jimktrains建议使用数组而不是后缀的链表。您可以将大写ASCII字母c转换为带有(int)c - (int)'A'的数组索引。对我的系统字典的测试表明,只有几千个三字母前缀,因此空间使用不应该是一个问题。

另一方面,您可以将整个字典存储为deterministic acyclic finite state automaton。那么尝试节省空间可能是明智之举。我会建议一个位图,而不是二分法搜索,这是不可预测的分支。在每个节点中,对于每个占用的索引int bitmap;,字段|等于0的按位OR((1 << i)运算符,标识元素i)在未压缩的数组中。然后,要测试是否存在未压缩的索引i,请检查bitmap & (1 << i)是否为非零。如果是这样,那么压缩数组的索引是Integer.bitCount(bitmap & ((1 << i) - 1))