字典树

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

可以用指针或者静态数组实现

指针实现:

public class TrieNode {
	public int path;
	public int end;
	public TrieNode[] map;

	public TrieNode() {
		path = 0;
		end = 0;
		map = new TrieNode[26];// 26个字母
	}
}

public void insert(String word) {
	if (word == null)
		return;
	TrieNode node = root;
	node.path++;
	char[] words = word.toCharArray();
	int index = 0;
	for (int i = 0; i < words.length; i++) {
		index = words[i] - 'a';
		if (node.map[index] == null) {
			node.map[index] = new TrieNode();
		}
		node = node.map[index];
		node.path++;
	}
	node.end++;
}
public boolean search(String word) {
	if (word == null)
		return false;
	TrieNode node = root;
	char[] words = word.toCharArray();
	int index = 0;
	for (int i = 0; i < words.length; i++) {
		index = words[i] - 'a';
		if (node.map[index] == null)
			return false;
		node = node.map[index];
	}
	return node.end > 0;
}

数组实现:

class Node {
    int[] ch = new int[26];
    int flag;

    public Node() {
        flag = -1;
    }
}
public void insert(String s, int id) {
    int len = s.length(), add = 0;
    for (int i = 0; i < len; i++) {
        int x = s.charAt(i) - 'a';
        if (tree.get(add).ch[x] == 0) {
            tree.add(new Node());
            tree.get(add).ch[x] = tree.size() - 1;
        }
        add = tree.get(add).ch[x];
    }
    tree.get(add).flag = id;
}
public int findWord(String s, int left, int right) {
    int add = 0;
    for (int i = right; i >= left; i--) {
        int x = s.charAt(i) - 'a';
        if (tree.get(add).ch[x] == 0) {
            return -1;
        }
        add = tree.get(add).ch[x];
    }
    return tree.get(add).flag;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值