趣题:选取最多的子集使得任两子集恰有一个公共元素

LeetCode100题持续更新中 LeetCodeHot100题,持续更新中 阅读详情

    这里有一个有趣的问题:在集合{1, 2, ..., n}中选取尽可能多的子集,使得任意两个子集的交集有且仅有一个元素。例如,当n=7时,选取{1,2,3,4}、{4,5,6,7}、{1,7}这3个集合可以满足条件。子集数还可以更大一点吗?最大是多少?给出一种构造,然后证明这个数目不可能更大了。

    当n=7时,仅仅取3个子集实在是太弱了。一种最简单的办法就可以让子集数达到6,只需取{1,2}、{1,3}、{1,4}、{1,5}、{1,6}、{1,7}即可。再仔细观察,我们发现这个结果还可以进一步改进:我们还可以再往里面添加进一个子集{1},使得这7个子集两两间仍然恰有一个公共元素。这下我们似乎不能再往里面添加任何新子集了。我们还可以做得更好吗?一个新的思路是在{1,2}、{1,3}、{1,4}、{1,5}、{1,6}、{1,7}里面加上{2,3,4,5,6,7},这同样可以让子集数达到7个,可惜我们仍然无法再往里面添加新的子集了。经过若干次尝试后,我们逐渐开始确信,在集合{1, 2, ..., n}里面最多只能选出n个两两恰有一个公共元素的子集,并且构造方法无外乎上面两种。这一猜想不但与直觉相符,而且貌似也很好证明。你或许会从一些看似很直观的结论出发开始证明:“显然不可能有两个大小为1的子集”,“选取多个元素个数大于2的子集显然不划算”……但牛B就牛B在,偏偏就有这样一种子集数为n的取法,每个子集里都有不止两个元素,但仍然保证任意两个子集间恰有一个公共元素:

{1,2,3}、{1,4,5}、{1,6,7}、{2,4,7}、{3,4,6}、{3,5,7}、{2,5,6}

    这一个例子对我们的猜想足以构成威胁:子集数为n真的已经到极限了吗?证明结论有那么容易吗?看来,情况貌似比我们想象中的要复杂得多。

 
 
    事实上,子集数最大为n,这个数目不可能再大了。其证明出人意料的简单。考虑每个子集所对应的n维01向量,例如n=7时集合{1,2,3}就对应向量{1,1,1,0,0,0,0},而子集{1,4,5}则可以表示成{1,0,0,1,1,0,0}。可以看出,两个子集的交集的元素个数就等于它们的向量的点积。下面我们证明,满足要求的一组子集其对应的向量一定是线性无关的,从而直接得到向量个数不超过n的结论。
    记m个向量分别为v_1, v_2, ..., v_m,令s=Σa_i v_i,考虑点积<s,s>=Σ Σ a_i · a_j · <v_i, v_j>。注意对每一对不同的i和j都有<v_i, v_j>=1,而<v_i, v_i>就等于子集A_i的元素个数|A_i|。于是,<s,s>就等于(a_1 + a_2 + ... + a_m)^2 + Σ(a_i)^2·(|A_i|-1)。当s=Σa_i v_i=0时,<s,s>也应该为0;而上面<s,s>表达式中的每一项都是非负整数,要让<s,s>为0只可能是所有a_i都取0,这就说明这m个向量是线性无关的。
    这就是著名的de Bruijn-Erdős定理。

    线性代数理论不止一次帮助我们证明了看似与线性代数毫无关系的问题。如果你喜欢这个证明,千万不要错过这个经典的图论问题。

    Update: "<"符号被吃掉了,现在已经改过来了

5、子集选择任务中的交叉算子研究 本文探讨了在子集选择任务中不同交叉算子的表现与影响。子集选择问题基于基础适应度和交互适应度构建,目标是找到基础值低且交互少的子集。研究比较了多种交叉算子,包括随机尊重重组(RRR)、匹配混合(MMX)等,并分析其在不同上位性水平(k值)下的性能。实验结果表明,正尊重对于低上位性任务至关重要,而在高上位性任务中,需要结合探索性机制的算子(如MMX0.95)来提高性能。文章最后展望了未来研究方向,包括不同比例的子集大小、更长计算时限的测试以及新算子的设计。 阅读详情

相关推荐

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

求集合{1, 2, ..., n}的所有子集

