在 SQL 中实现不相交集逼近(并集查找)

2024-01-03

使用 SQL 实现近似不相交集的最佳方法是什么?

Details

我有一个边表,存储为两列表[vertex_a, vertex_b].

我需要一个不同集合的表,存储为[vertex, set_id]每个顶点一行,用不相交的 set_id 标记每个顶点。

约束条件

  • 必须是纯 SQL 实现。它可以利用 Postgres 特定的函数,但高度首选纯 ANSI SQL。
  • 结果可以是近似的——当几个集合实际连接时将它们标记为不相交是可以接受的。如果可以调整近似边界,例如通过增加迭代次数,那就更好了。
  • 库已经退出(没有 Boost、Numpy、Scipy)。必须是SQL。
  • 大多数集合将包含 1 到 3 个顶点。大集合很少,预计最多为 10 个顶点。

Related

  • 相关:在 C++ 中实现不相交集(并集查找) https://stackoverflow.com/questions/4498833/implementing-disjoint-sets-union-find-in-c
  • 这将是一个近似的实现不相交集(并集)- 维基百科 https://en.wikipedia.org/wiki/Disjoint-set_data_structure

我实际上正在解决同样的问题。不幸的是,我认为无法找到非常有效的解决方案 - 至少仅使用 SQL 是不容易的。只需删除“不同”和自消除查询即可观察工作集的大小。也就是说,以下解决方案将起作用。

drop table if exists foobar;
drop function if exists addset(v int[], a int);
/* our vertices table */
create table foobar (
   src int,
   dst int
);

/* Create a small function to treat an array like a set, 
   not strictly necessary but convenient */
create function addset(v int[], a int) returns int[]
as $$
begin
    return (select array_agg(e order by e) 
                   from (select unnest(v || a) as e) f);
end
$$ language plpgsql;

/* fill our table with vertices, note the ordering of each value */
insert into foobar (src, dst) 
     values (1,2), (1,3), (2,3),  (3,4), (4,5), (6,7), (6,8);
/* use a recursive query to extend the sets */
with recursive foo_union (v) as (
    select array[src, dst] as v from foobar /* starter sets */
    union all
    /* join self to original array; i can use a CTE as a 'starter',
       but that is not necessary here */
    select addset(v, dst) as v from foo_union u, foobar f
        where src = any(v) and not dst = any(v)
 ) select distinct v from foo_union a where not exists (
     /* eliminate the many overlapping results */
     select * from foo_union b where b.v @> a.v and b.v != a.v
 );

