也许你可以尝试一个贪心算法:
1. Create a list sortedList that stores each pair of nodes i and j and is sorted by the
weight w(i,j).
2. Create a HashSet connectedNodes that is empty at the beginning
3. while (connectedNodes.size() < n)
element := first element of sortedList
if (connectedNodes.isEmpty())
connectedNodes.put(element.nodeI);
connectedNodes.put(element.nodeJ);
delete element from sortedList
else
for(element in sortedList) //start again with the first
if(connectedNodes.get(element.nodeI) || connectedNodes.get(element.nodeJ))
if(!(connectedNodes.get(element.nodeI) && connectedNodes.get(element.nodeJ)))
//so it does not include already both nodes
connectedNodes.put(element.nodeI);
connectedNodes.put(element.nodeJ);
delete element from sortedList
break;
else
continue;
所以我稍微解释一下第 3 步:
您添加尽可能长的节点,直到所有节点都相互连接。connectedNodes
可以确定该图是连接的,因为您只需添加一个节点,如果他与列表中已经存在的另一个节点有连接。
所以这个算法是贪心的,它不能确保解决方案是最优的。但这是一个相当好的近似值,因为它总是取最短边(因为sortedList
是按边的权重排序的)。
哟不要进去duplicates
,connectedNodes
因为它是一个HashSet
,这也使运行时更快。
总而言之,运行时间应该是 O(n^2),因为在 O(n^3) 的开头和低于它的排序,因为在最坏的情况下,你会在每个步骤中运行大小为 n^2 的整个列表你做了 n 次,因为你在每一步中添加了一个元素。
但更有可能的是,你发现一个元素比 O(n^2) 快得多,我认为在大多数情况下它是 O(n)。