- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定集合
{1,2,3,4}{2,3,4}{1,4}{1}
找到组的简单(最好是高性能)算法是什么:{1}{2,3}{4}
因为这是最短的集合列表,其中:
真正的数据是一堆引用,而不是值类型。
编辑:我不认为总结我尝试过的内容对解决问题有任何帮助,而且只会分散注意力,因为类别理论中可能有一个算法可以解决这个问题,但是(出于娱乐原因)这里是:
最佳答案
首先,让我们仔细描述您的问题。
relation 是一个函数,它接受两个参数并返回一个 bool 值,指示关系是否成立。例如,“小于”是一种关系。
等价关系是自反的关系——每个项目都与其自身相关——对称——如果A是相关的与 B 相关,则 B 与 A 相关——并且传递性——如果 A 与 B 相关,B 与 C 相关,则 A 与 C 相关。
等价关系构成集合的等价划分;也就是说,多个子集,其中每个子集中的每个元素都相互关联。每个子集称为一个等价类。例如,整数上的等价关系“如果A和B的差能被3整除,则A和B相关”形成三个等价类:
{0, 3, -3, 6, -6, ... }
{1, 4, -2, 7, -5, ... }
{2, 5, -1, 8, -4, ... }
您希望形成所有集合的并集:
{1, 2, 3, 4} U {2, 3, 4} U {1, 4} U {1} --> {1, 2, 3, 4}
然后将该集合划分为等价类,其中等价关系为“A和B相关当且仅当A和B总是一起出现在每个原始集合中”。
首先形成一个字典,将每个元素映射到其关联的等价类。正如您正确指出的那样,最坏的情况是我们有等价划分,其中每个等价类只包含一个元素,所以让我们从那个开始。 (顺便说一句,这是“A等于B”等价关系的等价划分。)
1 --> { 1 }
2 --> { 2 }
3 --> { 3 }
4 --> { 4 }
现在从联合中产生所有无序对的集合:
{ {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4} }
现在对于这些无序对中的每一个,问“这个关系对这对是否成立”这个问题?
对于 {1, 2}
, {1, 3}
, {1, 4}
,关系不成立。
对于 {2, 3}
关系确实成立,所以将 2
和 3
桶合并在一起:
1 --> { 1 }
2 --\
--> { 2, 3 }
3 --/
4 --> { 4 }
对于 {2, 4}
和 {3, 4}
关系不成立。
现在你已经完成了,你有一个从每个元素到它对应的等价类的映射。
有道理吗?
一旦您确定正确,您可以通过多种方式优化该算法。先把它弄对。
请注意我在这里所做的事情:我通过解决等价划分的一般问题 解决了您的具体问题。如果您对如何编写此代码很聪明,您将能够重新使用逻辑来解决任何等价划分问题,而不仅仅是您的特定问题。
关于c# - 如何找到最少数量的公共(public)集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858327/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!