2015-04-16 25 views
8

Tôi có một số lớn thiết lập các chuỗi và tôi muốn tạo một tính năng tự động đề xuất cho nó.Hiệu quả nhận được tập hợp con của chuỗi "startingWith" ra khỏi một tập hợp

Giả bộ là ["foo", "fighter"]

"f" nên trả lại cả hai giá trị, và gõ "fo" chỉ nên trở "foo".

Hiện tại tôi chỉ đang lặp qua tập hợp và ghi lại kết quả bằng cách gọi startsWith, tuy nhiên quá chậm.

Tiêu chuẩn TreeSet với các chức năng tập hợp con của nó sẽ không giúp ích gì nhiều vì nó chỉ thực hiện một cây RB.

Có giải pháp hiệu quả trong API Java hoặc tôi có phải xây dựng triển khai Set của riêng mình không?


Edit: thực hiện của tôi trông như thế này, sử dụng Andrey Naumenkos trie datastructures. Thông báo để tăng kích thước mảng nếu bạn muốn sử dụng ký tự ASCII mở rộng. Nếu bạn sử dụng List thay vì Map bạn sẽ nhận được kết quả theo thứ tự được sắp xếp.

public Set<String> getSubset(String s) { 
    result = new HashSet<String>(); 
    getSubset(root, s); 
    return result; 
} 

private void getSubset(TrieNode node, String s) { 
    TrieNode n = node; 
    for (char ch : s.toCharArray()) { 
     if (n.children[ch] != null) { 
      n = n.children[ch]; 
      continue; 
     } 
     return; 
    } 
    getSubsetR(n, s); 
} 

private void getSubsetR(TrieNode node, String s) { 
    for (char ch = 0; ch < node.children.length; ch++) { 
     TrieNode child = node.children[ch]; 
     if (child != null) 
      getSubsetR(child, s + ch); 
    } 
    if (node.leaf) { 
     result.add(s); 
    } 
} 

Trả lời

11

gì bạn đang tìm kiếm là một tiền tố cấu trúc dữ liệu cây: http://en.wikipedia.org/wiki/Trie

Mã này ở đây sẽ giúp bạn bắt đầu: https://sites.google.com/site/indy256/algo/trie

+0

Apache commons thi hành một Trie compresed: https: // commons. apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/trie/PatriciaTrie.html – Ezequiel

+1

Biết cơ sở hạ tầng nhưng quên tên. Đây chính xác là những gì tôi đang tìm kiếm. Làm việc hoàn hảo sau những thay đổi nhỏ. Cảm ơn bạn. –

Các vấn đề liên quan