Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a simple prefix index in Java?

I have big set of urls and I want to implement an autocompletion. I don't like the complexity of the naive approach as it is linear with the set size:

for(String url: urls) if(url.startsWith(input) {doSomething();}

Now I know that in a Hash Set, the function "contains()" works in "O(1)" but there is no "containsPrefix()". Is there a simple way without using a big library like Lucene or coding it myself? I would have no problem doing it but it seems overkill for such a simple problem so I want to know if there is an existing simple solution :-)

From my computer science classes I remember a tree which consists of string fragments but I forget how it was called. It worked like this:

[car, care, carrot,carrotville]->

car
|
-/
-e
-rrot
  |
  ----ville

P.S.: How do I call the methods that returns all strings that a string is prefix of? Like if a is prefix of b, what is b to a?

like image 691
Konrad Höffner Avatar asked Oct 08 '22 07:10

Konrad Höffner


2 Answers

If you need to efficiently find prefixes of strings, use a Trie, a data structure designed precisely for that purpose:

A trie, or prefix tree, is an ordered tree data structure that is used to store an associative array where the keys are usually strings. Unlike a binary search tree, no node in the tree stores the key associated with that node; instead, its position in the tree defines the key with which it is associated. All the descendants of a node have a common prefix of the string associated with that node, and the root is associated with the empty string

Two links with sample implementations.

like image 192
Óscar López Avatar answered Oct 12 '22 12:10

Óscar López


Long time ago I put a simple Trie implementation here:

http://code.google.com/p/triebag/source/browse/trunk/src/triebag/tries/SimpleTrie.java

However this is not a compact Trie, so it creates one node per character, creating a compact one is a bit trickier.

like image 26
mdakin Avatar answered Oct 12 '22 10:10

mdakin