このコードの小さな部分に関する最初の質問のフォローアップとして、これまでに思いついたものよりもうまくできるかどうかを確認するためにフォローアップを依頼することにしました。
以下のコードは、二分木 (左/右 = 子/次) を反復処理します。down
ここには、条件式 (ブール値)を 1 つ減らす余地があると思います。最速の答えが勝ちます!
- ステートメントは複数の
cnt
ステートメントになる可能性があるため、これが 1 回だけ表示されるようにします。 child()
およびnext()
メンバー関数は、hasChild() および hasNext() 操作の約 30 倍遅くなります。- 反復を維持 <-- 提示された再帰的なソリューションがより高速だったため、この要件を削除しました。
- これは C++ コードです
- ノードの訪問順序は、以下の例のように維持する必要があります。(最初に親をヒットし、次に子をヒットし、次に「次の」ノードをヒットします)。
- BaseNodePtr は boost::shared_ptr であるため、割り当てが遅いため、一時的な BaseNodePtr 変数は避けてください。
現在、このコードはテスト ツリー内の 62200000 ノードにアクセスするのに 5897 ミリ秒かかり、この関数を 200,000 回呼び出しています。
void processTree (BaseNodePtr current, unsigned int & cnt )
{
bool down = true;
while ( true )
{
if ( down )
{
while (true) {
cnt++; // this can/will be multiple statesments
if (!current->hasChild()) break;
current = current->child();
}
}
if ( current->hasNext() )
{
down = true;
current = current->next();
}
else
{
down = false;
current = current->parent();
if (!current)
return; // done.
}
}
}