在java中有效地连接2个节点列表

时间:2018-01-10 15:17:58

标签: java graph-theory max-flow

我正在建立一个流网络,我有两个包含节点的列表,这些节点具有与之关联的属性。我必须根据这些属性连接两个列表。

我目前正在做的是迭代列表A,并且每个元素迭代列表B的所有元素,并且如果它们具有至少1个匹配属性则连接节点。这意味着我必须为列表A中的每个元素访问列表B中的所有节点。

是否有更快的方式连接两个列表?

也许保留所有属性的矩阵,然后只通过属性列并基于此连接?会消耗更多的内存。

编辑:对于这个问题,两个列表都包含具有技能列表的节点(比如1,2,3),然后我需要使用该技能将列表a的节点连接到列表b的同一节点。

编辑: 我现在给人们一堆技能和所有工作所需的技能。 然后我弹出一项技能并迭代所有工作,如果它包含我连接两者的技能。

1 个答案:

答案 0 :(得分:0)

不考虑语言,这里有一些关于算法的思考。

根据您的属性,您可以通过预处理列表来改善这一点,这可能会有一些特殊情况。

例如,假设您的节点有2个属性:一个id(int)和一个weight,您需要在id上匹配。然后,作为预处理,您可以根据您的ID

对您的两个列表A和B进行排序

=>复杂度:O(nA.log(nA))+ O(nB.log(nB))

之后,您将在2个列表与2个索引之间进行匹配,并且只对每个列表进行一次迭代。假设您在ID上按升序排序,在每一步,您都有xAiA - 排序列表sortA的元素,ID为idA,{{1} },xB - 排序列表iB的元素,ID为sortB并且:

  • 如果idB匹配,请执行idA = idBiA++
  • 如果iB++没有匹配项,请执行idA > idB
  • 如果iB++没有匹配项,请执行idA < idB

=&GT;复杂度:O(nA + nB)

=&GT;总复杂度:O(nA + nB)+ O(nA.log(nA))+ O(nB.log(nB))。暴力复杂性将是O(nA.nB)

您可以根据自己的属性找到预处理列表的其他方法:

  • 也许您有办法对列表进行全部或部分排序?
  • 也许您可以使用任何有用的树结构来组织/存储您的属性或支票,这样您就可以改进比较工作流程,并且会从列表A中为每个节点访问更少的列表B节点?
  • 也许您可以根据您的属性计算一些类似哈希码的属性,以便您可以轻松匹配您的检查以进行匹配?
  • 也许您有办法隔离已匹配的节点(如果在您的情况下有意义),减少列表B的大小?
  • 也许别的什么?

这里的关键是,如果你分成多个步骤,你可以节省时间,这要归功于你的复杂性而不是乘法的增加

我希望它可以帮到你

PS:在某些情况下,您还可以存储更多内容并节省时间复杂度,同时增加空间复杂性。因此,您可以预处理列表的多个方面,但您需要存储更多数据 - &gt;你的选择取决于你的约束

编辑(整合评论): 使用更多空间(我不知道你有多少技能以及你可以使用多少空间来存储预处理的东西):你可以为每种技能计算一个列表,包含具有此技能的每个候选人的id(你)将所有内容存储到HashMap中&gt;)需要O(nCandidates)来填充所有这些列表(只有一次迭代)。

例如,您将拥有:

  • 技能1:[candidate1,candidate2]
  • 技能2:[candidate1,candidate3,candidate4,candidate5]
  • 技能3:[candidate1,candidate2,candidate3,candidate5]
  • 技能4:[candidate2,candidate3,candidate5]

然后,对于每个工作,你选择匹配第一个技能的候选人,用他们过滤第二个技能的候选人名单等,直到最后一个技能,你得到所有匹配所有技能的候选人的名单。 从理论上讲,它对于每项工作仍然是O(nCandidates),但在“现实生活”中,您可以将最少候选人的技能作为第一技能,并迭代使用增加候选人数量的技能,使其小于O(nCandidates)

例如,对于以前的列表,以及需要技能1,技能3和技能4的工作,您将拥有:

  • 步骤:选择技能:此技能的候选人=&gt;其余候选人
  • 步骤1:技能1:[candidate1,candidate2] =&gt; [candidate1,candidate2]
  • 第2步:技能4:[candidate2,candidate3,candidate5] =&gt; [候选设备Candidate2]
  • 步骤3:技能3:[候选1,候选2,候选3,候选5] =&gt; [候选设备Candidate2]

=&GT;操作:在[candidate1,candidate2]中寻找candidate1和candidate2,在[candidate2,candidate3,candidate5]中寻找candidate1和candidate2,在[candidate2,candidate3,candidate5]中寻找candidate2

同样的事情可以反过来做(候选人 - > [技能])让工作与候选人的技能相匹配