/** * Recursively adds <code>newNode</code> as <code>src</code> node's child. * * @param src * @param newNode */ private void addInternal(BKNode src, BKNode newNode) { if (src.equals(newNode)) return; int distance = distance(src.name, newNode.name); BKNode bkNode = src.childAtDistance(distance); if (bkNode == null) { src.addChild(distance, newNode); } else addInternal(bkNode, newNode); }
/** * O(log(n)) BK Search * * @param node * @param maxDistance * @return */ public List<String> search(String node, int maxDistance) { int distance = distance(this.name, node); List<String> matches = new LinkedList<String>(); if (distance <= maxDistance) matches.add(this.name); if (children.size() == 0) return matches; int i = max(1, distance - maxDistance); for (; i <= distance + maxDistance; i++) { BKNode child = children.get(i); if (child == null) continue; matches.addAll(child.search(node, maxDistance)); } return matches; }
/** * Exact word search, same as {@link search(String, 1)} * * @param q * @return match or empty string. */ public String search(String q) { List<String> list = root.search(q, 1); return list.isEmpty() ? "" : list.iterator().next(); }
/** * Performs a fuzzy search. * * @param q * @param maxDist * @return */ public List<String> search(String q, int maxDist) { return root.search(q, maxDist); }