Trie树代码模板

常用算法代码模板总结

目录

基础知识

练习题目:Trie字符串统计

练习题目:最大异或对


基础知识

Trie树作用:可以高效地存储和查找字符串集合的数据结构,Trie树的核心实现是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希高。其核心思想是利用公共前缀来减少实际查询量

特性:①结点本身不存完整单词②从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串③每个结点的所有子结点路径代表的字符都不相同。

练习题目:Trie字符串统计

java题解

import java.util.Scanner;

public class Main {
	static int Index = 0;// 可以将Index理解为插入的节点个数
	static int[][] ch = new int[100010][26];
	static int[] cnt = new int[100010];

	public static void Insert(String str) {
		int p = 0;
		for (int i = 0; i < str.length(); i++) {
			int a = str.charAt(i) - 'a';
			if (ch[p][a] == 0)// 如果字符对应的路径没有开通
				ch[p][a] = ++Index;// 开通这个字符对应的路,然后标明是第几个插入的节点
			p = ch[p][a];// p跳转到这一个节点
		}
		cnt[p]++;
	}

	public static int Query(String str) {
		int p = 0;
		for (int i = 0; i < str.length(); i++) {
			int a = str.charAt(i) - 'a';
			if (ch[p][a] == 0)
				return 0;
			p = ch[p][a];
		}
		return cnt[p];
	}

	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();

		for (int i = 0; i < n; i++) {
			String ch1 = input.next();
			String str1 = input.next();
			if (ch1.equals("I"))
				Insert(str1);
			else
				System.out.println(Query(str1));
		}
	}
}

练习题目:最大异或对

java题解

import java.util.Scanner;

public class Main {
	static int Index = 0;// 记录下一个节点的位置
	static int[] nums = new int[100010];
	static int[][] node = new int[3100010][2];

	// 最大异或对,异或俗称不进位加法,那么相同位的数字要不同才能达到最大异或对
	public static void Insert(int number) {// 将这个数按照二进制的方式插入到树中
		int p = 0;
		for (int i = 30; i >= 0; i--) {// 最大的数表示为2进制,构成的树最深31层
			int s = node[p][number >> i & 1];// 这里存放的数字大于0表示这条路开通,实际存放的数字是下一个节点的下标
			if (s == 0) {
				s = ++Index;
				node[p][number >> i & 1] = s;
			}
			p = s;
		}
	}

	public static int Search(int number) {// 查询操作
		int p = 0;
		int result = 0;
		for (int i = 30; i >= 0; i--) {
			int a = number >> i & 1;// 获取第i位的数字
			if (node[p][a ^ 1] > 0) {// a=1,走0 a=0,走1
				result += 1 << i;
				p = node[p][a ^ 1];
			} else
				p = node[p][a];
		}
		return result;
	}

	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		for (int i = 0; i < n; i++) {
			nums[i] = input.nextInt();
			Insert(nums[i]);
		}
		int maxVal = 0;
		for (int i = 0; i < n; i++)// 每一个数都查询一遍,取最大值
			maxVal = Integer.max(maxVal, Search(nums[i]));
		System.out.println(maxVal);

	}
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算不出来没办法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值