但同样,这对于较大的数据集是完全不切实际的;任何其他解决方案都需要迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL 中实现不相交集逼近(并集查找) 的相关文章

  • SQL IN 子句比单个查询慢

    我正在使用 Hibernate 的 JPA 实现和 MySQL 5 0 67 MySQL 配置为使用 InnoDB 在执行 JPA 查询 转换为 SQL 时 我发现使用IN子句比执行单个查询慢 例子 SELECT p FROM Person
  • pgadmin:收到“详细信息:用户没有 CONNECT 权限。”错误

    我在 Mac Yosemite 上使用 pgAdmin III 我创建了一个角色 discount 和一个数据库 discount 在 pgadmin 工具中 如何授予用户 discount 对数据库 discount 的连接权限 以及表读
  • Oracle数据库中的自增主键

    我想在 SQL Server 的列中实现标识或自动递增值 CREATE TABLE RollingStock Id NUMBER IDENTITY 1 1 Name Varchar2 80 NOT NULL 如何才能做到这一点 正如 Orb
  • 从另一个表复制权限

    是否可以将用户权限从 PostgreSQL 数据库中的一个表复制到另一个表 是不是只要更新一下就可以了pg class relacl将目标表的列值替换为源表的值 如下所示 UPDATE pg class SET relacl SELECT
  • 添加日期时间和时间

    服务器 SQL Server 2012 SP1 开发者版 Code declare datetime datetime 1900 01 01 00 00 00 000 declare time time 11 11 11 select da
  • 获取每件商品的最新价格

    我有一张桌子 ItemID PurchaseDate Price 001 03 17 2013 19 00 002 03 17 2013 14 00 001 03 18 2013 13 00 002 03 18 2013 15 00 001
  • SQL查询3个表,无法得到所需的结果

    列出所有已售出的作品以及艺术家 订购日期和发货日期 SELECT title artist order date ship date FROM items orders orderline WHERE orders order id ord
  • PostgreSQL、Npgsql 返回 42601:“$1”处或附近的语法错误

    我正在尝试使用 Npgsql 和 或 Dapper 来查询表 但我不断遇到Npgsql PostgresException 42601 syntax error at or near 1 这是我用 NpgsqlCommand 尝试的结果 u
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • 在两个以上的表上使用内联接删除查询

    我想使用两个以上表上的内联接从表中删除记录 假设我有表 A B C D 其中 A 的 pk 在所有其他提到的表中共享 然后如何编写删除查询以使用表 B 和 A 上的内联接从表 D 中删除记录 因为条件是从这两个表中获取的 我需要从 DB2
  • 为什么 justify_interval('360 days'::interval) 结果 '1 年'

    因为某些原因justify interval now 2013 02 14 timestamptz 产生奇怪的结果 postgres select justify interval concat 365 4 1 days interval
  • PostgreSQL - 返回多列的函数

    这是一个提供 2 列结果的函数 在这个函数中有一个Loop被用来返回结果 功能 Create Type Repeat rs as label text count bigint CREATE OR REPLACE FUNCTION Repe
  • mysql变量赋值:如何强制赋值顺序?

    由于mysql是一种声明性语言 我找不到强制赋值变量顺序的方法 采取这个查询 SET v1 0 SET v2 0 SELECT v1 v2 FROM MyTable table WHERE v1 v2 is not null AND v2
  • 使用聚合函数时减少 Athena 扫描的数据量

    以下查询扫描 100 MB 的数据 select from table where column1 val and partition id 20190309 然而 下面的查询扫描了 15 GB 的数据 有超过 90 个分区 select
  • SQL限制数据库中的最小值和最大值

    CREATE TABLE TBL CD CDnr int identity 1 1 CDTitel nvarchar 80 NOT NULL CDduur int CDprijs smallmoney 所以我正在创建这个表 有什么方法可以将
  • SQL Server:比较两个表中的列

    我最近完成了从某些应用程序的旧版本到当前版本的迁移 在迁移数据库时遇到了一些问题 我需要一个可以帮助我比较两个表中的列的查询 我的意思不是行中的数据 我需要比较列本身来弄清楚我错过了表结构的哪些变化 看一下红门 SQL 比较 http ww
  • 获取SQL中前2个特殊字符之间的字符

    我有数据在sql 只是要注意 SQL STudio is the IDE like data a 10 b c a 1 b c 我想获取前两个符号之间的数据 Output 10 1 这就是我的方法 SELECT CAST
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失
  • psycopg 错误,列不存在

    我不断收到这个 错误 psycopg2 ProgrammingError 列 someentry 不存在 该错误表明该列someentry不存在时someentry不是列 它只是要输入数据库的值 这是给出错误的代码 cur execute

