4 ms·
I'm not really a data structures guy, but I love anagrams. When i wrote the anagramica API, the simplest way that I could come up with a fast search was this:
by binarymax 12y ago
I'm not really a data structures guy, but I love anagrams. When i wrote the anagramica API, the simplest way that I could come up with a fast search was this:
- Take a word and sort its characters.
- Add it to a dictionary where the key is the sorted characters and the value is the word.
- If the sorted characters already exist in the dictionary then add it to the list of words for the same key.
This gives O(log n) when you give it a list of letters and you need to find all the possible words.
What benefits do GADDAG offer over the above?
- lifthrasiir 12y agoSince finding a set of possible moves given the current Scrabble board is not quite equal to finding anagrams. To make a move in Scrabble you need to find words that, for example, have both E and L characters which are separated by two other letters (i.e. /^.{0,}E..L.{0,}$/) when the board contains a row or column with the same pattern (E, followed by two spaces and then L). A simple anagram list cannot efficiently search for such patterns.
- binarymax 12y agoThanks, this makes perfect sense. It probably also accounts for the blank tile in scrabble. Still seems like a hybrid approach could be done to avoid that huge data structure. I'll do some more reading :)
- nathell 12y agoThe thing is that it's not huge. A packed in-memory representation should still be easily traversable and take up less than the space of a plain list of words. See also http://sun.aei.polsl.pl/~mciura/publikacje/lexicon.pdf http://sun.aei.polsl.pl/~mciura/publikacje/lexicon.pdf for more ideas about in-memory lexicon representation.
- dbaupp 12y agoIn O(log n), what is n? The number of characters? I would've thought that was O(n log n) (due to the sort).
- emillon 12y agon is the number of words in the dictionary.
- binarymax 12y agoYes good point, allow me to clarify. n is the number of keys in the dictionary (log n for the binary search). I suppose yes it is probably the more complex O(n log n) to sort the letters before the search.
- bradleyjg 12y agoIf n is the number of keys in the dictionary, then the whole procedure would not be O(n log n), it'd be O(m log n) where m is the number of letters. Given that n >> m, I would think your original statement is correct.
- dbaupp 12y agoOh, so I guess it is strictly O(m log m + log n) if m is the number of letters. You can theoretically get it to be O(m log m) using a hashmap (makes lookups O(1)) or trie (lookups are O(m)).
- emillon 12y agoI believe that there is no benefit in using a GADDAG. Finding an anagram is an easier problem as you know that you will use all the letters, so sorting them is the optimal solution. But this method does not work with scrabble since you would have (at least) to find all anagrams of all subsets, which adds an exponential step.
- nathell 12y agoWhen you are building a Scrabble engine and need to construct the list of potential moves, GADDAGs come in handy as you are able to "cast" your search from subgraphs "anchored" at letters already on board. A sample implementation (in not very idiomatic Clojure, not touched in years, and using DAWGs instead of GADDAGs): https://github.com/nathell/spleen/blob/master/src/pl/danieljanus/spleen.clj#L278 https://github.com/nathell/spleen/blob/master/src/pl/danielj...