一些優(簡)秀(單)的演算法實現技巧

2021-07-24 11:58:38 字數 1728 閱讀 7982

1.定義一下自己習慣的變數名。

比如我比較喜歡在離散化的時候用lsh這個變數存離散值。

b[++ lsh] = val[i];

sort(b+1,b+1+lsh);

rep(i,n)val[i] = lower_bound(b + 1,b + 1 + lsh,val[i]) - val;

2.定義一些比較常用的東西

如樹套樹時候的一些namespace什麼的。

3.記住一些常用的東西?

//總結板子很重要?

sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + f[i][j];
4.在算方案數的時候,如果自信遞推+組合數一類東西不會掛掉,那麼就用,但是要用dp對拍。

如果實在不知道哪個錯了,那麼請預設組合數掛掉了。

5.環套樹用一遍for進行實現,通常樹邊不影響答案,那麼實際上我們計算一下有多少是環上的邊就行了,最後再統計樹邊的貢獻。

膜拜一下fsf的**:

# include 

# define rep(i, n) for (int i = 1; i <= n; ++ i)

# define for(i, a, b) for (int i = a; i <= b; ++ i)

# define nr 1001000

const

int mod = 1000000007;

int n, k, p[nr], deg[nr];

int f[nr][2];

int vis[nr];

bool ring[nr];

int main ()

int ans = 1;

rep (i, n) if (vis[i] == 0)

rep (i, n) if (!ring[i]) ans = 1ll * ans * (k - 1) % mod;

printf ("%d\n", ans);

return

0;}

6.寫簡單易懂的**.

if(vis[l][abs(dt)][cur][now])return f[l][abs(dt)][cur][now];

int &st = f[l][abs(dt)][cur][now];

vis[l][abs(dt)][cur][now] = 1;

如果你的腦子一直在被程式細節佔據的話你意識到你的做法整個是錯的的速度就很慢

「以我的記憶力要隨身帶個本子(」

本子就像是記憶體

大腦就是暫存器

「然後有一天zxn想把記憶體塞到暫存器裡面去(」

7.永遠要記住板子,哪怕是肌肉記憶,必須要記住板子怎麼寫。

因為你的腦子還需要用在不需要板子的地方。

8.善用assert來除錯程式。

如果你擔心assert太慢,那麼你可以:

if(a)assert(0);
雖然這樣很蠢。

9.注意溢位的情況,我們可以很簡單地判定乘法溢位。

顯然,如果返回0,就代表乘法溢位了。

if(max/a

< b)return0;

return

1;

一些常用的Spark SQL調優技巧

一些常用的spark sql調優技巧 使用快取表 在sparksql中,當我們建立表時,我們可以通過呼叫spark.catalog.cachetable tablename 或者dataframe.cache 的方式將表快取起來。這樣spark sql將僅掃瞄所需的列,並自動調整壓縮以最小化記憶體使...

一些常用的演算法技巧

1 巧用陣列下標 例 在統計乙個字串中字幕出現的次數時,我們就可以把這些字母當做陣列下標,在遍歷的時候,如果字母a遍歷到,則arr a 就可以加1了。法一 利用物件的key值不重複 var str hajshdjldjf function count str for var i 0 i str.le...

Java的一些實現技巧

1.顯示引數命名為otherobject 2.檢測this與otherobject是否引用同乙個物件 if this otherobject return true 3.檢測otherobject是否為null,如果為null,返回false,這一項很有必要 if otherobject null ...