搜索完美的数据结构以存储和检索元素

时间:2015-06-14 13:45:36

标签: java data-structures tree

我必须在下面为我的需要选择一个数据结构我正在解释有以下值的条件

abc,def,rty,ytr,dft   which all are map to row R1B1 (actully key is combination of R1+B1)
abEERc,dFFFef,rGGty   which all are map to row R1B2 (actully key is combination of R1+B2)


  KEY                      VALUE
abc,def,rty,ytr,dft --->    R1B1
abEERc,dFFFef,rGGty --->    R1B2

现在,例如,让我们说,如果我得到ytr,那么我将能够检索R1B1 或者,让我们说,我得到的值rGGty然后我就可以检索R1B2

现在的情况是问题是搜索,复杂性以及事情必须顺序进行所花费的时间

例如,它会首先选择要搜索ytr的第一行,它会先与abc匹配,但不匹配,然后必须与def匹配再次匹配,然后它将与rty匹配,这将不匹配,然后它将最终与ytr匹配,最后它将找到关键R1B1最终

类似地,如果需要搜索第二个字符串,请说rGGty然后它将扫描第一行,它将找不到该值,然后搜索将继续到第二行,也在第三行中的第二行会得到rGGty作为元素,然后它会将R1B2检索为值

让我们说,如果将这个东西放在地图中,那么序列搜索将继续关键,然后只有我们才能找到相应的值

请各位建议哪些是我能在java中实现的最佳数据结构,我必须在非常快的时间内搜索关键项以找到相应的值,这也不会影响性能 ,那种数据结构性能应该很高

如果有人可以建议我展示如何使用数字树实现这一目标,请告知伙计

2 个答案:

答案 0 :(得分:0)

正如评论建议你可以简单地使用HashMap或HashTable,如果你坚持自己实现一个结构,我会建议搜索trie。
在搜索中查找最大比较次数检索数据所需的时间等于所用密钥的长度,因此要检索给定密钥(abc,def,rty,ytr,dft)的数据,需要进行3次比较。 请考虑以下维基百科链接:https://en.wikipedia.org/wiki/Trie
下面是我快速和脏的搜索trie实现(如果键是标准的ASCII字母):) - -

public class DictionaryNode 
{
    DictionaryNode next[];
    String data;
    DictionaryNode()
    {
        next=new DictionaryNode[128];
        for(int i=0;i<next.length;i++)
        {
            next[i]=null;
        }
        data=null;
    }
}

public class Dictionary 
{
    DictionaryNode root;
    Dictionary()
    {
        root = new DictionaryNode();
    }
    public boolean add(String key,String data)
    {
        char[]ch=key.toCharArray();
        DictionaryNode current=root;
        for(int i=0;i<ch.length;i++)
        {
            if(current.next[ch[0]]==null)
            {
                current.next[ch[0]]=new DictionaryNode();
            }
            current=current.next[ch[0]];
        }
        if(current.data==null)
        {
            current.data=data;
            return true;
        }
        else
        {
            return false;
        }
    }
    public String search(String key)
    {
        char[]ch=key.toCharArray();
        DictionaryNode current=root;
        for(int i=0;i<ch.length;i++)
        {
            if(current.next[ch[0]]==null)
            {
                return null;
            }
            else
            {
                current=current.next[ch[0]];
            }
        }
        return current.data;
    }
}

public class main {
    public static void main(String []args)
    {
        Dictionary d=new Dictionary();
        d.add("abc", "R1B1");
        d.add("def", "R1B1");
        d.add("rty", "R1B1");
        d.add("ytr", "R1B1");
        d.add("dft", "R1B1");
        System.out.println(d.search("abc"));
        System.out.println(d.search("ab"));
    }
}

答案 1 :(得分:0)

在您的情况下反转键和值并使用Multimap数据结构。请参阅此处有关@Test public void getColor(){ Multimap<String,String> myMultimap = ArrayListMultimap.create(); myMultimap.put("R1B1","abc"); myMultimap.put("R1B2","def"); myMultimap.put("R1B2","abEERc"); myMultimap.put("R1B2","rGGty"); Multimap<String, String> invertedMultimap = Multimaps.invertFrom(myMultimap, ArrayListMultimap.<String, String>create()); System.out.println(invertedMultimap.get("abc")); } 的好文章。 http://tomjefferys.blogspot.com/2011/09/multimaps-google-guava.html

{{1}}