我刚刚在网上偶然发现了这个问题。它有点像这样。
有些公司在其他公司拥有股份。我想知道一家公司是否拥有另一家公司。
所以,问题在于,如果公司1拥有超过75%的公司2,他自动拥有它。另一个问题是,如果公司1拥有超过75%的公司3拥有超过75%的公司2,那么公司1拥有公司2。
这是一个更清晰的例子:
Company 1 owns 50% of Company 2
Company 1 owns 75% of Company 3
Company 3 owns 25% of Company 2
Therefore, Company 1 owns Company 2
我认为这将涉及递归,通过公司分割所有权流程。但是,我无法弄清楚如何实现这一点。非常感谢你的帮助!
*更新:抱歉没有正确定义问题。问题包括记录,包含三个数据,如上所示,问题是要找出某个公司是否拥有另一个公司(例如公司1是否拥有公司2?)。
因此,我计划将每个所有权值存储到所有者(直接所有权)并减少间接所有者的所有权值(如果拥有> 75%,然后替换w /下一个所有者),直到它到达基础。谢谢你的建议!
答案 0 :(得分:2)
我认为以下工作,但我没有彻底测试它。坦率地说,我不确定我是否理解你的要求。
根据输入构建有向图。每个命名公司都成为一个顶点。每条边代表公司之间的所有权关系,权重等于所有权百分比。
要确定特定公司拥有哪些公司,请使用以下伪代码:
Let company C be the company of interest
Let T be a table of all companies and their total ownership by company C
Let S be the set of companies completely owned by C, initially containing only C itself
While S is not empty:
Choose an unvisited company X from S
Mark X as visited
For each edge leading away from X to another company Y:
Add the edge's weight to T[Y]
If T[Y] >= 75, add Y to S
答案 1 :(得分:2)
我没有在列表中做出任何假设,它可以存在多长时间以及涉及多少公司。我也不假设所有公司都有联系。列表可以形成许多不同的所有权图。我还假设有可能允许某种形式的共同所有权的情况(B和B的75%拥有75%的A,奇怪的情况我会承认,但数学上没有什么能阻止这种情况发生)
解决绝对所有权的蛮力算法可以这样做:
第一遍 - 确定公司与其他公司的所有关联。
Let C be the company of interest
Let A be the list of companies C has associations with.
Let Astar be a list of companies not already visited, initially containing C.
Let dist be the distance of companies from C, initially set to 0.
While Astar is not empty
Let X be the first in Astart, remove X from Astar
Add X to A
dist++
For each company Y that X has stakes in
if Y is not in Astar,
Set Y.dist = dist
Add Y to Astar
现在我们有一份C可能拥有的公司名单(A),原始名单中的所有其他公司都可以被忽略。
现在让我们计算实际所有权。在这里,我们尝试计算C在所有其他公司中的实际赌注。如果C拥有50%的X而X拥有50%的Y,那么C拥有Y的25%。考虑到75%的规则,如果公司在另一个公司拥有70%或更多的股份,我们会自动转换75%百分比为100%。
Let X[] be an array containing the stakes X has in all other companies within A, initially set to 0
For each company in A
Let X be the company the furthest away from C not already visited in A.
Mark X as visited.
For each edge E leading away from X to company Y
if the Y is marked visited in A
For each edge F leading away from Y to company Z
Set X[Z] = F * E
If X[Z] >= 75%
Set F = 100%
remove visited mark on X
else
For each company W that Y has stakes in
Set X[W] = Y[W] * E
这将执行一种回溯算法,在建立所有权时重新评估赌注。最后,您应该拥有C [],其中包含C在所有其他公司中的所有净赌注。如果任何超过75%,则C拥有它。
这是一个非常粗野的算法,最好将两个通道合并为一个以使其成为更优雅的解决方案,尽管此时我更喜欢获得有效的东西的证明而不是看起来或表现良好的东西。我没有尝试过,只是在精神上跑,所以我可能是非常错的。但我认为它将涵盖相互所有权周期。但是,要查看共同所有权,您必须重复该过程,将C替换为列表中的每个公司。然后,您可以从每个公司直接看到所有权的完整图片。
---编辑---
我希望我在这里没有误会,这个问题确实难以完全掌握。如果我们拥有大量公司并且所有权在三元组中定义,那么您可以通过将列表捆绑在一起的所有三元组来执行以下操作。这将创建一个更大的图,但解决一个图比解决一组相互依赖的图更容易