算法题求助

hunter12345654 2014-05-15 04:23:13
class A,
bool A::match(A &x);

match函数符合交换律,但不满足传递性:
A a,b;
a.match(b) 与 b.match(a) 结果相同
但是,如果 a.match(b)为true && b.match(c)为true, 无法推出a.match(c) 为true( a.match(c) 可能为false).

现在我有一个A类元素的集合vector<A> v; 想把数组v划分成几个子数组, 使子数组中任意两个元素sva,svb, 其match为true(sva.match(svb) 为true),且子数组数量尽可能少, 子数组可以含有相同元素.

再总结一下就是:
已知集合S,将S分为多个子集S1,S2。。。Sn,使得子集的并集S1 U S2 U 。。。U Sn = S,其中:n值尽可能小,且对任一子集Sm中任意两个元素e1,e2,e1.match(e2) 为 true, 同一元素可以出现在多个子集中.

求算法…
...全文
296 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianyancao 2014-05-26
  • 打赏
  • 举报
回复
一副图像上存在几个粘连的字符,怎么分割这些字符并匹配识别,使得每个分割区域都有匹配的字符,并且识别出的字符数量最少 这个问题是NPC吗?
dchneric 2014-05-24
  • 打赏
  • 举报
回复
真的不用费时间跟我解释这种课堂上教学用的提高档次的东西,贪心与否还是靠想啊,拟阵,呵呵,不过就是formalize这个想法而已,不然怎么解释拟阵的意义?...还有贪心是方法论,和贪心算法是否多项式复杂度没有关系啊... 你要证明1楼贪心是错的,很容易啊,举反例不就好了: a-b-d-e \ | / \ | c f 如果第一次取到S1=bdc,那就不是最小S集划分。错在“最优解里出现了一个完全子图Si”,应该是“任意解里出现了一个完全子图Si”,所以后效性破坏了 但按楼主3楼的要求,{a}{bdc}{ef}成了可行解
lanlvy 2014-05-24
  • 打赏
  • 举报
回复
引用 4 楼 hunter12345654 的回复:
[quote=引用 2 楼 u012514171 的回复:] 集合S划分子集的时候不出现重复,此时n最小,且符合题意么
没太看懂你的意思。。。能稍微写一些算法步骤或者伪代码么? 一般情况下,我手头的输入数据S,子集Si 交 Sj是为空,但我还是希望算法能包含所有情况.[/quote]子集Si 交 Sj是为空是必须出现么?
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 15 楼 dchneric 的回复:
嗯,好吧~ 边版本http://en.wikipedia.org/wiki/Clique_edge_cover 我基础够差,记得的就是这个,但反正不是楼主要的~
所以我们同意的是(1) lz要的是点覆盖。(2) 一个点允许在多个集合里这个问题可以转化成一个点只允许在一个集合里的问题。 这不就是点版本团覆盖,不就是NPC? 你之前贪心的问题是,一二两个想法是不足以推导出贪心能够解决问题的。对于贪心,抽象理论模型目前有两个,matroid是相对更好理解但是适用范围窄一点,还有一个greedoid是matroid的推广,他们都试图从抽象角度描述什么问题能被贪心解决。而它们都不是简单到一两条显而易见的性质就能推出贪心适用的。贪心那么好用那还要其他算法干甚。
dchneric 2014-05-24
  • 打赏
  • 举报
