概要

ヒューリスティックコンテストにおける小手先のテクニックを自分用にまとめたもの。 汎用的な手法というよりは細かい高速化テクニックが多め。 あくまで備忘録なので説明は少なめかつ順番は適当。 出典があるものはリンクで代用。

怪しい記述があれば@ethylene_66までご連絡いただければ幸いです。

テクニック

高速化前のボトルネック把握

Untitled

乱数生成

特殊関数の前計算

constexpr int LOG_TABLE_SIZE = 1<<20;
double log_table[LOG_TABLE_SIZE];
double log_table_stable[LOG_TABLE_SIZE];
void init_log_table() {
    for (int i = 0; i < LOG_TABLE_SIZE; i++) {
        double x = ((double)i + 0.5) / LOG_TABLE_SIZE;
        log_table[i] = log(x);
        log_table_stable[i] = log_table[i];
    }
    // shuffle
    for (int i = 1; i < LOG_TABLE_SIZE; i++) {
        int j = rng.range_random_safe(LOG_TABLE_SIZE);
        swap(log_table[i], log_table[j]);
    }
}
inline double log_random() {
    static int idx = 0;
    if (idx == LOG_TABLE_SIZE)
        idx = 0;
    return log_table[idx++];
}