看似简单实际很难的查找问题

My_Love 2012-09-24 11:24:08
所有的m位(二进制)数中找出n个数,使得任意2个数至少有k位不同。
对于给定的m,k(m>=k)求n的最大值?
...全文
465 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
丈八涯 2012-09-27
  • 打赏
  • 举报
回复
集合划分问题。
每个数与其他数之间的“位不同”作为他们的区别度。
现在是在指定区别度的情况下,查找最大集合。
DeDeWo 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

引用 22 楼 的回复:

失误,不是二分图的匹配。

应该这样建模:

枚举任意两个数,把每个数看做成一个节点,判断是否至少有k位不同,若满足,则连边。

这样转换后,我们只需要求出这个图的最大环有多少个节点即可。。。。


是最大团,不是最大环,NP完全问题。
[/Quote]

是的。
happytengfei 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

失误,不是二分图的匹配。

应该这样建模:

枚举任意两个数,把每个数看做成一个节点,判断是否至少有k位不同,若满足,则连边。

这样转换后,我们只需要求出这个图的最大环有多少个节点即可。。。。
[/Quote]

是最大团,不是最大环,NP完全问题。
DeDeWo 2012-09-27
  • 打赏
  • 举报
回复
也不对,我闭嘴,坐等高手。。。
DeDeWo 2012-09-27
  • 打赏
  • 举报
回复
失误,不是二分图的匹配。

应该这样建模:

枚举任意两个数,把每个数看做成一个节点,判断是否至少有k位不同,若满足,则连边。

这样转换后,我们只需要求出这个图的最大环有多少个节点即可。。。。


DeDeWo 2012-09-27
  • 打赏
  • 举报
回复
目测是简单的二分图匹配
huangxy10 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

吃饭去,回来给你们证明一下哈:
find(m,k) = 2*find(m,k-1)
已知:
find(m,1) = 2^m
find(m,m) = 2

用数学归纳法就可以证明出来了。
[/Quote]
是要证明find(m,k) = 2*find(m,k+1)即可。
上面的写错了
huangxy10 2012-09-26
  • 打赏
  • 举报
回复
吃饭去,回来给你们证明一下哈:
find(m,k) = 2*find(m,k-1)
已知:
find(m,1) = 2^m
find(m,m) = 2

用数学归纳法就可以证明出来了。
huangxy10 2012-09-26
  • 打赏
  • 举报
回复
很简单,可惜不好证明。不过还是能够证出来的。


#include <math.h>
long find_n( m, k )
{
return pow(2,(m-k+1));
}
My_Love 2012-09-24
  • 打赏
  • 举报
回复
...up++ 没人
vampire1984 2012-09-24
  • 打赏
  • 举报
回复
这题本来就不简单啊。。
My_Love 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

哥们我纠结于此了,现在答案就是2^(m-k),只要n个数有至少k个共有的不同的位,显然但K为最小时,n最大。(无法判断答案正确与否)

求哪位大侠给正解,跪求啊·····
[/Quote]
要是有这么简单的公式就好了
例如k=3:有
m=3 => n=2 (000和111)
m=4 => n=2
m=5 => n=4
m=6 => n=8
m=7 => n=16
m=8 => n=20
显然不符合公式!
idealgod123 2012-09-24
  • 打赏
  • 举报
回复
哥们我纠结于此了,现在答案就是2^(m-k),只要n个数有至少k个共有的不同的位,显然但K为最小时,n最大。(无法判断答案正确与否)

求哪位大侠给正解,跪求啊·····
idealgod123 2012-09-24
  • 打赏
  • 举报
回复
是错了,没考虑K+1位不同的数和K位不同的数之间可能不满足条件,那LZ看看这样行不行。后面m-k位也算的不对

先保证K位不同,即同前面:
1.K位计算:C(k,m)种排列方式,每位上有两种可能,即2^k,因为比较的两个数实际上都在n中,所以再去掉重复情况,我们需要除以2, 则K位的种类为C(k,m)*2^(k-1);
2.再去讨论M-K位
a.)其中没有不同时种类有2^(m-k)
b.)其中有1个不同时种类有2^(m-k-1)-C(1,k)
c.)其中有2个不同时种类有2^(m-k-2)-[C(1,k)c(1,2)+c(2,k)*c(2,2)]
........
其中有K个不同时种类有2^(m-k-k)-[C(1,k)c(1,k)+c(2,k)*c(2,k)...c(k,k)*c(k,k)]
........
其中有j个不同时(j>k)种类有2^(m-k-j)-[C(1,j)c(1,j)+c(2,j)*c(2,j)...c(k,j)*c(k,j)]
3.1和2中和相乘

(应该是减,但还是错的,我哭····)
idealgod123 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

2楼的思路不错,有点算法设计的意思。
[/Quote]

是错了,没考虑K+1位不同的数和K位不同的数之间可能不满足条件,那LZ看看这样行不行。后面m-k位也算的不对

先保证K位不同,即同前面:
1.K位计算:C(k,m)种排列方式,每位上有两种可能,即2^k,因为比较的两个数实际上都在n中,所以再去掉重复情况,我们需要除以2, 则K位的种类为C(k,m)*2^(k-1);
2.再去讨论M-K位
a.)其中没有不同时种类有2^(m-k)
b.)其中有1个不同时种类有2^(m-k-1)*C(1,k)
c.)其中有2个不同时种类有2^(m-k-2)*[C(1,k)c(1,2)+c(2,k)*c(2,2)]
........
其中有K个不同时种类有2^(m-k-k)*[C(1,k)c(1,k)+c(2,k)*c(2,k)...c(k,k)*c(k,k)]
........
其中有j个不同时(j>k)种类有2^(m-k-j)*[C(1,j)c(1,j)+c(2,j)*c(2,j)...c(k,j)*c(k,j)]
3.1和2中和相乘
My_Love 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

2楼的思路不错,有点算法设计的意思。
[/Quote]
一开始就错了
皮特尔 2012-09-24
  • 打赏
  • 举报
回复
2楼的思路不错,有点算法设计的意思。
nice_cxf 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

如果只要最后结果,应该就是c(m,0)+c(m,k)+c(m,2*k)....c(m,n*k),其中n*k <=m && (n+1)*k >m
最终就是一个求组合数的问题
[/Quote]
不对,想错了。。。。
nice_cxf 2012-09-24
  • 打赏
  • 举报
回复
如果只要最后结果,应该就是c(m,0)+c(m,k)+c(m,2*k)....c(m,n*k),其中n*k <=m && (n+1)*k >m
最终就是一个求组合数的问题
idealgod123 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

判断是否有K位不同是否可以用异或来判断?
引用 5 楼 的回复:

引用 4 楼 的回复:

这个编程序难度也许不大,不过证明似乎有些麻烦
建立一个临时数组,先加入0,然后从0开始顺序循环到2^m,如果这个数和每个临时数组里面的数都满足有k位不同则将该数加入临时数组,最后统计临时数组数目即可

个人觉得,问题难度在于每次都判断是否满足至少K位不同的条件,不是在于如何去循环·
……
[/Quote]
这个就需要每一位都去判断了吧,会涉及移位,累加,异或,判断等操作,如果M值很大,计算量将非常大,个人觉得应该避免这个问题
加载更多回复(5)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