如何从二元组合列表反推原始元素集合

夜浩同学_4637

夜浩同学_4637

2026-06-24

794人浏览

原创

如何从二元组合列表反推原始元素集合

本文介绍如何根据一组经过筛选的二元组合(如满足和大于14的数对),自动还原出能生成全部(或部分)该组合的最小原始元素集合,核心在于提取所有出现过的唯一元素并验证其组合闭包。

本文介绍如何根据一组经过筛选的二元组合(如满足和大于14的数对),自动还原出能生成全部(or部分)该组合的最小原始元素集合,核心在于提取所有出现过的唯一元素并验证其组合闭包。

在组合分析与逆向重构任务中,一个常见需求是:给定一组满足特定条件的 2 元组(例如 itertools.combinations(M, 2) 的子集),判断它们是否可能源自某个更小的原始集合 $S$,并尝试恢复该集合。本质上,这是在求这些二元组在并集意义下的支撑集(support set)——即所有出现在任一数对中的元素构成的集合。

最直接且可靠的起点是提取所有唯一元素。例如,对于输入组合列表:

combos = [(5.0, 10.0), (6.0, 9.0), (6.0, 10.0), (7.0, 8.0),
          (7.0, 9.0), (7.0, 10.0), (8.0, 9.0), (8.0, 10.0), (9.0, 10.0)]

我们可通过集合推导式高效获取所有参与组合的原始数值:

support_set = {x for pair in combos for x in pair}
# 输出: {5.0, 6.0, 7.0, 8.0, 9.0, 10.0}

该集合即为必要支撑集(necessary support):任何能生成全部 combos 的原始列表,必须包含其中所有元素。但注意:它不一定是“最小可行集”——因为并非 support_set 的所有两两组合都一定出现在 combos 中(如 (5.0, 6.0) 缺失,因其和 ≤ 14,被原始过滤条件剔除)。因此,support_set 是还原的下界,而非最终答案。

python-pro
python-pro

高级 Python 特性、异步编程、性能调优、静态类型、内存管理、Python 内部机制及生态库方面的专家。

下载

若需进一步识别内部稠密子结构(如 (7,8,9,10) 能生成全部 6 个满足条件的组合),可采用图论建模:将每个数视为顶点,每个有效数对视为无向边,然后寻找最大团(maximal cliques)或高密度连通子图。例如,使用 networkx:

import networkx as nx

G = nx.Graph()
G.add_edges_from(combos)
# 查找大小 ≥ 3 的极大团(即完全子图)
cliques = [c for c in nx.find_cliques(G) if len(c) >= 3]
# 可能输出: [{7.0, 8.0, 9.0, 10.0}, {6.0, 9.0, 10.0}]

这能系统性地发现潜在的“隐含原始子集”。而孤立数对(如 (5.0, 10.0))在图中仅构成一条边,无法形成团,印证了它无法单独由更小集合“自洽生成”——它必须依附于更大的支撑集(此处是 {5.0, 6.0, 7.0, 8.0, 9.0, 10.0})。

注意事项:

  • 浮点数比较需谨慎,建议在加载数据后统一转为 int(若业务允许)或使用 np.round() 消除精度误差;
  • support_set 是必要非充分条件:它保证覆盖所有出现元素,但不保证其所有组合都满足原始过滤逻辑;
  • 若目标是最小集合 S 使得 combos ⊆ combinations(S, 2),则 support_set 就是最优解;若要求 combos == combinations(S, 2)(即完全匹配),则需额外验证 len(combos) == len(list(combinations(support_set, 2))),通常不成立,此时需搜索子集或使用约束求解器。

综上,从组合反推原始集合的核心是“去嵌套 + 去重 + 验证”,配合图模型可深入挖掘隐含结构。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4184

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24297

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2967

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3007

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程