笛卡尔积
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笛卡尔积相关的知识,希望对你有一定的参考价值。
参考技术A 首先知道啥是笛卡尔积,百度百科中解释是这样的:通俗理解就是一个集合中的所有元素与另外一个集合中的所有元素的所有组合。需要注意有先后顺序。
举个例子:
集合A=a,b, B=0,1,2,则
A×B=(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)
B×A=(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)
再如:
集合A是所有声母,集合B是所有韵母。那么集合A与集合B的笛卡尔积就是所有的拼音组合。
python默认迭代器库 itertools 提供笛卡尔积计算函数 product 。
用法:
示例1:
计算姓氏“张、李”和名“一、二、三”所有搭配组合。
示例2:
当然不仅仅是两个集合,多个集合也同样可以。
比如字典的生成。
当然如果字典生成不需要有序的话,可以使用另外两个函数 permutations
和 combinations 。
两者的区别在于,如果几个集合的元素相同,但位置顺序不同,permutations记为不同集,而combinations记为同一集合,也就是permutations为有序集合combinations为无序集合。
数据库:JOIN 与笛卡尔积
【中文标题】数据库:JOIN 与笛卡尔积【英文标题】:Database : JOIN vs Cartesian Product 【发布时间】:2015-08-04 10:06:26 【问题描述】:我真的很想知道在等效 SQL 查询中,与笛卡尔积相比,使用 JOIN 是否有任何性能提升。
或连接只是笛卡尔积的语法糖。
谁能告诉我笛卡尔积和JOIN的实现。 执行是否明智,两者都需要相同的时间复杂度。或者实现因数据库而异。
我已阅读以下帖子,但似乎对此仍有分歧:
Performance of Inner Join vs Cartesian product
Explicit vs implicit SQL joins
【问题讨论】:
从您写的内容来看,我只能得出结论,您正在优化某些东西,但不知道什么是笛卡尔积,也不知道什么是 JOIN。清除 XY 问题的案例。您对 theta 加入与常规加入有何疑问? 我已要求提供等效查询。对于相同的结果,当使用笛卡尔积(连同 where 过滤器)并使用 JOIN 做同样的事情时。如果是 CP:它是否首先创建笛卡尔积,然后执行“where”子句过滤器。或过滤发生在第二个内循环内。 (如果我们使用两个表)。如果笛卡尔积足够大,那么在两遍中创建结果集需要大量时间,而如果在迭代时过滤结果,则不需要第二遍,这比第一种方法更快。 笛卡尔积是一种数学运算,正如您所说,在 SQL 中,它是一个 JOIN。因此,如果两者相同,则 JOIN 不能比 JOIN 快。您链接的那个称为theta-style JOIN,我认为这就是您认为的笛卡尔积。两个 JOIN 之间没有“区别”,MySQL 不会花太多时间解析该信息。但是,您可以自行得出结论,与使用所有列计时的所有行相比,检索您需要的数据是否更快。你在混合苹果和橙子,你没有帮助任何人帮助你。 XY 问题,请阅读。 @NB :我了解您要传达的内容(将关系代数名称与 SQL 混合,即使我已经用 where 子句清楚地解释了 CP),但仍然没有得到我的答案问。如果可能的话,让我知道以下查询在性能方面是否相同:(从 A 内部连接表 B 中选择 * A.id =B.id;)和(从 A,B 中选择 *,其中 A.id = B.id ;)。带有连接的查询如何执行并且与第二个查询不同。这些查询的执行是如何发生的。如果可能的话,您能否以编程方式告诉我这些查询如何执行以生成所需的结果。 您评论中的两个查询不相同。第二个返回更多数据。它更慢。 【参考方案1】:无法评论,没有足够的代表。但是笛卡尔积提供了所有列,而不是您特别需要的列。这不会导致数据库性能问题,但是当您开始使用数据时,可能需要额外的工作来格式化您需要显示给最终用户的内容,从而导致代码中的性能问题。随着数据库的增长和潜在的扩展,可能会引入错误,我会避免使用笛卡尔。
【讨论】:
【参考方案2】:我可能完全错了,但这是我的观点。在一些大学数据库课程中,他们将 OP 描述的连接表的方法称为笛卡尔连接,因为基于矩阵或向量的笛卡尔积,而不是显式连接子句,这可能是 OP 如此称呼的原因.回想起来,数学是计算机的基础,它用于 SQL 语言的词汇和逻辑规范,特别是关系代数和关系微积分。我们在大学里学习了 SQL,而不是行业术语。我认为这就是学术界和工业界脱节的原因,理论与基于趋势商业实践的市场/适销对路的应用。我也认为将商业纳入学术界并不是一个好主意,除非出于各种原因与商业相关的课程。或许,一点点的谦卑,就能帮助人类走向更大的启蒙和进步。最伟大的思想有很多关于我们的知识感等创造的幻想的引述。没有限制和僵化的理解。
【讨论】:
以上是关于笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章