《数据结构、算法与应用C++语言描述》-栈的应用-离线等价类问题

离线等价类问题

问题描述

等价类:假定一个具有n个元素的集合U=1,2,…,n和一个具有r个关系的集合 R = ( i 1 , j 1 ),( i 2 , j 2 ), … ,( i r , j r ) R=(i_1,j_1),(i_2,j_2),…,(i_r, j_r) R=i1j1),(i2j2),,(ir,jr。关系 R是一个等价关系(equivalence relation),当且仅当如下条件为真:

  • 对于所有的 a ⊂ R a\subset R aR,有(a,a) ⊂ \subset R时(关系是自反的)。
  • (a,b) ⊂ \subset R,当且仅当(b,a) ⊂ \subset R(关系是对称的)。
  • 若(a,b) ⊂ \subset R且(b,c) ⊂ \subset R,则有(a,c) ⊂ \subset R(关系是传递的)。

在给出等价关系R时,我们经常会忽略其中的某些数对,这些数对可以应用等价关系的自反性、对称性和传递性来得到。

如果(a,b) ⊂ \subset R,则元素a和b是等价的。所谓等价类(equivalence class)是指相互等价的元素的最大集合。“最大”意味着不存在类以外的元素与类内部的元素等价。因为一个元素只能属于一个等价类,等价关系把集合 U划分为不相交的等价类。

举例

例6-3 假定 n=14,R={(1,11),(7,11),(2,12),(12,8),(11,12),(3,13),(4,13),(13,14),(14,9),(5,14),(6,10)}。我们忽略了所有形如(a,a)的数对,因为按照自反性,这些数对是隐含的。同样也忽略了所有对称的数对。因为(1,11) ⊂ \subset R,所以按照对称性应有(11,1) ⊂ \subset R。其他被忽略的数对由传递性可以得到。例如,由(7,11)和(11,12),可以得到(7,12) ⊂ \subset R。

例 6-4 考察例 6-3 中的等价关系。由于元素 1 与 11,11 与 12 是等价的,因此,元素1、11、12是等价的,它们应属于同一个等价类。不过,这三个元素还不能构成一个等价类,因为还有其他的元素与它们等价(例如7)。因此(1,11,12)不是等价元素的最大集合。集合{1,2,7,8,11,12)才是一个等价类。关系R还定义了另外两个等价类:(3,4,5,9,13,14)和(6,10)。注意,这三个等价类是互不相交的。

离线等价类(offline equiralence class)问题中,已知 n 和 R,确定所有的等价类。由等价类的定义得知,每个元素只能属于一个等价类。
简化问题描述:这个问题的输入是元素数目n、关系对数目r以及r个关系对。目标是把n个元素划分为等价类。

求解策略

求解分为两个阶段。在第一个阶段,我们输入数据,建立 n个表以表示关系对。对每一个关系对(i,j),i放在list[j],j放在list[i]。

例8-3 假定n=9,r=11,且11个关系对是(1,5),(1.6),(3,7),(4,8),(5,2),(6,5),(4,9),(9,7),(7,8),(3,4),(6,2)。9个表是:

list[1]=[5,6]
list[2]=[5,6]
list[3]=[7,4]
list[4]=[8,9,3]
list[5]=[1,2,6]
list[6]=[1,2,5]
list[7]=[3,9,8]
lis[8]=[4,7]
list[9]=[4,7]

在第二个阶段是寻找等价类。为寻找一个等价类,首先要找到该等价类中第一个没有输出的元素。这个元素作为该等价类的种子。该种子作为等价类的第一个成员输出。从这个种子开始,我们找出该等价类的所有其他成员。种子被加到一个表unprocessedList中。从表unprocessedLis中删除一个元素i,然后处理表list[i]。list[i]中所有元素和种子同属一个等价类;将list[i]中还没有作为等价类成员的元素输出,然后加入unprocessedList中。这是一个过程:从表 unprocessedLis 中删除一个元素i,然后把表 list[i]中还没有输出的元素输出,并且加入unprocessedList中。这个过程持续进行到unprocessedList为空。这时我们就找到了一个等价类,然后继续寻找下一个等价类的种子。

例8-4 考虑例8-3。令1 是第一个种子,作为一个等价类的成员被输出,然后加入表unprocessedList中。接下来把1从unprocessedList中删除,然后处理list[1]。元素5和6属于list[1],与1同属一个等价类,它们被输出,然后加入unprocessedList中。将5或6从unprocessedList中删除,然后处理它们所在的表。假定删除的是5。考察list[5]中的元素1、2和6。因为1和6已经输出,所以被忽略。把元素2输出,然后加入unprocessedList中。当unprocessedList中的剩余元素(6和2)被删除和处理,没有其他元素被输出或加入unprocessedList时,unprocessedList成为空表,这时我们便找到了一个等价类。
为找到另一个等价类,我们要寻找一个种子,它是还没有输出的元素。元素 3 还没有输出,因此可以作为下一个等价类得种子。元素3、4、7、8和9作为这个等价类的元素被输出。这时不再有种子,因此我们找到了所有等价类。

代码

#include <iostream>
#include <stack>
using namespace std;/*离线等价类问题*/
void offlineEquivalenceClass()
{int n,//元素个数r;//关系个数/*输入元素个数n*//*首先成功输入一次*/cout << "Enter number of elements(n >= 2):";while (!(cin >> n)) {//如果输入类型不匹配,则执行循环体cin.clear(); // reset input设置标志位为有效while (cin.get() != '\n') //删除没有用的输入continue; // get rid of bad inputcout << "Enter number of elements(n >= 2):";}/*成功输入一次后检查是否符合要求*/while (n < 2) {//如果元素个数小于2,则出错cout << "n must be equal or bigger than 2!" << endl;cout << "Enter number of elements(n >= 2):";while (!(cin >> n)) {//如果输入类型不匹配,则执行循环体cin.clear(); // reset input设置标志位为有效while (cin.get() != '\n') //删除没有用的输入continue; // get rid of bad inputcout << "Enter number of elements(n >= 2):";}}/*输入关系个数r*//*首先成功输入一次*/cout << "Enter number of relations(r >= 1):";while (!(cin >> r)) {//如果输入类型不匹配,则执行循环体cin.clear(); // reset input设置标志位为有效while (cin.get() != '\n') //删除没有用的输入continue; // get rid of bad inputcout << "Enter number of relations(r >= 1):";}/*成功输入一次后检查是否符合要求*/while (r < 1) {//如果元素个数小于2,则出错cout << "r must be equal or bigger than 1!" << endl;cout << "Enter number of relations(r >= 1):";while (!(cin >> r)) {//如果输入类型不匹配,则执行循环体cin.clear(); // reset input设置标志位为有效while (cin.get() != '\n') //删除没有用的输入continue; // get rid of bad inputcout << "Enter number of relations(r >= 1):";}}/*建立空栈组成的数组,stack[0]不用,用于存储表格*/stack<int>* list = new stack<int>[n + 1];/*输入r个关系,存储在表中*/int a, b;//(a,b)是一个关系for (int i = 1; i <= r; i++){cout << "Enter next relation/pair:";while (!(cin >> a >> b)) {//如果输入类型不匹配,则执行循环体cin.clear(); // reset input设置标志位为有效while (cin.get() != '\n') //删除没有用的输入continue; // get rid of bad inputcout << "Enter error!Enter current relation/pair:";}list[a].push(b);list[b].push(a);}/*初始化已输出等价类*/stack<int> unprossedList;bool* out = new bool[n + 1];//判断该元素是否输出for (int i = 1; i <= n; i++)out[i] = false;/*输出等价类*/for (int i = 1; i <= n; i++){if (!out[i]){cout << "Next class is:" << i << " ";out[i] = true;unprossedList.push(i);//从unprossedList中取类的剩余元素while (!unprossedList.empty()){int j = unprossedList.top();unprossedList.pop();while (!list[j].empty()){int q = list[j].top();list[j].pop();if (!out[q]) //未输出{cout << q << " ";out[q] = true;unprossedList.push(q);}}}cout << endl;}}cout << "End of list of eqivalence classes." << endl;
}int main()
{cout << "offlineEquivalenceClass()*******" << endl;offlineEquivalenceClass();return 0;
}

运行结果

C:\Users\15495\Documents\Jasmine\Work\coding\cmake-build-debug\coding.exe
offlineEquivalenceClass()*******
Enter number of elements(n >= 2):14
Enter number of relations(r >= 1):11
Enter next relation/pair:1 11
Enter next relation/pair:7 11
Enter next relation/pair:2 12
Enter next relation/pair:12 8
Enter next relation/pair:11 12
Enter next relation/pair:3 13
Enter next relation/pair:4 13
Enter next relation/pair:13 14
Enter next relation/pair:14 9
Enter next relation/pair:5 14
Enter next relation/pair:6 10
Next class is:1 11 12 7 8 2 
Next class is:3 13 14 4 5 9
Next class is:6 10
End of list of eqivalence classes.Process finished with exit code 0

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)

