- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
例如,我们有一组公式如下:
B*2*j
B*3*i
B*3*j
C*2*j
C*3*i
C*3*j
D*2*i
D*2*j
D*3*i
D*3*j
我们可以用三个笛卡尔积来表示上面的公式:
D*(2+3)*(i+j)
(B+c)*3*(i+j)
(B+C)*2*j
所以总数是 3。我们还可以:
3*(B+C+D)*(i+j)
2*(B+C)*D
2*D*(i+j)
这也是 3。
请问是否有算法可以从一组公式中确定笛卡尔积的最小数量?而且还搞出这些产品?
最佳答案
首先,我将编写一组公式作为由 +
分隔的术语,因为您正在寻找的转换在代数上是有意义的(除了您不想合并的事实像 2+3
这样的数字变成 5
)。
您可以使用的基本操作是因式分解:将两个项(如ABC+ABD
)组合成AB(C+D)
。根据您的评论,您只能生成由单因子项总和组成的新因子,如上例中的 C+D
;你不能分解例如ABCD+ABDE
转换为 AB(CD+DE)
。
当且仅当它们正好共享 k-1 个因子时,您才可以分解 2 个 k 因子项。(例如,在我的 ABC+ABD
示例中,k=3。)每个这样的因式分解都会将集合中的项数减少 1:删除 2 个并重新添加 1 个。
在组合 3 个或更多项时多次执行此操作:ABC+ABD+ABE
可以首先分解为 AB(C+D)+ABE
,然后分解为那些2 项再次因式分解为 AB(C+D+E)
。请注意,我们以何种顺序列出总和中的项或乘积中的因子并不重要,在构建包含 3 个或更多项的因子时执行因式分解步骤的顺序也不重要。
然后我们可以将问题框定为图中的搜索问题,其中起始顶点对应于原始公式 (B*2*j + B*3*i + ... + D*3 *j
在你的例子中)并且从每个顶点 v 发出到它的子顶点的弧,每个弧对应于对 v 执行一些因式分解的结果。 v 将有一个子顶点用于可以执行的每个可能的因式分解在上面;如果 v 中有 m 个项,那么这意味着在最坏的情况下它最多可以有 m(m-1)/2 个子项,因为可能所有 m 个项共享 k-1 个因子的完整补充,这意味着它们中的任何一对都可以组合。
如果一个顶点没有可以通过因式分解码合的项对,那么它就是一个“叶子”——它没有 child ,不能进一步处理。我们想要找到的是具有最少项数的叶顶点。由于对应于图中弧线的每个因式分解都会将项数减少 1,因此这相当于搜索可能最深的顶点。这可以使用 DFS 或 BFS 来完成。但是请注意,使用这种方法可以多次生成相同的表达式(顶点),因此维护一个哈希表 seen
来记录所有已处理的表达式对于性能至关重要;然后如果我们访问一个顶点,尝试为它生成一个 child ,并且看到这个 child 已经在 seen
中,我们就避免再次访问这个 child 。
为了减轻通过同一组因式分解的多个不同顺序生成相同表达式的现象,您可以添加一个规则:order v 的子因式分解以某种方式,以便如果有 n子节点它们对应于此顺序中的因式分解 1、2、...、n,并在每个子顶点的单独“已跳过”字段中记录较早(在顺序中)因式分解被跳过以生成这个 child 。然后,当访问一个顶点时,避免生成它的任何“已经跳过”的因式分解作为 child ,因为这样做会创建一个与其他一些现有顶点相同的顶点(通过以相反的顺序执行相同的一对操作)。
可能还有其他可用的加速方法可以减少首先生成的重复顶点的数量,但这应该足以获得解决小问题的结果。
关于algorithm - 是否有一种算法可以从一组公式中提取最少数量的笛卡尔积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045823/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!