随机推荐

  • 如何将不在phonegap注册表中的cordova插件添加到meteor?

    根据文档 https github com meteor meteor wiki Meteor Cordova Phonegap integration using cordova plugins directly in your appl
  • 将每个值作为 SQL 中的行重复 n 次

    一段时间以来 我一直试图在 SQL Oracle 11g 中实现这一目标 但找不到合适的方法 我的桌子names有以下几行 NAME REPEAT KAUSHIK 2 KARTHIK 3 NIDHI 1 ASHWINI 5 JAGADEES
  • 梅文。 “无家可归”的罐子该怎么办?

    我有一些 proprietary jar 需要包含在我的项目中 但我不想将其安装到本地存储库 我最初所做的是将 jar 放入我的项目的版本控制中lib 文件夹 然后将 Maven 依赖项指定为
  • HTML5 画布圆形文本

    如何使用画布创建圆形文本 圆形文本 字母现在应该正确定向 CanvasRenderingContext2D prototype fillTextCircle function text x y radius startRotation va
  • 使用正则表达式进行 Github 搜索

    有没有办法使用正则表达式在 github 存储库中搜索代码 目前 我克隆了存储库并进行搜索 但我想输入类似的内容 s foo gi 并查找代码中所有出现 foo 的地方 foo create foo extend fooBar barFoo
  • 从 SurfaceView 获取图像到 ImageView?

    我在从用作相机预览的 SurfaceView 获取图像 可绘制对象或位图时遇到了一些麻烦 final CameraSurfaceView cameraSurfaceView new CameraSurfaceView this Linear
  • 使用边框创建三角形

    我最近需要创建对话气泡 为了在对话气泡的末端创建小三角形尖端 我使用了CSS技术 http jsfiddle net 66jAA 5 其中元素被赋予0 width and 0 height并给定边界 使某些边框透明会产生对角线 这非常有效
  • 如何在 React 的子功能组件中触发一个动作?

    对于基本的表单 输入布局 很明显应该使用回调来处理从子组件到父组件的状态更改 由子组件发起 但是父组件如何要求子组件重新评估其状态并将其传达回父组件 这里的最终目标只是在提交表单按钮时触发子输入的验证 给定的 ts 代码如下所示 const
  • Go 声明中的“_,”(下划线逗号)是什么?

    我似乎无法理解这种变量声明 prs m example 究竟是什么 他们为什么声明这样的变量而不是 prs m example 我发现它是举例 地图 https gobyexample com maps 它避免了必须为返回值声明所有变量 它
  • 解释一下C++代码

    我可以获得有关以下代码解释的帮助吗 include
  • “复制本地”对于项目引用是否具有传递性?

    沃特 拟议的骗局 因为这里的问题表明了相反的情况链接问题 https stackoverflow com questions 12386523 visual studio not copying content files from ind
  • guice:命令行运行时注入/绑定

    我有以下问题 Inject MyClass Service service this service service public void doSomething service invokeSelf 我有一个模块 bind servic
  • 如何在没有 TCP/IP 堆栈的情况下用 Java 发送以太网帧

    我的 Java 应用程序应该控制直接连接到我的计算机 Ubuntu 和 Windows 网络接口的外部设备 EtherCAT 总线技术 没有连接其他网络设备 通信是在标准 IEEE 802 3 以太网帧上完成的 无需 IP 堆栈 发送数据示
  • 如何在 TensorFlow 中将张量转换为 ndarray?

    我的目标是将张量转换为 ndarray 而不需要 run 或 eval 我想执行与示例相同的操作 A tf constant 5 B tf constant A 1 0 0 但是 ndarray 可以位于 tf constant 内部 但张
  • 如何使用NuGetpackages.config文件?

    I see a 包配置解决方案中我的每个项目的文件 它包含有关各种程序集信息的信息 我希望 NuGet 能够自动扫描这些 packages config 并根据需要进行下载 但事实并非如此 我需要手动安装所有软件包吗 如果右键单击相关项目
  • python pip install 在 Windows 上不起作用

    我在 Windows 上安装了 python 2 7 10 我尝试使用以下命令在命令行上安装 Django C users user myproject gt python pip install django 这会显示以下错误 pytho
  • 更改 UITextView 中一个链接的属性

    我有一个UITextView具有多个 URL 我通过设置激活dataDetectorTypes财产给UIDataDetectorTypeLink 然后我使用linkTextAttributes属性来设置链接的颜色 现在 当用户点击其中一个链
  • 此编码器要求从 initWithCoder 返回替换的对象:

    我的应用程序在 iOS 11 2 上运行良好 但在 iOS 11 3 中会崩溃 我有例外 由于未捕获的异常 NSGenericException 而终止应用程序 原因 此编码器要求从 initWithCoder 返回替换的对象 我有一个带有
  • 通过 golang 中的多个 HTTP 处理程序包含上下文对象

    我刚刚读过这篇博文 http blog golang org error handling and go TOC 3 关于创建函数类型并实现 ServeHTTP 该函数上的方法能够处理错误 例如 type appError struct E
  • 在 SQL 中实现不相交集逼近(并集查找)

    使用 SQL 实现近似不相交集的最佳方法是什么 Details 我有一个边表 存储为两列表 vertex a vertex b 我需要一个不同集合的表 存储为 vertex set id 每个顶点一行 用不相交的 set id 标记每个顶点