几个小时以来,我一直试图在网上和这个网站上找到这个问题的答案,但我并不完全在那里。
我知道 .NET 为应用程序分配 1MB,最好通过重新编码而不是强制堆栈大小来避免堆栈溢出。
我正在开发一个“最短路径”应用程序,该应用程序最多可以支持大约 3000 个节点,此时它会溢出。这是导致问题的方法:
public void findShortestPath(int current, int end, int currentCost)
{
if (!weight.ContainsKey(current))
{
weight.Add(current, currentCost);
}
Node currentNode = graph[current];
var sortedEdges = (from entry in currentNode.edges orderby entry.Value ascending select entry);
foreach (KeyValuePair<int, int> nextNode in sortedEdges)
{
if (!visited.ContainsKey(nextNode.Key) || !visited[nextNode.Key])
{
int nextNodeCost = currentCost + nextNode.Value;
if (!weight.ContainsKey(nextNode.Key))
{
weight.Add(nextNode.Key, nextNodeCost);
}
else if (weight[nextNode.Key] > nextNodeCost)
{
weight[nextNode.Key] = nextNodeCost;
}
}
}
visited.Add(current, true);
foreach (KeyValuePair<int, int> nextNode in sortedEdges)
{
if(!visited.ContainsKey(nextNode.Key) || !visited[nextNode.Key]){
findShortestPath(nextNode.Key, end, weight[nextNode.Key]);
}
}
}//findShortestPath
作为参考,Node 类有一个成员:
public Dictionary<int, int> edges = new Dictionary<int, int>();
图 [] 是:
private Dictionary<int, Node> graph = new Dictonary<int, Node>();
我试图优化代码,以便它不会携带比从一次迭代(递归?)到下一次迭代所需的更多包袱,但是使用 100K 节点图,每个节点都有 1-9 条边它会很快就达到了 1MB 的限制。
无论如何,我是 C# 和代码优化的新手,如果有人能给我一些指示(不是这样),我将不胜感激。