我们知道dnsmap是一个工具&#xff0c;主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用&#xff0c;可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap&#xff08;DNS Mapping&#xff…

Xmake v2.8.3 发布,改进 Wasm 并支持 Xmake 源码调试

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

学信息系统项目管理师第4版系列14_沟通管理

1. 与IT项目成功有关的最重要的四个因素 1.1. 主管层的支持 1.2. 用户参与 1.3. 有经验的项目经理 1.4. 清晰的业务目标 1.5. 依赖于项目经理和团队具有良好的沟通能力 2. 沟通的主旨 2.1. 互动双方建立彼此相互了解的关系 2.2. 相互回应 2.3. 期待能经由沟通的行为与…

软件过程的介绍

软件过程概述 软件的诞生和生命周期是一个过程&#xff0c;我们总体上称这个过程为软件过程。软件过程是为了开发出软件产品&#xff0c;或者是为了完成软件工程项目而需要完成的有关软件工程的活动&#xff0c;每一项活动又可以分为一系列的工程任务。任何一个软件开发组织&a…

ESP32官方MPU6050组件介绍

前言 &#xff08;1&#xff09;因为我需要使用MPU6050的组件&#xff0c;但是又需要在这条I2C总线上挂载多个设备&#xff0c;所以我本人打算自己对官方的MPU6050的组件进行微调。建立一个I2C总线&#xff0c;设备依赖于这个总线挂载。 &#xff08;2&#xff09;既然要做移植…