回复
引用 14 楼 FancyMouse 的回复:
[quote=引用 13 楼 dchneric 的回复:] 最小团覆盖,是要求每条边都被盖到~ 楼主1楼的要求是,不存在没盖到的点(是否重复可以不管)~ 这两个问题不是很明显不一样吗。。。不过,然,最大团是NPC,这点我搞错了~楼主3楼的新要求仍没说要覆盖所有的"match=true",但应该也是npc~ 还有,你这个人说话真不干净...
>最小团覆盖,是要求每条边都被盖到~ http://en.wikipedia.org/wiki/Clique_cover_problem The clique cover problem (also sometimes called partition into cliques) is the problem of determining whether the vertices of a graph can be partitioned into k cliques. 当然用团覆盖边的版本也是有的,那个版本也是NPC。 >楼主3楼的新要求仍没说要覆盖所有的"match=true" 我从一开始谈论的就是点覆盖不是边覆盖。 >还有,你这个人说话真不干净... 一般别人怎么对我说话我就怎么说回去。[/quote] 嗯,好吧~ 边版本http://en.wikipedia.org/wiki/Clique_edge_cover 我基础够差,记得的就是这个,但反正不是楼主要的~
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 13 楼 dchneric 的回复:
最小团覆盖,是要求每条边都被盖到~ 楼主1楼的要求是,不存在没盖到的点(是否重复可以不管)~ 这两个问题不是很明显不一样吗。。。不过,然,最大团是NPC,这点我搞错了~楼主3楼的新要求仍没说要覆盖所有的"match=true",但应该也是npc~ 还有,你这个人说话真不干净...
>最小团覆盖,是要求每条边都被盖到~ http://en.wikipedia.org/wiki/Clique_cover_problem The clique cover problem (also sometimes called partition into cliques) is the problem of determining whether the vertices of a graph can be partitioned into k cliques. 当然用团覆盖边的版本也是有的,那个版本也是NPC。 >楼主3楼的新要求仍没说要覆盖所有的"match=true" 我从一开始谈论的就是点覆盖不是边覆盖。 >还有,你这个人说话真不干净... 一般别人怎么对我说话我就怎么说回去。
dchneric 2014-05-24
  • 打赏
  • 举报
回复
引用 12 楼 FancyMouse 的回复:
[quote=引用 11 楼 dchneric 的回复:] [quote=引用 9 楼 FancyMouse 的回复:] [quote=引用 7 楼 dchneric 的回复:] [quote=引用 6 楼 FancyMouse 的回复:] 最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥[/quote] 补充两点。 1. 你之前1L说的想法一不就是能证明不互斥能构造互斥解么?我不理解你是在笑我还是打自己脸。 2. 你的贪心更是用到了同样NP-Complete的最大团子问题。看看你说的什么: “探索相邻点找完全子图直到无法再膨胀” 找一个点的最大团不是还是NP-Complete?你这贪了不是白贪? [/quote] 子团覆盖问题,盖的是边~ 楼主要的是点集,所以没关系~ 找一个点的最大团不是NPC~ 而且找一个图的最大团也不是NPC~ 当然最小团覆盖是NPC~ 还有,在五楼说的那个,已经不需要找最大子图了~ 只要极大就可以,楼主要的各种点集,所以不要求覆盖最小~ 哈哈 [/quote] lz要盖点。最小团覆盖也是盖点。你想说什么? “找图的最大团不是NPC”,你基础够差的。[/quote] 最小团覆盖,是要求每条边都被盖到~ 楼主1楼的要求是,不存在没盖到的点(是否重复可以不管)~ 这两个问题不是很明显不一样吗。。。不过,然,最大团是NPC,这点我搞错了~楼主3楼的新要求仍没说要覆盖所有的"match=true",但应该也是npc~ 还有,你这个人说话真不干净...
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 11 楼 dchneric 的回复:
[quote=引用 9 楼 FancyMouse 的回复:] [quote=引用 7 楼 dchneric 的回复:] [quote=引用 6 楼 FancyMouse 的回复:] 最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥[/quote] 补充两点。 1. 你之前1L说的想法一不就是能证明不互斥能构造互斥解么?我不理解你是在笑我还是打自己脸。 2. 你的贪心更是用到了同样NP-Complete的最大团子问题。看看你说的什么: “探索相邻点找完全子图直到无法再膨胀” 找一个点的最大团不是还是NP-Complete?你这贪了不是白贪? [/quote] 子团覆盖问题,盖的是边~ 楼主要的是点集,所以没关系~ 找一个点的最大团不是NPC~ 而且找一个图的最大团也不是NPC~ 当然最小团覆盖是NPC~ 还有,在五楼说的那个,已经不需要找最大子图了~ 只要极大就可以,楼主要的各种点集,所以不要求覆盖最小~ 哈哈 [/quote] lz要盖点。最小团覆盖也是盖点。你想说什么? “找图的最大团不是NPC”,你基础够差的。
dchneric 2014-05-24
  • 打赏
  • 举报
