11
注:これはプログラミングチャレンジです この単純なアルゴリズムをさらに最適化するには?
この挑戦は
std::set
の使用を必要とします。各
j
と
k
サンプル入力と
入力
- 数
n
n
行:5 1 4 2 1 1 6 3 4 1 2
j
操作するためのものである:1
k
がstd::set
にある場合、出力Yes
又はNo
をj == 3
ためk
を見つける
3
、(k
がある場合)k
を削除するk
、2
を挿入します。
私はアルゴリズムのバージョンを変えましたが、すべてが遅すぎます。私は別のstd
関数を試しましたが、std::find
は最も速く見えますが、まだ遅すぎます。自分自身を実装することはさらに悪くなるかもしれません。そのため、ライブラリから関数を逃した可能性があります。私はそれをさらに最適化する方法は本当に分かりません。現在、私はこれを持っている:int main() { std::set<int> set{}; int Q = 0; std::cin >> Q; int type = 0; int x = 0; for (int i = 0; i < Q; ++i) { std::cin >> type; std::cin >> x; if (type == 1) set.insert(x); else if (type == 2) set.erase(x); else if (type == 3) std::cout << (std::find(std::begin(set), std::end(set), x) != std::end(set) ? "Yes" : "No") << '\n'; //Condition may be std::find, std::count or std::binary_search } return 0; }
挑戦は2秒で実行することが必要です。ここに私の結果があります:Function Time % over std::find -> 7.410s 370.50% std::count -> 7.881s 394.05% std::binary_search -> 14.050s 702.50%
私のアルゴリズムは、必要なアルゴリズムよりも3倍遅いことがわかります。
Function % of total time std::find -> 77.61% std::count -> 80.80% std::binary_search -> 87.59%
しかし、現在、私は
std::find
または類似の機能を使用するよりも良いアイデアを持っていない:ボトルネックは明らかにそれらの機能です。誰かが私のコードをさらに最適化する方法やアイディアを持っていますか?あるいは、欠けているボトルネックがいくつかありますか?
'if'ステートメントのチェーンは、本当に適切な' switch'のために叫んでいます。 – tadman
@ tadmanありがとう、私は試してみます。 – Rakete1111
'set.find()'を試しましたか? –