私はk個のノードのシーケンスを持っています、、、N1
...N2
それぞれN3
がNk
連続してヒットします(スキップの可能性があります)。
これらのノードの1つにアクセスするたびに、前のノードからそこに到達するのにかかった時間を+=する必要があります。トリッキーな部分は、に到達N1
せずに戻った場合Nk
、これらの+=更新を削除する必要があることです。
1つの方法は、各ノードにxとyの2つの量を保持することです。ノードをホップすると、+=値がyになります。到達した場合N1
はyを0にリセットしますが、到達Nk
した場合はx += y
各ノードに対してリセットします。
問題は、ヒットするたびにNk
O(n)操作が必要になることです。たとえ、シーケンスがN1
ヒットせずに戻るのは一般的なケースではない場合でもですNk
。すべての反復が最後に到達するたびにO(n)「コミット」せずに、これをより効率的に行うためのよりスマートな方法はありますか?
3つのノードを持つこの例を考えてみましょう:N_1
、、:N_2
N_3
左側は反復でヒットしたノードのサブシーケンスを示し、右側は累積カウンターに含まれるべきものを示しています。
(N_1, 2)(N_2, 3)(N_3, 7) ---> (N_1, 2)(N_2, 3)(N_3, 7)
(N_1, 4)(N_3, 2) ---> (N_1, 6)(N_2, 3)(N_3, 9)
(N_1, 6)(N_2, 3) ---> (N_1, 4)(N_2, 3)(N_3, 2) //nothing changes as this was an "invalid" op because we never hit the end node
etc...