我使用 GraphX API 在 Scala 中构建了一个图形。在我的图中,每个顶点都有一个LinkedHashMap[Int, ListBuffer[ListBuffer[Int]]]
as 属性:每对 (key, value) 的LinkedHashMap
代表:
- 键:节点的 id - as
Int
- 值:到达节点的所有可能路径 - 每条路径都是 a
ListBuffer[Int]
,所以我有 aListBuffer
ofListBuffer[Int]
(我曾经Pregel
创建过LinkedHashMap
s)。所以,我想实现从图中删除节点的情况。我要做的是:
- 在 each
LinkedHashMap
中删除带有键 == id_of_the_node 的元素 - 在 each
ListBuffer[ListBuffer[Int]]
中删除包含已删除节点的列表(路径)(路径将不再存在)。
假设我有以下节点(我将省略其他节点):
节点 1:(1,Map(5 -> ListBuffer(ListBuffer(1, 3, 5), ListBuffer(1, 4, 5)), 6 -> ListBuffer(ListBuffer(1, 3, 6)), 3 -> ListBuffer(ListBuffer(1, 3)), 4 -> ListBuffer(ListBuffer(1, 4)), 1 -> ListBuffer(ListBuffer(1))))
节点 2:(2,Map(5 -> ListBuffer(ListBuffer(2, 1, 3, 5), ListBuffer(2, 1, 4, 5)), 6 -> ListBuffer(ListBuffer(2, 1, 3, 6)), 3 -> ListBuffer(ListBuffer(2, 1, 3)), 4 -> ListBuffer(ListBuffer(2, 1, 4)), 1 -> ListBuffer(ListBuffer(2, 1)), 2 -> ListBuffer(ListBuffer(2))))
节点 3:(3,Map(5 -> ListBuffer(ListBuffer(3, 5)), 6 -> ListBuffer(ListBuffer(3, 6)), 3 -> ListBuffer(ListBuffer(3))))
假设我想从中删除3
节点myGraph
。那么,节点的属性应该变成:
节点 1:(1, Map(5 -> ListBuffer(ListBuffer(1, 4, 5)), 4 -> ListBuffer(ListBuffer(1, 4)), 1 -> ListBuffer(ListBuffer(1))))
节点 2:(2, Map(5 -> ListBuffer(ListBuffer(2, 1, 4, 5)), 4 -> ListBuffer(ListBuffer(2, 1, 4)), 1 -> ListBuffer(ListBuffer(2, 1)), 2 -> ListBuffer(ListBuffer(2))))
节点 3:(-1, LinkedHashMap[ListBuffer[ListBuffer[]]]())
- 我不知道如何分配一个空的LinkedHashMap[ListBuffer[ListBuffer[Int]]]
.
我定义了以下方法:
def del(nodeToDelete: Int, vertexMap: collection.mutable.LinkedHashMap[Int,ListBuffer[ListBuffer[Int]]]): collection.mutable.LinkedHashMap[Int,ListBuffer[ListBuffer[Int]]] = {
vertexMap.keySet.foreach{ k =>
if(k == nodeToDelete) vertexMap.remove(k)
}
vertexMap
}
但这只是为了1
上面提到的一点(使用键 == id_of_the_node 删除元素)。另外,如果我在myGraph
如下的顶点上调用它,它不会给我想要的结果。
myGraph.vertices.map(vertex => vertex._2).map(myMap => del(3,myMap))
如何正确编写方法(同时实现点1
和2
)?以及如何使用它myGraph.vertices
?在伪代码中:
foreach key k of vertexMap
if(k == nodeToDelete) vertexMap.remove(k)
foreach ListBuffer l1
foreach ListBuffer l2
if (l2.contains(nodeTodelete)) remove the list
if(l1 is empty) vertexMap.remove(k)
此外,LinkedHashMap
该方法是否具有最佳时间复杂度的数据结构remove
?