したがって、プログラミングコンテスト(ACM ICPCなど)からいくつかの練習問題を経験していたとき、人々はしばしばO(N ^ 2)ソリューション、またはさらに悪いことに、ヒープ(C ++のpriority_queue)またはdequeを使用することができます複雑さを軽減します。(ある種の最適化として、パターンの「何か」に気付いた後)
たとえば、「スライディングウィンドウの最大値」の問題では、次のようになります。
For each window of size K in an array of size N, compute the maximum.
些細なO(NK)アルゴリズム、かなり簡単なO(nlogn)ソリューション(ヒープを使用してそれを見ることができます)、および両端キューを使用するO(N)ソリューションがあります。
これらのプリンシパルは、役に立たない値を「捨てる」、またはプロパティ(最大、累積合計、最小など)を見つけるために領域を照会するというプリンシパルにあるようです。
たとえば、一部のO(N ^ 2)アルゴリズムをO(NlogN)に変換する場合、前のN個の要素すべてをループして最大値を見つける代わりに、priority_queueを使用して、特定のウィンドウ内で値が取得されるまで値をポップアウトし続けることができます。 。
誰か良いヒントがありますか?(もっと問題を起こす以外に...私はそれをやろうとしています)