集合并查找算法

2024-02-05

我有数千行 1 到 100 个数字,每行定义一组数字以及它们之间的关系。 我需要获取相关数字的集合。

小例子: 如果我有这7行数据

T1 T2
T3 
T4
T5
T6 T1
T5 T4
T3 T4 T7

我需要一个不太慢的算法来知道这里的集合是:

T1 T2 T6 (because T1 is related with T2 in the first line and T1 related with T6 in the line 5)
T3 T4 T5 T7 (because T5 is with T4 in line 6 and T3 is with T4 and T7 in line 7)

但是当你有非常大的集合时,在每个大集合中搜索 T(x) 以及进行集合的并集......等等,速度会非常慢。

您是否有提示以不那么暴力的方式做到这一点?

我正在尝试用Python 来做到这一点。


一旦构建了数据结构,您到底想要对其运行哪些查询?向我们展示您现有的代码。什么是 T(x)?您谈论“数字组”,但您的样本数据显示 T1、T2 等;请解释。

你读过这篇文章吗:http://en.wikipedia.org/wiki/Disjoint-set_data_struct http://en.wikipedia.org/wiki/Disjoint-set_data_structure

尝试看看这个 Python 实现:http://code.activestate.com/recipes/215912-union-find-data-struct/ http://code.activestate.com/recipes/215912-union-find-data-structure/

或者你可以自己提出一些相当简单易懂的东西,例如

[更新:全新代码]

class DisjointSet(object):

    def __init__(self):
        self.leader = {} # maps a member to the group's leader
        self.group = {} # maps a group leader to the group (which is a set)

    def add(self, a, b):
        leadera = self.leader.get(a)
        leaderb = self.leader.get(b)
        if leadera is not None:
            if leaderb is not None:
                if leadera == leaderb: return # nothing to do
                groupa = self.group[leadera]
                groupb = self.group[leaderb]
                if len(groupa) < len(groupb):
                    a, leadera, groupa, b, leaderb, groupb = b, leaderb, groupb, a, leadera, groupa
                groupa |= groupb
                del self.group[leaderb]
                for k in groupb:
                    self.leader[k] = leadera
            else:
                self.group[leadera].add(b)
                self.leader[b] = leadera
        else:
            if leaderb is not None:
                self.group[leaderb].add(a)
                self.leader[a] = leaderb
            else:
                self.leader[a] = self.leader[b] = a
                self.group[a] = set([a, b])

data = """T1 T2
T3 T4
T5 T1
T3 T6
T7 T8
T3 T7
T9 TA
T1 T9"""
# data is chosen to demonstrate each of 5 paths in the code
from pprint import pprint as pp
ds = DisjointSet()
for line in data.splitlines():
    x, y = line.split()
    ds.add(x, y)
    print
    print x, y
    pp(ds.leader)
    pp(ds.group)

这是最后一步的输出:

T1 T9
{'T1': 'T1',
 'T2': 'T1',
 'T3': 'T3',
 'T4': 'T3',
 'T5': 'T1',
 'T6': 'T3',
 'T7': 'T3',
 'T8': 'T3',
 'T9': 'T1',
 'TA': 'T1'}
{'T1': set(['T1', 'T2', 'T5', 'T9', 'TA']),
 'T3': set(['T3', 'T4', 'T6', 'T7', 'T8'])}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集合并查找算法 的相关文章

  • 如何指定聚类的距离函数?

    我想对给定距离的点进行聚类 奇怪的是 似乎 scipy 和 sklearn 聚类方法都不允许指定距离函数 例如 在sklearn cluster AgglomerativeClustering 我唯一可以做的就是输入一个亲和力矩阵 这将非常
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • 定义Python源代码编码的正确方法

    PEP 263 http www python org dev peps pep 0263 定义如何声明Python源代码编码 通常 Python 文件的前两行应以以下内容开头 usr bin python coding
  • python array(10,1) 和 array(10,) 之间的区别

    我正在尝试将 MNIST 数据集加载到数组中 当我使用 X train y train X test y test mnist load data 我得到一个数组 y test 10000 但我希望它的形状为 10000 1 数组 1000
  • 检查 python 中命令行参数的数量

    我是蟒蛇新手 还是把脚弄湿了 我正在尝试做这样的事情 import sys if len sys argv lt 3 or lt len sys argv gt 3 print This script will compare two fi
  • 如何获取numpy.random.choice的索引? - Python

    是否可以修改 numpy random choice 函数以使其返回所选元素的索引 基本上 我想创建一个列表并随机选择元素而不进行替换 import numpy as np gt gt gt a 1 4 1 3 3 2 1 4 gt gt
  • python celery -A 的无效值无法加载应用程序

    我有一个以下项目目录 azima init py main py tasks py task py from main import app app task def add x y return x y app task def mul
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 更改QLineEdit的ClearButton图标

    我想在Windows 10 1909 64位 上的Python 3 8和PyQt5 5 15 0 上更改我的QLineEdit的ClearButton图标 稍后我想在Linux上运行代码 我尝试应用此处找到的代码 如何在 QLineEdit
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 无法在 PyCharm 版本 9.3.3 中安装 NumPy。 Python版本3.8.2

    在 PyCharm 中安装 NumPy 时出错 尝试安装 Microsoft Visual C 14 0 还是行不通 NumPy 正在通过命令安装pip3 install numpy在 cmd 终端中 但是当尝试将其安装在 PyCharm
  • 在 numpy 中连接维度

    我有x 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 2 3 I want 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 6 也就是说 我想连接中间维度的所有项目 在这种特殊情况下我可以得到这
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • 如何使用xlwt设置文本颜色

    我无法找到有关如何设置文本颜色的文档 在 xlwt 中如何完成以下操作 style xlwt XFStyle bold font xlwt Font font bold True style font font background col

