私のコードには、呼び出しごとに動的に割り当てられたスタックを使用する標準の DFS 実装があります。
私はその機能をよく呼び出します。多くの場合、小規模な実行 (200 ~ 1000) ノードですが、場合によっては、100 万ノード以上の大規模な接続コンポーネントがあります。
プロファイラーは、スタックの割り当てにかなりの計算時間が浪費されていることを示しています。既存のメモリ (コール スタックなど) を再利用したいと考えています。ただし、関数はスレッドセーフのままにする必要があります。
関数を再帰的にせずにコールスタックを動的に使用する効率的な方法はありますか?
これまでの私の最善のアイデアは、後続の呼び出しごとに自動スタック サイズを 2 倍にする追加の引数を使用して、関数を再帰的にすることでした。
疑似 C:
void dfs(size_t stack_length, void * graph, graphnode_t start_node) {
graphnode_t stack[stack_length];
size_t stack_size = 0;
for (all nodes) {
// do something useful
if (stack_size < stack_length) {
stack[stack_size++] = new_node;
} else {
dfs(stack_length * 2, graph, new_node);
}
}
}