算法学习——求一个集合有多少种等价关系-集合划分问题(递归)

算法学习——求一个集合有多少种等价关系(递归)

等价关系,举个栗子:集合A{1,2,3},求它的等价关系就是{{1},{2},{3}}{{1, 2}, {3}}{{1,3},{2}}{{2,3},{1}}{{1,2,3}},就是每个集合的并集为A,且每个集合彼此没有交集。

以此计算集合B{1,2,3,4}就有15中等价关系。

那么我们怎样求呢?

思考这样一个方法,比如我们有4个苹果,我们要保证每个苹果都有地方落脚,一共有多少种落脚的情况呢?首先我们能看出最多我们要用到四个盘子(一个苹果一个盘子);四个盘子的情况下,我们可以先拿出来一号苹果,将它放入一个盘子里,让其他的苹果放到其余3个盘子里,这是一种情况,我们还可以将3个苹果放入4个盘子里,然后剩余的一个苹果就有了4种选择;这是外层循环,其余的苹果放到盘子中,也可以用这种方法来放,递归就形成了,那么问题来了,递归的出口在哪里?就像求全排列一样,当我们只剩下了一个盘子我们就没法再通过递归分了,所以出口就出现了!由于四个苹果放到四个盘子里的情况只有一种,也可以做出口。

这是bell数,有兴趣的同学可以去搜一下了解、理解一下。

#include<iostream>
#include<string>
using namespace std;
int fun(int n,int m)
{
    if(m==1||n==m)return 1;
    else
       return fun(n-1,m-1)+fun(n-1,m)*m;
}
int main()
{
    int n;
    while(cin>>n&&n>=1)
    {
       int sum=0;
       for(int i=1;i<=n;i++)
        sum+=fun(n,i);
       cout<<sum<<endl;
    }
    return 0;
}

如有问题欢迎指正!

wish you have a good day!

 

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用python中的字典来实现等价关系划分。 具体实现步骤如下: 1. 首先,我们需要定义一个函数来判断两个元素是否等价。如果两个元素在等价关系下是相等的,则返回True,否则返回False。 2. 接下来,我们遍历给定集合中的所有元素,并将它们加入到一个字典中。字典的键是集合中的元素,值是一个列表,用于存储和该元素等价的其他元素。 3. 对于每个元素,我们遍历字典中的所有键值对,如果该元素和字典中的某个键对应的值中的任意一个元素等价,则将该元素添加到该键对应的列表中。 4. 最终得到的字典中,每个键对应的值就是一个等价类。 以下是示例代码: ```python def isEqual(x, y): # 判断两个元素是否等价,可以根据具体情况修改 return x % 2 == y % 2 def equivalenceR(s): # 初始化字典,每个元素都是一个等价类 d = {x: [x] for x in s} # 遍历所有元素,将它们加入到等价类中 for x in s: for k, v in d.items(): if any(isEqual(x, y) for y in v): d[k].append(x) break # 返回所有等价类 return list(d.values()) # 测试 s = {1, 2, 3, 4, 5, 6} print(equivalenceR(s)) # [[1, 3, 5], [2, 4, 6]] ``` 在这个示例代码中,我们通过判断两个元素的奇偶性来确定它们是否等价。对于集合{1, 2, 3, 4, 5, 6},最终得到的等价类为[[1, 3, 5], [2, 4, 6]],即奇数和偶数分别构成一个等价类。 ### 回答2: 在Python中,可以使用字典和集合来表示等价关系划分。 首先,假设我们有一个有限集合S,和一个等价关系R,我们需要将R划分成若干个等价类。 我们可以通过遍历集合S中的每个元素,找出与该元素等价的所有元素,将它们放在同一个等价类中。为了方便表示等价类,我们可以使用一个字典,其中键表示等价类的代表元素,值表示该等价类下的所有元素。 下面是用Python代码实现以上思路的例子: ```python def partition_equivalence_relation(S, R): partitions = {} # 初始化一个空的划分 for element in S: for key in partitions.keys(): if element in partitions[key]: # 如果元素已经存在于某个等价类中 partitions[key].add(element) break else: # 如果元素不存在于任何一个等价类中 partitions[element] = {element} return partitions ``` 使用这个函数可以将给定的等价关系划分为若干个等价类。下面是一个示例: ```python S = {1, 2, 3, 4, 5} R = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 3), (4, 4), (5, 5)} partitions = partition_equivalence_relation(S, R) for key, value in partitions.items(): print(f"等价类{key}:{value}") ``` 输出结果为: ``` 等价类1:{1, 2} 等价类3:{3} 等价类4:{4} 等价类5:{5} ``` 这个结果表示,等价关系R中的元素1和2是等价的,而3、4、5分别是它们自己所在的等价类的唯一元素。 ### 回答3: 在Python中,可以使用字典(dictionary)来表示等价关系划分。首先,给定一个有限集合上的等价关系R,我们可以将集合中的每个元素作为字典的键(key),并将该元素所属的等价类作为该键对应的值(value)。 具体步骤如下: 1. 创建一个空的字典,用于表示等价关系划分。 2. 遍历集合中的每个元素。 3. 对于每个元素,判断它是否已经在字典的键中。 - 如果是,则跳过该元素,继续遍历下一个元素。 - 如果不是,则找出与该元素等价的其他元素,并将它们放入一个新的等价类中,同时将这些元素添加到字典中。可以使用递归或循环实现这一步骤。 4. 重复步骤3,直到所有元素都被遍历完毕。 5. 输出字典即为等价关系划分。 下面是一个示例代码: ```python def find_equivalence_relation(R): equivalence_classes = {} # 创建空的字典来表示等价关系划分 def find_equal_elements(element): if element in equivalence_classes: # 判断当前元素是否已经在字典的键中 return equivalence_classes[element] else: equal_elements = [element] # 创建一个新的等价类,将当前元素放入其中 for other_element in R[element]: # 寻找与当前元素等价的其他元素 equal_elements.extend(find_equal_elements(other_element)) equivalence_classes[other_element] = equal_elements # 将其他元素添加到当前等价类中 return equal_elements for element in R: find_equal_elements(element) return equivalence_classes # 示例输入和输出 R = { 'a': ['b', 'c'], 'b': ['a'], 'c': ['a'], 'd': ['e'], 'e': ['d'], } equivalence_classes = find_equivalence_relation(R) print(equivalence_classes) ``` 示例输出: ``` { 'a': ['a', 'b', 'c'], 'b': ['a', 'b', 'c'], 'c': ['a', 'b', 'c'], 'd': ['d', 'e'], 'e': ['d', 'e'], } ``` 输出结果表示了集合中的每个等价类,其中每个键对应的值就是同一个等价类中的所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值