随机推荐

  • 从 Facelets 调用 servlet 的正确方法?

    使用带有提交按钮的表单从 Facelets 文件调用 servlet 的正确方法是什么 是否需要特定表格 只需使用纯 HTML
  • 我想使用 jquery 操作 iframe 内的 html

    我想我可以通过将 jQuery 函数的上下文设置为 iframe 的文档来做到这一点 如下所示 function document ready some selector frames nameOfMyIframe document doS
  • 如何将字符串转换为长整型而不丢失前导零[重复]

    这个问题在这里已经有答案了 在我的网络服务方法中 我有一个输入类型Long 我应该在左边添加两个零 所以我将其转换为String 我连接了两个零 然后我应该再次转换为Long 我发现java中的Long类型忽略左零 如何在 Long 值中保
  • Android MLKit - 执行 Firebase ML 任务时发生内部错误

    您好 我有一个在 Android 应用程序中使用的自定义模型 但是当我尝试运行它时 会引发 MLkit 异常 所述错误的日志输出如下 Internal error has occurred when executing Firebase M
  • 什么是 SAPI?什么时候会使用它?

    我最近一直在学习 PHP 中的错误处理 并遇到了error log 功能 http docs php net manual en function error log php 在 PHP 手册中 它讨论了所有错误日志类型 我理解所有这些类型
  • 如何异步使用DataAdapter.Fill()?

    我有一个 DataAdapter 正在填充数据集中的 5 个数据表 SqlDataAdapter da new SqlDataAdapter Select from testTable con da Fill ds 0 numberOfRo
  • 如何在嵌入式 Linux Raspberry Pi 上安装 GCC 和/或 apt

    我在树莓派 用于比特币矿工 上有一个预配置的 Linux 发行版 问题是这个发行版非常小 只有 busybox 用于基本命令 它没有包管理器 甚至没有 gcc 编译器 所以我的目标是在上面安装一个 gcc 编译器 这样我就可以进一步安装其他
  • Swagger 是什么?它与 OData 相关吗?

    我熟悉 Microsoft 堆栈 我正在使用 OData 来提供一些宁静的服务 最近 我遇到了 Swagger API 文档 我试图了解它与 OData 的关系 两者看起来都是RESTful规范 哪一种被广泛使用 Swagger是一个规范记
  • strip 函数删除哪些特定字符?

    您可以在以下位置找到以下内容 str strip文档 https docs python org 3 library stdtypes html str strip The charsargument 是一个字符串 指定要删除的字符集 如果
  • 使用 Python 正则表达式匹配尾部斜杠

    我尝试像这样匹配尾随 type re match u https x x x
  • Android:ViewFlipper 和多个图像?

    嘿 我检查了大量的教程和指南 但不知何故找不到它 我需要在我的 Android 应用程序中包含多个图像 它就像一个图像查看器 幻灯片 目前 我只需使用 ImageView 和适配器 使用左 右手势在 drawable mdpi 目录中的图片
  • 如何从 Delphi 访问 Cassandra 分布式数据库

    我正在研究 Cassandra 是否可以作为我们服务器软件的分布式数据库存储的选择 服务器软件是用 Delphi 编写的 但我很难找到如何从 Delphi 访问 Cassandra 数据库的描述 一个建议SO的其他地方 https stac
  • 如何处理 redux saga 中的请求数组

    我正在尝试从我的反应本机应用程序上传多个文件 它正在给予Unexpected Tokenyield 语句错误 是否可以做yield在循环内 files map fileOb gt const response yield call File
  • 如何在 XCode 中获取文本字段的文本

    我用界面生成器制作了一个文本字段 我怎样才能让它的文本在其他地方使用 有没有类似的东西 string text myTextField Text 如果是这样 我该如何命名我的文本字段 因此 您要做的第一件事是在与 xib 文件关联的视图控制
  • 如何将 GUD 断点键绑定更改为旧的键绑定

    目前 我在最新版本的 Emacs 中使用 GUD 自旧版 Emacs 以来 键绑定已经发生了变化 现在设置断点是 C x C a C b 但它是 C 空格 我想知道是否有办法将键绑定更改为旧格式 由于某种原因我无法更改我的 Emacs 版本
  • 调整 select 方法以接受多个参数

    我需要实现一个方法select 可以绑定一个或多个参数和另一种方法 该方法将结果返回到index php 从index php调用所需的代码 echo this gt results gt korisnik id 这是需要实现的数据库类se
  • 隐藏固定透明标题下的滚动内容,滚动背景

    假设我有一个背景图像 一个带有透明部分的固定标题图像 一个带有半透明背景的内容 div 以及传统页眉 内容 页脚布局中的动态高度 我试图实现的效果 在固定标题下滚动背景和内容 隐藏内容并显示背景 我读过很多相关主题 例如隐藏透明标题下的滚动
  • 应该使用哪个 EncodeFor 进行定位?

    Which EncodeFor应该使用location 如果我想通过位置推送一些数据 它应该是什么样子 location obtainBDK cfm message ErrorMessage false nothing OR locatio
  • 从 SQLite 数据库中删除指定数量的行

    我尝试使用以下语句从数据库中删除 6 行 但出现如下错误 getWritableDatabase execSQL DELETE FROM tblname ORDER BY id ASC LIMIT 6 Error 引起原因 android
  • 集合并查找算法

    我有数千行 1 到 100 个数字 每行定义一组数字以及它们之间的关系 我需要获取相关数字的集合 小例子 如果我有这7行数据 T1 T2 T3 T4 T5 T6 T1 T5 T4 T3 T4 T7 我需要一个不太慢的算法来知道这里的集合是