2015-06-14 48 views
-3

我必須選擇一個數據結構,我需要下面我正在解釋的條件,完善的數據結構有以下值搜索用於存儲和檢索的元素

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中我將不得不在搜索鍵的項目中找到相應的值,在非常快的時間內也不會碰到性能太高的數據結構,性能應該是v ERY高

請告知人們也將是巨大的,如果有人可以告訴我展示瞭如何可以做到這一點使用數字樹木

+2

爲什麼不只是使用HashMap? –

+0

將字符串映射爲值的散列表和用於存儲從值到字符串的「集合」的逆映射的散列表。 – saadtaame

+0

@OliverCharlesworth感謝您的建議,但仍然無法掌握請求您請詳細解釋如果可能請詳細解釋一些代碼可以幫助理解更多 –

回答

0

由於意見建議,如果你可以簡單地使用一個HashMap或HashTable的,
堅持自己實施一個結構我會建議一個搜索結果。
在搜索行中,檢索數據所需的最大比較次數等於所用密鑰的長度,因此要檢索給定鍵(abc,def,rty,ytr,dft)的數據,需要進行3次比較
考慮以下維基百科鏈接:https://en.wikipedia.org/wiki/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")); 
    } 
} 
+0

非常感謝,請您詳細解釋一下上面的代碼如何工作將有助於銼刀更多謝謝 –

+0

也請解釋說,如上所述在搜索trie中,檢索數據所需的最大比較次數等於所用密鑰的長度,因此可以說我把case長度爲6,一個密鑰長度爲10,那麼它會影響性能 –

+0

@eretg ghg搜索特里是一種數據結構,樹中的每個節點都可以說是密鑰中的一個字符,請查看維基百科文章,這應該比評論中的結構更好地解釋結構,關於密鑰長度爲6或10的點,如果你有很少的密鑰,它確實會影響性能,但考慮密鑰長度爲10,我們可以從62^10個可能的密鑰中找出10個比較中的任何密鑰!如果你的鍵數不多,不管你使用哪種算法,你都會得到類似的性能,例如(線性搜索或二分搜索) – user1979637

0

反鍵和價值觀,使用Multimap數據結構。在這裏看到關於Multimap的好文章。 http://tomjefferys.blogspot.com/2011/09/multimaps-google-guava.html

@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")); 

} 
+0

謝謝能請你指教,請問如何才能幫我解決上面的問題陳述,請你發帖幫我把握的代碼 –

+0

你能特意解釋一下上面的程序中發生了什麼特別的情況,以倒轉多圖專題發生在invertFrom部分 –