回复
引用 9 楼 FancyMouse 的回复:
[quote=引用 7 楼 dchneric 的回复:] [quote=引用 6 楼 FancyMouse 的回复:] 最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥[/quote] 补充两点。 1. 你之前1L说的想法一不就是能证明不互斥能构造互斥解么?我不理解你是在笑我还是打自己脸。 2. 你的贪心更是用到了同样NP-Complete的最大团子问题。看看你说的什么: “探索相邻点找完全子图直到无法再膨胀” 找一个点的最大团不是还是NP-Complete?你这贪了不是白贪? [/quote] 子团覆盖问题,盖的是边~ 楼主要的是点集,所以没关系~ 找一个点的最大团不是NPC~ 而且找一个图的最大团也不是NPC~ 当然最小团覆盖是NPC~ 还有,在五楼说的那个,已经不需要找最大子图了~ 只要极大就可以,楼主要的各种点集,所以不要求覆盖最小~ 哈哈
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用错了。我的意思是你说的“每次找最大子图,然后删掉”这个子问题是NPC的。你下面“探索相邻点找完全子图直到无法再膨胀”这个naive贪心甚至还不能完成你说的找最大子图的任务。
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 7 楼 dchneric 的回复:
[quote=引用 6 楼 FancyMouse 的回复:] 最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥[/quote] 补充两点。 1. 你之前1L说的想法一不就是能证明不互斥能构造互斥解么?我不理解你是在笑我还是打自己脸。 2. 你的贪心更是用到了同样NP-Complete的最大团子问题。看看你说的什么: “探索相邻点找完全子图直到无法再膨胀” 找一个点的最大团不是还是NP-Complete?你这贪了不是白贪?
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 7 楼 dchneric 的回复:
[quote=引用 6 楼 FancyMouse 的回复:] 最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥[/quote] 不互斥显然能构造一个互斥的对应解。这都转换不了这问题还做个毛。
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
>不过就是formalize这个想法而已,不然怎么解释拟阵的意义? matroid本身的确是formalize想法,但是你看清楚,我喷你贪心的推导过程不是说你没有用模型,而是说你的想法缺东西。不是随便丢几个性质然后就能说“哦这个能用贪心”就完事的。
FancyMouse 2014-05-24
  • 打赏
  • 举报
回复
引用 18 楼 dchneric 的回复:
真的不用费时间跟我解释这种课堂上教学用的提高档次的东西,贪心与否还是靠想啊,拟阵,呵呵,不过就是formalize这个想法而已,不然怎么解释拟阵的意义?...还有贪心是方法论,和贪心算法是否多项式复杂度没有关系啊... 你要证明1楼贪心是错的,很容易啊,举反例不就好了: a-b-d-e \ | / \ | c f 如果第一次取到S1=bdc,那就不是最小S集划分。错在“最优解里出现了一个完全子图Si”,应该是“任意解里出现了一个完全子图Si”,所以后效性破坏了 但按楼主3楼的要求,{a}{bdc}{ef}成了可行解
>还有贪心是方法论,和贪心算法是否多项式复杂度没有关系啊 但是你求解一个NPC问题,说方法是借助另一个NPC问题的算法再贪心,但是又不给出子NPC问题的算法……给我感觉是“这个数列怎么升序排序?你先降序排序然后倒着输出就行了”这味道。能给出这样的答案就要做好被喷的准备啊。况且那样贪本身还不对。 >错在“最优解里出现了一个完全子图Si”,应该是“任意解里出现了一个完全子图Si”,所以后效性破坏了 你现在这反例还可以找理由说相同大小的最大团有多个。但是实际上是能构造出一个反例,最大团唯一但是最优解一定不包括这个最大团的。
dchneric 2014-05-24
  • 打赏
  • 举报
