@Override
	public List<String> fuzzySearch(TrieNode node, String query, int count) throws Exception {
        if (query.length() < CRITICAL_FUZZY_LENGTH) {
        	// TODO: Maybe we do regular search here....
        	return new ArrayList <String> ();
        }
		
		List <String> results = null;

		// get all fuzzy word combinations
		List <Word> words = Fuzzy.blur(INDEL_DISTANCE, query);
		
        List <Word> wordRes = new ArrayList <Word> (); // This is our list of results
        Map <String, Integer> noDups = new HashMap <String, Integer> (); // Temp map to assure no duplicate strings.
                
        long start = System.currentTimeMillis();

        // Set up heuristics for this trie
		setTreeHeuristics(node);
		
		// Loop through fuzzy words, getting possible results for each one.
        for (Word word : words) {
        	results = node.findByHeuristic(word.getValue(), count);
        	
        	// Add results for single word to over all list of results
        	for (String result : results) {
        		if (result.length() <= ((query.length() * MAX_LENGTH_MULTIPLIER) + 3)) {
        			Integer i = noDups.get(result);
        			if (i == null) {
        				wordRes.add(new Word(result, word.getDistance()));
        				noDups.put(result, wordRes.size() - 1);
        			} else {
        				if (wordRes.get(i.intValue()).getDistance() > word.getDistance()) {
        					wordRes.set(i.intValue(), new Word(result, word.getDistance()));
        				}
        			}
        		}
        	}
        	results.clear();
        }
        
        long end = System.currentTimeMillis();
//        System.out.println("Gathering results time: " + (end - start));
        
        // Adjust distance based on word length and multiplier
        for (int i = 0; i < wordRes.size(); i++) {
        	Word next = wordRes.get(i);
        	next.setDistance(next.getValue().length() - (next.getDistance() * ADJUSTED_DISTANCE_MULTIPLIER));
        	wordRes.set(i, next);
        }
        
//        System.out.println("size: " + wordRes.size());
//        System.out.println("size without dups: " + noDups.size());
                
        // sort by adjusted distance, largest distance to smallest distance
        start = System.currentTimeMillis();
        QuickSort <Word> sort = new QuickSort <Word> ();
        sort.sort(wordRes);
        
        end = System.currentTimeMillis();
//        System.out.println("Sorting time: " + (end - start));

//        System.out.println(">>> results:");
        for (Word next : wordRes) {
//        	System.out.println("val: " + next.getValue() + ", dist: " + next.getDistance());
        	results.add(next.getValue());
        	if (results.size() >= count) {
        		break;
        	}
        }
		return results;
	}