首页 > 其他分享 >树哈希学习笔记

树哈希学习笔记

时间:2024-03-28 22:14:18浏览次数:25  
标签:head ull int mask 笔记 学习 edgenum 哈希

1. 作用

判断一些树是否同构。

2. 方法

2.1. 具体操作

这类方法需要一个多重集的哈希函数。以某个结点为根的子树的哈希值,就是以它的所有儿子为根的子树的哈希值构成的多重集的哈希值,即:

\[h_u=f(\{h_v|v\in son(u) \}) \]

其中\(h_x\)表示以\(x\)为根的子树的哈希值,\(f\)是多重集的哈希函数

以代码中运用的哈希方法为例,式子是:

\[h_u=(1+\sum_{v\in son(u)} g(h_v)) \bmod p \]

其中,g(i)表示整数到整数的映射,说人话就是一种运算,将一个整数转化为另一个整数

2.2. 代码

例题:[uoj763]树哈希(模板)

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
int n,head[1000005],edgenum;
struct edge{
	int to,nxt;
}e[2000005];
void add_edge(int u,int v)
{
	e[++edgenum].nxt=head[u];
	e[edgenum].to=v;
	head[u]=edgenum;
}
ull mask;
ull get_hash(ull x)
{
	x^=mask;
	x^=x<<13;
	x^=x>>7;
	x^=x<<17;
	x^=mask;
	return x;
}
ull h[1000005];
set<ull> tr;
void dfs(int u,int fa)
{
	h[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u);
		h[u]+=get_hash(h[v]);
	}
	tr.insert(h[u]);
}
int main()
{
	srand((unsigned)time(0));
	mask=1ll*rand()*rand();
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs(1,0);
	printf("%d",tr.size());
	return 0;
}

2.3. 正确性证明

每次前后各异或一次mask,其实相当于一种加密和解密的过程,第一次是解密,第二次是加密

每一次get_hash运算,都是对解密后的数字进行处理,所以最后的得数都是与mask进行一次异或运算的结果

因为求解方法是相加,所以若两棵树同构,经过运算后数的和必然相同

标签:head,ull,int,mask,笔记,学习,edgenum,哈希
From: https://www.cnblogs.com/wangsiqi2010916/p/18102718

相关文章

  • 3.28 第一次结对笔记
     今天准备设计一下地铁查询系统的整体架构,因为北京地铁的线路繁多,所以在设计数据库表时就存在很大问题,如何设计才能在存储数据时以及前后端处理数据时,都简便一些。当然如果一方面过度的方便就证明另一方面极其困难,在博客园找到了15年地铁站点的数据,但是对比现在差的太多了,所以我......
  • 新手c语言笔记
    第1章认识C语言C语言是国际流行的使用最广泛的感激程序设计语言。它既可以用来写系统软件,也可以用来写应用软件。1.1C语言的特点(1)c语言简洁紧凑,编写的程序短小精悍。(2)运算符丰富,数据结构丰富。c语言程序生成代码的质量较高,程序执行效率高。(3)C语言限制不太严格,程序设计自......
  • Python机器学习从入门到高级:导入数据(包含数据库连接)
    python数据科学系列https://developer.aliyun.com/article/1174199 ......
  • Mybatis学习笔记
    1、概述1.1MyBatisMyBatis是持久层框架,用于简化JDBC的开发。官网:https://mybatis.org/mybatis-3/zh/index.html使用Mybatis操作数据库,就是在Mybatis中编写SQL查询代码,发送给数据库执行,数据库执行后返回结果。1.2预编译SQL性能更高更安全,能防止sql注入SQL注入是通过操......
  • 新机器安装docker (新手笔记)-- 知其所以然
    1.安装Docker-2024.03.28官方手册清华大学开源软件镜像站|可从主页找到Docker资源#AddDocker'sofficialGPGkey:sudoapt-getupdatesudoapt-getinstallca-certificatescurlsudoinstall-m0755-d/etc/apt/keyringssudocurl-fsSLhttps://download.docker......
  • JAVA学习笔记
    第一章Java起步入门 #jdk版本JavaSE(J2SE,Java2PlatformStandardEdition,标准版)JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持JavaWeb服务开发的类,并为JavaEE和JavaME提供基础。JavaE......
  • LLMRec论文阅读笔记
    LLMRec论文阅读笔记Abstract​ 长期以来,数据稀疏性的问题一直是推荐系统中的一个挑战,以前的研究都试图通过合并侧边信息来解决这个问题。然而,这种方法经常会引入副作用,如噪声、可用性问题和低数据质量,这反过来会阻碍用户偏好的准确建模,并对推荐性能产生不利影响。鉴于大型语言模......
  • 学习变量的目的及基本数据类型介绍
    今日练习1.如何书写python的注释语法【1】单行注释单行注释是指只对一行进行注释,一旦换了一行就不生效了注释方法:#注释内容快速注释单行代码【2】多行注释多行注释适用于代码块注释方法:英文状态下的三个单引号或者双引号,头尾皆需要"""内容"""'''内......
  • 云计算02笔记---远程连接服务ssh 以及cp mv rm cd mkdir echo 等Linux常用命令
    远程连接服务ssh语法格式:ssh用户名@ip地址【-p指定端口号】例如:[email protected]默认端口号:22修改端口号:vim/etc/ssh/sshd_config编辑其中一行#port22改为port2222删去了注释符号#且改变端口号拷贝命令cpcp位置1位置2从位置1复制到位置......
  • 云计算笔记03--配置yum源及下载nginx并上传项目至服务器(常用命令 lrzsz cat head tail
    配置yum源首先将系统自带的yum源进行备份cd/etc/yum.repos.d///进入到yum配置目录mkdirbackup//创建一个备份目录mv*.repobackup///将所有以.repo结尾的文件移动到备份目录中#阿里云的yum源网站:https://developer.aliyun.com/......