回复
引用 6 楼 FancyMouse 的回复:
最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
啊哈哈哈哈我就知道有人会上当~ 没说团之间互斥
FancyMouse 2014-05-16
  • 打赏
  • 举报
回复
最小团覆盖。NP-Complete。什么多项式办法都是耍流氓。
lanlvy 2014-05-15
  • 打赏
  • 举报
回复
集合S划分子集的时候不出现重复,此时n最小,且符合题意么
dchneric 2014-05-15
  • 打赏
  • 举报
回复
引用 3 楼 hunter12345654 的回复:
[quote=引用 1 楼 dchneric 的回复:] 图论 每个元素为节点,match=true为边。要求几个完全子图,覆盖所有点 首先一个想法是,一个完全子图删掉一个点之后还是完全子图,所以如果在最优解里,一个点出现在多个子集S中,这个点其实也可以只出现在其中一个里,仍然是最优解。 第二个想法是,如果在最优解里出现了一个完全子图Si,把它删掉的话并不影响其他集合S的最优性(就是在没有Si的点和边的一个图例,S1..Si-1, Si+1..Sn - Si是那个问题的最优解),虽然删掉的点可以和其他集合的点继续构成完全子图,但根据上一条,去掉也没关系 于是这题就是贪心了 每次找最大子图,然后删掉 然后发现,你每次找到子图扔掉就行了,都不用看是不是最大的 所以,每次找一个未读节点,探索相邻点找完全子图直到无法再膨胀,标记成已读,循环直到没有未读节点...
我可能描述的还是不太清楚。其实我真正关心的是得到的那些子集(我的任务是对那些子集中元素做比较处理),所以我希望的是子集Si包括了所有相互match的元素。能麻烦您稍微提示些伪代码么?我现在连找一个最大子集都没有什么好方法。。。 谢谢[/quote] 你给任意一个点S={p},枚举所有p的邻居ni: 构造S‘ = S∪{ni} ,枚举所有S’元素的公共邻居,以此类推 直到没有公共邻居位置,输出S‘,从一个起始点p开始可以推出若干个子集S’,每一个都要 然后枚举所有p,得到一大堆子集S‘,删掉重复的就可以
dchneric 2014-05-15
  • 打赏
  • 举报
回复
图论 每个元素为节点,match=true为边。要求几个完全子图,覆盖所有点 首先一个想法是,一个完全子图删掉一个点之后还是完全子图,所以如果在最优解里,一个点出现在多个子集S中,这个点其实也可以只出现在其中一个里,仍然是最优解。 第二个想法是,如果在最优解里出现了一个完全子图Si,把它删掉的话并不影响其他集合S的最优性(就是在没有Si的点和边的一个图例,S1..Si-1, Si+1..Sn - Si是那个问题的最优解),虽然删掉的点可以和其他集合的点继续构成完全子图,但根据上一条,去掉也没关系 于是这题就是贪心了 每次找最大子图,然后删掉 然后发现,你每次找到子图扔掉就行了,都不用看是不是最大的 所以,每次找一个未读节点,探索相邻点找完全子图直到无法再膨胀,标记成已读,循环直到没有未读节点...
hunter12345654 2014-05-15
  • 打赏
  • 举报
回复
引用 2 楼 u012514171 的回复:
集合S划分子集的时候不出现重复,此时n最小,且符合题意么
没太看懂你的意思。。。能稍微写一些算法步骤或者伪代码么? 一般情况下,我手头的输入数据S,子集Si 交 Sj是为空,但我还是希望算法能包含所有情况.
加载更多回复(1)

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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