package main import "fmt" func subset(x []int) [][]int { y:=[][]int{[]int{}} for i:=0; i&lt;len(x); i++ { if i&lt;len(x)-1 { xx:=subset(x[i+1:]) for j:=0; j&lt;len(xx); j++ { yy:=[]in...

baidu_25845567的博客 948

声纹识别实战:用Python从零搭建一个简易声纹验证系统(附完整代码)

本文是一份详细的声纹识别实战指南,教你使用Python从零搭建一个简易的声纹验证系统。文章涵盖了从音频采集、预处理、MFCC特征提取,到基于高斯混合模型(GMM)的建模与验证全流程,并提供了完整的代码实现,帮助开发者快速掌握这项生物特征识别核心技术。

ik6789012的博客 231

【离散数学】复习:近世代数、格与布尔代数

说明:仅用作应试杂碎知识点备忘,不是知识点总结;大部分源自吉大离散真题 先放个梳理: 群 单位元e的周期为1.群中周期(阶)为1的元素有且仅有一个(就是单位元) 群G的平凡子群有两个,{e}和G本身. 循环群生成元的周期(阶)等于群的阶.(G=(a)→\rightarrow→|G|=|a|) 存在一个元素的周期(阶)等于群G的阶,那么这个群G必为循环群. 有限群G的子群H的阶整除G的阶.(Lagrange定理)(推论:有限群G中任一元素的阶整除群G的阶.因为每个元素a都能作为生成元生成一个G的子群H,而

daixd5520的博客 2227

用例设计:滴滴打车从轿车到完成支付如何测?

滴滴打车全流程测试用例设计从业务场景覆盖、功能逻辑分解、异常流验证三个维度展开,系统化地构建了测试方案。首先,业务流主干场景被分解为叫车、行程中、支付结算三个阶段,每个阶段都设计了核心测试用例,包括正向和异常用例,如定位准确性、车型选择逻辑、路径偏移监控、费用实时计算、多支付方式兼容等。专项测试补充了状态机验证、资损防控测试和性能测试,确保系统在不同情况下的稳定性和安全性。测试数据策略采用等价类划分设计,实战技巧包括流量回放技术、混沌工程注入和计费沙盒验证,以提高测试的覆盖率和准确性。最终输出交付物包括流程

海姐软件测试的博客 1524

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6597

欧拉路径与DeBruijn序列

最近在力扣上刷题时看到了这道题:力扣 ,这是一道欧拉路径与DeBruijn序列结合的题目,非常有趣,欧拉路径以前在离散数学中学过,但DeBruijn序列确实是第一次见,所以我特地去查了一些资料,写这篇博客主要是为了巩固欧拉路径的知识,并加深对DeBruijn序列的理解(DeBruijn序列是一个非常神奇的东西,在很多领域都有广泛的应用)。如有错误,欢迎指正。一些定义:欧拉通路:通过图中每条边且行遍所有顶点的迹(每条边恰一次的途径),称为欧拉通路。半欧拉图:具有欧拉通路但不具有欧拉回路的图称为半欧拉图,有且仅

m0_54123999的博客 1137

Qt for Android:基于libusb实现CH340x串口通信的高效开发方案

本文详细介绍了在Qt for Android环境下,基于libusb实现CH340x串口通信的高效开发方案。通过绕过Android高版本系统的权限限制,利用libusb+JNI技术实现稳定通信,适用于工业手持终端等场景。文章涵盖环境搭建、核心实现、常见问题解决方案及性能调优经验,帮助开发者快速掌握这一关键技术。

weixin_42715608的博客 427

De Bruijn 序列生成的本原多项式方法

De Bruijn序列可以看成是包含全0子序列的伪随机序列。伪随机序列是反馈移位寄存器的输出序列,可以通过反馈移位寄存器的本原多项式求出。50阶以内的反馈移位寄存器的本原多项式可以查表得到,下面表格给出了1-10阶的本原多项式:2元:3,4,8元:由本原多项式可以推出伪随机序列的递推关系式,如果本原多项式为:那么递推关系式为:上面公式中的“+”为模2加法显然,通过简单的编程就可以生成任意阶任意元的...

sea_sky_cloud的博客 3583

OSMDroid 切换地图不更新的问题

用OSMDroid加载Google地图的时候 需要有按钮切换不同图层的地图,如果发现调用了mMapView.setTileSource(ITileSource aTileSource)方法的时候发现地图View没有更新的话,可能是因为两个实例化TileSource对象其子类BitmapTileSourceBase这个类的aName成员变量值一样导致的地图在setTileSource出现不更新问题,...

godoge的博客 1039

Windows 10下用VS2022编译AFSIM 2.9.0的完整避坑指南

本文提供了在Windows 10系统下,使用Visual Studio 2022编译AFSIM 2.9.0仿真框架的详细指南。文章系统梳理了从环境准备、CMake配置、编译链接到安装打包的全流程,并重点针对编译过程中常见的文件编码、命名空间冲突等高频错误提供了具体解决方案,旨在帮助开发者高效避坑,顺利完成AFSIM在Windows平台上的构建。

weixin_28839549的博客 549

趣题:选出最多的大小为奇数的子集,使得两两的交集大小都是偶数

在集合 {1, 2, ..., n} 中选出尽可能多的子集,使得每个子集所含的元素个数都是奇数,但是任意两个子集的交集都含有偶数个元素。那么,我们最多能够选出多少个这样的子集来?      容易看出,我们至少可以选出 n 个子集。例如,当 n = 4 时, {1} 、 {2} 、 {3} 、 {4} 就满足要求。我们还能选出更多的子集来吗?简单地尝试后,你会觉得似乎不行。不过,这却并不是显然的,

shengxiaweizhi的专栏 1550

SDR 和 DDR 的区别

SDR 和 DDR 的差别,最明显提现在传输速率和频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1960

【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【回溯算法】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。元素无

MaoLin Tian's Blog 598

Win11右下角不显示图标怎么办?Win11右下角不显示图标的解决方法

所以有不少符合资格的小伙伴都下载进行体验了,但是有的小伙伴在升级完系统之后发现桌面右下角不显示任何图标,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。2、接着找到任务栏设置中的“taskbar corner overflow”。3、然后在下方勾选打开想要显示的图标程序就可以了。1、首先右键任务栏,在其中选择“任务栏设置”。目前微软已经正式推出了。

2401_88800025的博客 885

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

(009):选择各个源元素的子集

 视频演示:http://u.115.com/file/f2d7193f3a 选择源序列中的各个元素的子集有两种主要方法: 1、若要只选择源元素的一个成员,请使用点运算。在下面的示例中,假定 Customer 对象包含几个公共属性,其中包括名为 City 的字符串。在执行此查询时,此查询将生成字符串输出序列。 NorthwindDataContext db = new Northw

Jackbase的舞台 601

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

光脚丫学LINQ(009):选择各个源元素的子集

<br />视频演示:http://u.115.com/file/f2d7193f3a<br /> <br />选择源序列中的各个元素的子集有两种主要方法:<br />1、若要只选择源元素的一个成员,请使用点运算。在下面的示例中,假定 Customer 对象包含几个公共属性,其中包括名为 City 的字符串。在执行此查询时,此查询将生成字符串输出序列。<br />NorthwindDataContext db = new NorthwindDataContext(); var Cities = from

光脚丫思考的专栏 2142

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

DOM(DOM树&元素树&选取元素1.1)

一、DHTML 1、概念 是动态HTML,将网页实现动态化 作用: -动态概念页面元素 -与用户进行交互 -对象模型分为BOM和DOM DHTML = HTML + CSS + js 2、BOM和DOM BOM:浏览器对象模型,用来访问和操作浏览器窗口,使js有能力与浏览器进行交互,通过使用BOM,可以移动窗口,可以更改状态栏文本,可以修改地址栏链接 DOM(Document Object M...

王冉的博客 1217

R语言数据集的基本操作(合并,添加行列,提取子集等)

#数据集的基本操作(合并,添加行列,提取子集等) #数据集的横向合并 #1,使用merge()函数合并数据集 merge(x,y,by,...) #数据集通过一个或多个共有变量进行联结 #例子,将data.frameA和data.frameB按照ID进行合并 total <- merge(data.frameA,data.frameB, by="ID") #如果两个数据的共有变量名称不一样时...

weixin_42712867的博客 4万+

zoj 3556 How Many Sets I(容斥原理)

刚看这题有点懵逼,结合题解才看懂题目意思 题意:给你一个集合S,S有n个元素,有多少有序集合(S1,S2,...,Sk)(S_1,S_2,...,S_k)满足S1⋂S2⋂...⋂Sk=ϕS_1\bigcap S_2\bigcap ...\bigcap S_k=\phi ,SiS_i是S的子集,而且选出的这K个集合是可重复的。 思路:S一共有2n2^n个子集,从里面选k个集合(可重复),使得交集为

梦幻的蔷薇色 318

德扑翻后训练子集的解释

本文分析了德州扑克Flop阶段的策略建模组合数量。Flop共有22,100种三张牌组合,通过策略等价类划分可压缩为1,755种独立结构。为简化计算,研究者提出184组合和85组合两个精简策略子集:184组合通过优化算法选取,在降低计算成本的同时保持良好精度;85组合则进一步压缩资源,适合移动端等轻量级应用。这些子集在性能、精度和数据规模上各有侧重,为不同场景下的策略分析提供了灵活选择。

rasonboy的专栏 1057

[网络流24题]方格取数问题

方格取数问题 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。 输入格式: 第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。

Edwin VanCleef的博客 528

高中数学空集三大应用场景详解:从子集关系到含参问题

在数学集合论中,空集是一个基础而关键的概念,它被定义为不含任何元素的集合,记作∅。其核心原理在于空集是任何集合的子集,这一性质源于子集定义的逻辑推论。理解空集的技术价值在于培养严谨的数学逻辑思维,避免因忽略边界条件导致的解题错误。空集的应用场景广泛,尤其在高中数学中,它主要出现在三大类问题中:基于子集关系的参数讨论、方程与不等式无解的转化,以及含参集合运算结果的判断。掌握这些场景,能有效提升解决集合、函数、不等式等综合问题的能力,例如在处理含参集合的子集关系时,必须优先考虑参数使集合为空集的情况,这正是分类

weixin_34234721的博客 333

python最大连续递增子列_动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)...

给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续)。解法一:动态规划通过一个辅助数组记录每一个元素处的最大序列长度(在必须选这个元素的前提下),然后在坐标小于当前元素的数组扫描,在值小于当前元素的集合中选出最大值即为当前元素处的最大子序列。状态转移方程:dp[i] = max(1, max(dp[j]+1, jclass Solution:def lengthOfLIS(self,...

weixin_39934063的博客 521
上一篇: 记09年北大ACM校内赛
下一篇: 为什么把敌人打败了=打敌人,但把肚子笑疼了≠笑肚子?
matrix67
博客等级 码龄19年 1232粉丝 896原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值