多叉树结构实现搜索算法

package com.mvbox.utility;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author 007
 * @date Apr 7, 2015 10:50:40 AM
 * @version V1.0
 * @Description: TODO(DFA 多叉树结构实现搜索算法)
 * 
 */
public class DFA {

	/**
	 * 关键词词库
	 */
	private static String[] arr = null;

	/**
	 * 根节点
	 */
	private Node rootNode = new Node('R');

	private static DFA dfa;

	private DFA() {

	}

	public static DFA getInstance() {
		if (dfa == null) {
			dfa = new DFA();
		}
		return dfa;
	}

	/**
	 * 定期更新敏感词汇
	 * 
	 * @param newArr
	 */
	public void update(String[] newArr) {
		arr = newArr;
		createTree();
	}

	/**
	 * 检测是有存在关键字
	 * 
	 * @param content
	 * @return
	 */
	public boolean hasWord(String content) {
		synchronized (rootNode) {
			List word = new ArrayList();
			int a = 0;
			char[] chars = content.toCharArray();
			Node node = rootNode;
			while (a < chars.length) {
				node = findNode(node, chars[a]);
				if (node == null) {
					node = rootNode;
					a = a - word.size();
					word.clear();
				} else if (node.flag == 1) {
					return true;
				} else {
					word.add(String.valueOf(chars[a]));
				}
				a++;
			}
			return false;
		}
	}

	/**
	 * 获取全部的关键字
	 * 
	 * @param content
	 * @return
	 */
	public List searchWord(String content) {
		synchronized (rootNode) {
			List words = new ArrayList();
			List word = new ArrayList();
			int a = 0;
			char[] chars = content.toCharArray();
			Node node = rootNode;
			while (a < chars.length) {
				node = findNode(node, chars[a]);
				if (node == null) {
					node = rootNode;
					a = a - word.size();
					word.clear();
				} else if (node.flag == 1) {
					word.add(String.valueOf(chars[a]));
					StringBuffer sb = new StringBuffer();
					for (String str : word) {
						sb.append(str);
					}
					words.add(sb.toString());
					a = a - word.size() + 1;
					word.clear();
					node = rootNode;
				} else {
					word.add(String.valueOf(chars[a]));
				}
				a++;
			}
			return words;
		}
	}

	/**
	 * 建树
	 */
	private void createTree() {
		Node tempRootNode = new Node('R');
		for (String str : arr) {
			char[] chars = str.toCharArray();
			if (chars.length > 0) {
				insertNode(tempRootNode, chars, 0);
			}
		}

		synchronized (rootNode) {
			rootNode = tempRootNode;
		}
	}

	private void insertNode(Node node, char[] cs, int index) {
		Node n = findNode(node, cs[index]);
		if (n == null) {
			n = new Node(cs[index]);
			node.nodes.add(n);
		}

		if (index == (cs.length - 1)) {
			n.flag = 1;
		}

		index++;
		if (index < cs.length) {
			insertNode(n, cs, index);
		}
	}

	private Node findNode(Node node, char c) {
		List nodes = node.nodes;
		Node rn = null;
		for (Node n : nodes) {
			if (n.c == c) {
				rn = n;
				break;
			}
		}
		return rn;
	}

	public static void main(String[] args) throws InterruptedException {
		DFA dfa = new DFA();
		arr = new String[1000000];
		arr[0] = "DFA";
		arr[1] = "薄格";

		long start = System.currentTimeMillis();
		for (int i = 2; i < 1000000; i++) {
			arr[i] = String.valueOf(i);
		}
		System.out.println("init arr  use time=" + (System.currentTimeMillis() - start));

		long createTreestart = System.currentTimeMillis();
		dfa.createTree();
		System.out.println("create tree use time=" + (System.currentTimeMillis() - createTreestart));

		long searchWordstart = System.currentTimeMillis();
		System.out.println(dfa.searchWord("RHello DFA World DFA, HaHa! 恶心 DFA DADADADADA  4 5 6 7 8111212121 9 111111"));
		System.out.println("search word use time=" + (System.currentTimeMillis() - searchWordstart));

		System.out.println(dfa.hasWord("RHello"));

		arr = new String[3];
		arr[0] = "DFA1";
		arr[1] = "薄格";
		arr[2] = "";
		dfa.update(arr);
		long searchWordstart1 = System.currentTimeMillis();
		System.out.println(dfa.searchWord("薄格 DAF DFA"));
		System.out.println("search word use time=" + (System.currentTimeMillis() - searchWordstart1));
		Thread.sleep(50000);
	}

	private static class Node {
		public char c;
		public int flag; //1:表示终结,0:延续   
		public List nodes = new ArrayList();

		public Node(char c) {
			this.c = c;
			flag = 0;
		}
	}
}

你可能感兴趣的:(JAVA)