【数据结构1-3】集合

有时候,我们并不关心数据之间的前后关系,也不关心数据的层次关系。一些确定元素只是单纯的聚集在一起,这样的元素聚集体被称为集合。

当希望知道某个数据是否存在一个集合中,或者两个元素是否在同一个集合中时,就需要使用一些集合数据结构来维护集合元素之间的关系。

常见的集合分为并查集,哈希表,STL中的set容器和map容器。

 一、【P1536】村村通(并查集)

标准的并查集模板题,并查集一般具有如下功能。

  1. 动态连边,删边
  2. 动态维护边权,点权
  3. 查询、修改链上的信息(最值,总和等)
  4. 随意指定原树的根(即换根)
  5. 合并两棵树、分离一棵树
  6. 动态维护连通性

 总之,并查集最重要的功能是维护一个集合结构。

AC代码:

 init函数的功能是初始化指定数量的集合,find函数的功能是找到某个节点的父节点,isSame函数的功能是判断两个节点是否属于同一个集合,join函数的功能是将两个节点关联起来。

建立好每个节点的连接关系以后,重新遍历所有节点,默认第一条路径上的第一个点为根节点,所有与根节点不属于同一并查集的节点都视为不可到达。

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>using namespace std;
const int INF = 0x7fffffff / 4; //若直接为INT_MAX,则会发生溢出const int N = 1005;
int pre[N] = { 0 }; //前驱节点
int Rank[N] = { 0 }; //树的高度void init(int n)
{for (int i = 1; i <= n; i++){pre[i] = i;Rank[i] = 1;}
}int find(int x)
{if (pre[x] == x) //找到集合的代表元素return x;return pre[x] = find(pre[x]);
}bool isSame(int x, int y)
{return find(x) == find(y);
}bool join(int x,int y)
{x = find(x);y = find(y);if (x == y) //两者已经在一个集合里面了return false;if (Rank[x] > Rank[y])pre[y] = x;else if (Rank[x] == Rank[y]){Rank[x]++;pre[y] = x;}else if (Rank[x] < Rank[y]){pre[x] = y;}return true;
}int main()
{while (1){int n, m;cin >> n;if (n == 0) return 0;cin >> m;if (m == 0){cout << n - 1 << endl;continue;}	init(n); //初始化int gen, ye;cin >> gen >> ye;join(gen, ye);for (int i = 2; i <= m; i++){int a1, a2;cin >> a1 >> a2;join(a1, a2);}int cnt = 0;for (int i = 1; i <= n; i++){if (pre[i] == i && Rank[i] == 1){join(i, gen);cnt++;}else if (!isSame(gen, i)){join(gen, i);cnt++;}}cout << cnt << endl;}}

 二、【P3370】字符串哈希(hash)

 Hash就是一个像函数的东西,你放进去一个值,它给你输出来一个值。输出的值就是Hash值。一般Hash值会比原来的值更好储存(更小)或比较。

字符串hash就是把字符串转换成一个整数的函数,且要尽量不同字符串对应不同的哈希值。

字符串哈希的主要思路是选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别(高精数的比较也是O(n)的),但只要把它对一个数取模,然后认为取模后的结果相等原数就相等,那么就可以在一定的错误率的基础上以O(1)复杂度进行判断了。

1. 进制的选择:

首先不要把任意字符对应到数字0,假如把a对应到数字0,那么将不能只从Hash结果上区分ab和b(虽然可以额外判断字符串长度,但不把任意字符对应到数字0更加省事且没有任何副作用),一般而言,把a-z对应到数字1-26比较合适。

关于进制的选择实际上非常自由,大于所有字符对应的数字的最大值,不要含有模数的质因子(那还模什么),比如一个字符集是a到z的题目,选择27、233、19260817 都是可以的。

2. 模数的选择:

绝大多数情况下,不要选择一个10^9级别的数,因为这样随机数据都会有hash冲突,根据生日悖论,随便找上​约10^5个串就有大概率出现至少一对Hash 值相等的串。

最稳妥的办法是选择两个10^9级别的质数,只有模这两个数都相等才判断相等,但常数略大,代码相对难写,目前暂时没有办法卡掉这种写法(除了卡时间让它超时)。

如果能找出一个10^{18}级别的质数(Miller-Rabin),也是相对靠谱的办法。

 3. 常用的字符串hash分为以下几类:

  • 自然溢出hash:直接使用unsigned long long,不手动进行取模,溢出时会自动对2^{64}进行取模。这种方法虽然简单,但是可能会被卡数据。
  • 单模数hash:选择一个10^{18}级别的质数作为模数,那么理论上数据量超过10^9个才会出现哈希冲突,是相对安全的写法。
  • 双模数hash:选择两个10^9级别的质数作为模数,求两个哈希值,如果两个hash值都相等才能判断两个字符串相等。

AC代码(单模数hash):

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <cstring>
#include <queue>using namespace std;typedef unsigned long long ull;
ull base = 131; //进制
ull a[10005]; //用于存储字符串hash
int prime = 233317; //强化hash
ull mod = 212370440130137957ll; //10^18大素数ull HASH(string s)
{ull ans = 0;for (int i = 0; i < s.length(); i++)ans = (ans * base + (ull)s[i] % mod + prime);return ans;
}int main()
{int n;	cin >> n;int ans = 0;for (int i = 1; i <= n; i++){string s;cin >> s;a[i] = HASH(s);}sort(a + 1, a + n + 1);for (int i = 1; i < n; i++){if (a[i] != a[i + 1])ans++;}cout << ans + 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP关联是什么?有什么后果?如何防止电商账号因IP关联被封?

在跨境电商的世界里&#xff0c;IP关联给多账号运营的商家带来了挑战。比如&#xff0c;亚马逊IP关联规则的执行对于那些经营多个店铺的卖家来说可能是一个不小的障碍。IP关联的影响不只是限于亚马逊&#xff0c;其他平台如Instagram、Facebook也有类似的机制&#xff0c;在之前…

PHP语法

#本来是在学命令执行&#xff0c;所以学了学&#xff0c;后来发现&#xff0c;PHP语法和命令执行的关系好像没有那么大&#xff0c;不如直接学php的一些命令执行函数了。# #但是还是更一下&#xff0c;毕竟还是很多地方都要求掌握php作为脚本语言&#xff0c;所以就学了前面的…

HTML新手教程

HTML入门 教程&#xff1a;【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 一.初识HTML HyperTextMarkupLanguage&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画。 HTML5的优势 世界知名浏览器厂商对HTML5的支持市场的…

无人值守变电所运维在海南市某住宅区的应用

1 前言 随着国家电网改革政策的逐步推进和落实&#xff0c;AcrelCloud-1000变电所运维云平台运用互联网和大数据技术&#xff0c;为电力运维公司提供变电所运维云平台。该平台作为连接运维单位和用电企业的纽带&#xff0c;监视用户配电系统的运行状态和电量数据&#xff0c;为…

Vue3使用setup-extend简化组件名写法

如果我们在Vue3中要使用setup的语法糖&#xff0c;就需要使用两个script标签&#xff0c;一个用于设置组件的name属性&#xff0c;一个用于编写setup中的代码。如下&#xff1a; 但是我们有觉得光是因为一个name属性就多写一个script标签有点麻烦了。 因此我们可以使用插件来进…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式&#xff0c;主要解决接口选择的问题。能够创建一系列相关的对象&#xff0c;而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族&#xff0c;且这些产品族类的产品需实现同样的接口。 例如&#xff1a;有…

AI对话软件哪个好?首选这3款堪称神器的AI工具!

在过去的一年里&#xff0c;AI对话软件无疑深度嵌入到了我们工作或生活的方方面面&#xff0c;成为了我们的得力助手。它们可以帮我们解决问题&#xff0c;提供信息&#xff0c;甚至陪伴我们度过孤独的时刻。 但是&#xff0c;面对市场上数量众多的AI对话软件&#xff0c;你是…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

【C语言】深入理解指针(4)回调函数

目录 回调函数 回调函数的应用 i&#xff0c;简化代码逻辑 ii&#xff0c;实现上下机之间的通讯 回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被用来调用其所指向…

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…

Hive(15)中使用sum() over()实现累积求和和滑动求和

目的&#xff1a; 三个常用的排序函数row_number(),rank()和dense_rank()。这三个函数需要配合开窗函数over()来实现排序功能。但over()的用法远不止于此&#xff0c;本文咱们来介绍如何实现累计求和和滑动求和。 1、数据介绍 三列数据&#xff0c;分别是员工的姓名、月份和…

源聚达科技:开一家抖音店铺怎么做最好

在数字化浪潮的推动下&#xff0c;抖音不仅是年轻人展示才华的舞台&#xff0c;也成为商家争夺流量的新阵地。开一家抖音店铺&#xff0c;看似简单&#xff0c;实则需要精心策划和周到运营。 首要任务是确立店铺定位。正如古人云“磨刀不误砍柴工”&#xff0c;明确目标受众和主…

神经网络建立(结果可变)最小神经元

目录 介绍&#xff1a; 初始化&#xff1a; 建模: 预测&#xff1a; 改变结果&#xff1a; 介绍&#xff1a; 在深度学习中&#xff0c;神经元通常指的是人工神经元&#xff08;或感知器&#xff09;&#xff0c;它是深度神经网络中的基本单元。深度学习的神经元模拟了生…

JavaWeb基础01-基本技术体系介绍和相关工具的安装

一、JavaWeb 1.概述 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站JavaWeb&#xff1a;是用Java技术来解决相关web互联网领域的技术栈 2.组成 &#xff08;1&#xff09;网页&#xff1a;展示数据&#xff08;前端技术&…

计算机网络·网络层

网络层 网络层提供的两种服务 争论&#xff1a; 网络层应该向运输层提供怎样的服务&#xff1f;面向连接还是无连接&#xff1f; 在计算机通信中&#xff0c;可靠交付应当由谁来负责&#xff1f;是网络还是端系统&#xff1f; 2 种观点&#xff1a; 面向连接的可靠交付。 无连…

【C\C++ 04】归并排序

归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;也是用空间换时间思维的体现。 将已有序的子序列合并&#xff0c;得到完全有…

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

软件个性化选型:制造企业如何选择适合自身的工单管理系统-亿发

企业制造业是实体经济中非常重要和基础的组成部分&#xff0c;直接关系到国家经济的血脉。然而&#xff0c;传统制造业在生产与管理上所采用的老一套方法和经验已不再适应当下的发展需求。信息化、数字化和智能化被视为制造企业的必然趋势。要想在竞争激烈的市场中永立潮头&…

web前端---------盒子模型

1.内容 盒子的内容可以包含文字、图片等多种类型。 浏览器在加载网页时&#xff0c;会将元素按照内容区分为替换元素与非替换元素。 &#xff08;1&#xff09;替换元素指的是HTML中的一些形如<img>、<input>等非文本元素。 这些元素本身不包含任何内容&#x…

容器和虚拟机的对比

容器和虚拟机的对比 容器和虚拟机在与硬件和底层操作系统交互的方式上有所不同 虚拟化 使多个操作系统能够同时在一个硬件平台上运行。 使用虚拟机监控程序将硬件分为多个虚拟硬件系统&#xff0c;从而允许多个操作系统并行运行。 需要一个完整的操作系统环境来支持该应用。…