[基于归纳的算法设计][3] 寻找一对一映射

发布时间:2024-12-03 16:46

设计懒人收纳盒,物品归位整齐不找寻 #生活技巧# #居家生活技巧# #懒人生活技巧# #懒人家务分工#

Hello-world Master 于 2021-01-09 23:03:12 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

问题描述

给定一个集合 A 和一个从 A 到自身的映射 f,寻找元素个数最多的一个自己子集 S ⊆ A S \subseteq A S⊆A,S满足:(1) f 把 S 中每个元素映射到 S 中的另一元素 (即 f 把 S 映射到它自身),(2) S 中没有两个元素 映射到相同的元素(即 f 在 S 上是一个一对一函数)。

归纳假设

假设对于包含 n − 1 n-1 n−1 个元素的集合,如何求解问题是已知的。

归纳证明

若集合仅有一个元素,则它必定映射到自己。

假定有一个包含 n 个元素的集合 A,并且要寻找的子集为 S。如果 A 是一对一映射,令 S = A。

若不是,必存在元素 i 没有被任何其他元素映射到。我们断言:i 不可能属于 S。(否则,若 i ∈ S i\in S i∈S 且 S S S 有 k 个元素,则这 k 个元素被映射到至多 k-1 个元素上,从而不可能是一对一的)。因此将 i 从 A 中删去,此时 A 集合只有 n-1 个元素。由归纳假设我们已知如何求解。

由1,2得:对与任意集合,均能完成求解任务。

算法实现

def Max_Mapping(A, f): """ V (A的子集) Args:A (list): 给定集合 G (dict): A到自身的映射 """ Count = {a:0 for a in A} V = {} for a in A: Count[f[a]] += 1 V.add(f[a]) while V: a = V.pop() A.remove(a) C[f[a]] -= 1 if C[f[a]] == 0: V.add(f[a])return V

12345678910111213141516171819

网址:[基于归纳的算法设计][3] 寻找一对一映射 https://www.yuejiaxmz.com/news/view/361762

相关内容

mybatis resultmap映射结果集(xml映射配置一)
分布式计算、统计学习与ADMM算法
家居设计,是一种态度
【开题报告】基于Springboot+vue框架的收纳师管理系统(程序+源码+论文) 计算机毕业设计
徒步:在未开发的荒野里,寻找对世界的救赎
第一份工作中常使用软件工具归纳整理(20200421)
如何寻找室内设计灵感,设计新手该如何获得设计灵感
【算法设计与分析】递推算法
装修设计灵感来源哪里?3大特立独行的计划,一起寻找过去的影子
基于家庭场景的多设备联动方法及装置与流程

随便看看