【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 29 Sep 2023 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;NCF,基于Neural Contact Fields神经接触场的方法实现有效的外部接触估计和插入操作。 (from FAIR ) 操作插入处理结果&am…

凉鞋的 Godot 笔记 101. Hello Godot!

101. Hello Godot 学习任何一门技术&#xff0c;第一件事就是先完成 Hello World&#xff01;的输出 所以我们也来先完成 Godot 的 Hello World。 我们所使用的 Godot 版本是 4.x 版本。 安装的过程就不给大家展示了&#xff0c;笔者更推荐初学者用 Steam 版本的 Godot&…

第一次作业题解

第一次作业题解 P5717 【深基3.习8】三角形分类 思路 考的是if()的使用,还要给三条边判断大小 判断优先级&#xff1a; 三角形&#xff1f;直角、钝角、锐角等腰等边 判断按题给顺序来 代码 #include <stdio.h> int main() {int a 0, b 0, c 0, x 0, y 0, z 0…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利&#xff1a;工程源码获取 紫光同创FPGA图像视频采集系统&am…

[每周一更]-(第64期):Dockerfile构造php定制化镜像

利用php官网镜像php:7.3-fpm&#xff0c;会存在部分插件缺失的情况&#xff0c;自行搭建可适用业务的镜像&#xff0c;才是真理 Dockerhub 上 PHP 官方基础镜像主要分为三个分支&#xff1a; cli: 没有开启 CGI 也就是说不能运行fpm。只可以运行命令行。fpm: 开启了CGI&#x…

Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

libtorch之tensor的使用

1. tensor的创建 tensor的创建有三种常用的形式&#xff0c;如下所示 ones创建一个指定维度&#xff0c;数据全为1的tensor. 例子中的维度是2维&#xff0c;5行3列。 torch::Tensor t torch::ones({5,3}); zeros创建一个指定维度&#xff0c;数据全为0的tensor&#xff0c;例子…

Java 基于 SpringBoot 的简历招聘系统

文章目录 1、效果演示2、 前言介绍3、主要技术4 **系统设计**4.1 系统体系结构4.2开发流程设计4.3 数据库设计原则 5 **系统详细设计**5.1管理员功能模块5.2用户功能模块5.3前台首页功能模块 6 源码咨询 1、效果演示 大家好&#xff0c;今天为大家带来的是基于 SpringBoot简历…

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…

初识Java 11-2 函数式编程

目录 高阶函数 闭包 函数组合 柯里化和部分求值 本笔记参考自&#xff1a; 《On Java 中文版》 高阶函数 ||| 高阶函数的定义&#xff1a;一个能接受函数作为参数或能把函数当返回值的函数。 把函数当返回值的情况&#xff1a; import java.util.function.Function;inter…

操作EXCEL计算3万条数据的NDVI并填入

Python操作EXCEL&#xff0c;计算3万条数据的NDVI并填入 问题描述 现在是有构建好了的查找表&#xff0c;不过构建了3万条数据&#xff0c;在excel中手动计算每行的NDVI值太麻烦了&#xff0c;也不会操作。 就试试python吧&#xff0c;毕竟python自动处理大型EXCEL数据很方便…

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,高效复制多个同样的资产】

目录​​​​​​​ 插件制作 添加新的类&#xff1a;AssetActionUtility 添加新的模块&#xff1a;EditorScriptingUtilities 路径了解 添加debug的头文件 代码【debug.h】内涵注释&#xff1a; 写函数 .h文件 .cpp文件 插件制作 首先第一步是做一个插件&#xff1a…

吉力宝:智能科技鞋品牌步力宝引领传统产业创新思维

在现代经济环境下&#xff0c;市场经济下产品的竞争非常的激烈&#xff0c;如果没有营销&#xff0c;产品很可能不被大众认可&#xff0c;酒香也怕巷子深&#xff0c;许多传统产业不得不面临前所未有的挑战。而为了冲出这个“巷子”&#xff0c;许多企业需要采用创新思维&#…

Java进阶必会JVM-深入浅出Java虚拟机

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 文章目录 系列文章目录前言一、推荐书籍二…