笛卡尔乘积c语言代码,c – 高效笛卡尔乘积算法

笛卡尔乘积c语言代码,c – 高效笛卡尔乘积算法有人可以向我证明比目前使用的笛卡儿乘积算法更有效 假设有一个 我已经看了周围的 SO 和谷歌 但看不到任何明显的东西 所以我可能会缺少一些东西 foreach intiinis foreach intjinjs Pairiandj 这是我在代码中做的非常简化的版本 两个整数是用于检索一个 多个对象的查找键 并且来自两个查找的所有对象都被配对在一起成为新对象 这个小

有人可以向我证明比目前使用的笛卡儿乘积算法更有效(假设有一个)。我已经看了周围的SO和谷歌,但看不到任何明显的东西,所以我可能会缺少一些东西。

foreach (int i in is) {

foreach (int j in js) {

//Pair i and j

}

}

这是我在代码中做的非常简化的版本。两个整数是用于检索一个/多个对象的查找键,并且来自两个查找的所有对象都被配对在一起成为新对象。

这个小型的代码块在一个更大的更复杂的系统中成为主要的性能瓶颈,因为它在规模上运行的数据集。其中一些可能通过改进用于存储对象的数据结构和所涉及的查找来缓解,但是我觉得仍然是笛卡尔乘积本身的计算的主要问题。

编辑

所以有更多的背景我的具体使用的算法,看看是否可能有任何技巧,我可以用来回应Marc的评论。整个系统是一个SPARQL查询引擎,它通过图形数据集来处理SPARQL查询,SPARQL是一种基于模式的语言,因此每个查询由一系列与图形匹配的模式组成。在两个后续模式没有共同变量(它们不相交)的情况下,有必要计算由两个模式产生的解的笛卡尔积,以获得用于整体查询的可能解的集合。可能有任何数量的模式,我可能需要多次计算笛卡尔乘积,如果查询由一系列不相交的模式组成,这可能导致可能的解决方案中相当指数的扩展。

不知怎的,从现有的答案我怀疑是否有任何技巧可以应用

更新

所以我以为我会发布一个更新我实现了为了最小化笛卡尔积分产品的需要,从而优化查询引擎一般。注意,并不总是可以完全消除对产品的需求,但是几乎总是可以进行优化,所以连接的两个组件的尺寸要小得多。

由于作为一组三重模式的每个BGP(基本图形模式)被执行为块(本质上),引擎可以自由地重新排序BGP内的模式以获得最佳性能。例如考虑以下BGP:

?a :someProperty ?b .

?c :anotherProperty ?d .

?b a :Class .

执行查询需要笛卡尔乘积,因为第一种模式的结果与第二种模式不相交,因此前两种模式的结果是其各自结果的笛卡尔乘积。这个结果将包含比我们实际需要的结果更多的结果,因为第三种模式限制了第一种模式的可能结果,但是我们以后不再应用此限制。但是如果我们重新排序如下:

?b a :Class .

?a :someProperty ?b .

?c :anotherProperty ?d .

我们仍然需要一个笛卡尔乘积来获得最终的结果,因为第2和第3种模式仍然不相交,但是通过重新排序,我们限制了第二种模式的结果的大小,这意味着我们的笛卡尔积的尺寸会小得多。

我们有一些其他的优化,但是我不会在这里发布,因为它开始对SPARQL引擎内部部分进行了详细的讨论。如果有任何人对进一步的细节感兴趣,请发表评论或给我发送tweet @RobVesse

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222344.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:00
下一篇 2026年3月17日 下午4:00


相关推荐

  • vue时间日期格式化

    vue时间日期格式化//对Date的扩展,将Date转化为指定格式的String//例子://(newDate()).Format("yyyy-MM-ddhh:mm:ss.S")==>2006-07-0208:09:04.423//(newDate()).Format("yyyy-M-dh:m:s…

    2022年5月23日
    44
  • 二部图(二分图)总结

    二部图(二分图)总结1 二部图二部图又叫二分图 是图论中的一种特殊模型 设 G V E 是一个无向图 如果顶点 V 可分割为两个互不相交的子集 A B 并且图中的每条边 i j 所关联的两个顶点 i 和 j 分别属于这两个不同的顶点集 iinA jinB 则称图 G 为一个二分图 简单来说 如果图中点可以被分为两组 并且使得所有边都跨越组的边界 则这就是一个二分图 准确地说 把一个图的顶点划分为两个不相交子集 使得

    2026年3月19日
    3
  • 签名字体怎么练_练字方法练自己名字签字

    签名字体怎么练_练字方法练自己名字签字导读:今天来给大家分享【签名字体怎么练】技法来源于网络,只是分享学习一下。感谢大家的支持,如果,你在签名字体上有什么不懂的可以来询问我的。谢谢大家的浏览!签名字体怎么练1、签名也是字体造型的再创作,因此签名设计对一个人的书法水平和理解能力还是有一定要求的。在此,我建议大家可以先练习好楷书和行书。如果真的没那个天分,就好好练习数字1.2.3.4.5.6.7.8.9。为什么练习数字可以对设计签名有帮助呢,因为数字和汉字笔画在书写方面具有一定的相似性,可以借鉴。同时帮助您练顺运笔。2、要想设计好签名,就要

    2025年9月21日
    7
  • Linux源码安装_linux源码包的安装

    Linux源码安装_linux源码包的安装最近想搞条形码和二维码,于是安装zbar,好生难搞。wgethttp://downloads.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.gztar-zvxfzbar-0.10.tar.gzsudoapt-getinstallpython-gtk2-devsudoapt-getinstalll

    2025年6月24日
    8
  • manifest文件使用(manifest文件作用)

    解决难以打开MANIFEST文件的问题打开MANIFEST文件的麻烦MicrosoftNotepad已删除你尝试加载MANIFEST文件并收到错误,例如“%%os%%无法打开MANIFEST文件扩展名”。通常情况下,这意味着MicrosoftNotepad没有安装在%%os%%上。由于您的操作系统不知道如何处理此文件,因此无法通过双击将其打开。提示:如果你…

    2022年4月11日
    187
  • python无人机编程_3d硬金是什么意思

    python无人机编程_3d硬金是什么意思往期本文是双足机器人系列的第三篇,在前面的文章中我们介绍了2D线性倒立摆的基本理论,详见:【双足机器人(1)】线性倒立摆及其运动控制(附代码)在这篇文章中我们要详细介绍3D线性倒立摆的基本…

    2022年8月18日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号