單調佇列優化
當dp[i][j]從一段區間轉移而來,且這段區間隨i,j的後移而後移/前推時,可以考慮用單調佇列掃一遍,可將o(n^2)優化至o(n)。
四邊形不等式優化
形如dp[i][j]=min的dp方程,//取max不一定滿足四邊形不等式
若對於i<=i'<=j<=j',有w(i',j)<=w(i,j')(即區間包含單調性)和w(i,j)+w(i',j')<=w(i',j)+w(i,j')(即四邊形不等式),則:
1.dp(i,j)+dp(i',j')<=dp(i',j)+dp(i,j');
2.記g(i,j)為對dp(i,j)最優的k,則決策點g(i,j)滿足單調性,即g(i,j)<=g(i+1,j)<=g(i+1,j+1) => g(i-1,j)<=g(i,j)<=g(i,j+1)/g(i,j-1)<=g(i,j)<=g(i+1,j);
因此列舉k時不必從1到i,可以直接由g(i-1,j)到g(i,j+1);對於固定的i-j,i,j=>g(i-1,j)~g(i,j+1)、i+1,j+1=>g(i,j+1)~g(i+1,j+2)、i+2,j+2=>g(i+1,j+2)~g(i+2,j+3)…這些區間互不重疊,因此σg(i,j+1)-g(i-1,j)<=n
時間複雜度由o(n^3)優化到o(n^2)。
一般而言,為了保證迴圈到dp(i,j)時g(i,j-1),g(i+1,j)已知,i應倒序列舉,j應正序列舉。至於內外層自變數,依題目要求保證順利轉移即可。
決策單調性優化
決策單調性指的是,dp[i]的最優轉移點k隨ik
'>i
'>增大保持單調不減。
二維情況可用四邊形不等式證明。
兩種實現方法:
1)分治
**難度較小,但得出dp值無先後順序(從中間開始二分,也就從中間開始算),一般適用於二維dp(dp[i][j]由dp[i-1][j]轉移而來,而i相同時同一維彼此線性無關)o(nlogn)
1//l,r: 被決策點的下/上界2//
l,r: 決策點的下/上界
3void work(int i,int l,int r,int l,intr)4
17// mid值已算出,從二分序列剔除
18 work(i,l,mid-1
,l,pos);
19 work(i,mid+1,r,pos,r);
2)單調棧/單調佇列
較為普適,但必須能在較短時間內(通過預處理)算出w(i,j),比如說o(1)。總複雜度o(nlogn)。
//sta[0]記錄棧中元素,sta[1]記錄此元素作為決策點的最小被決策點//找到以p作為決策點的最小被決策點(與棧頂的決策點相比即可)
int find(int
p)
return
ll;}
void
work()
}}// 模板根據不同題目會有較大變動
p5504 [jsoi2011] 檸檬
比較罕見的決策點單調遞減的題,而且不是全序列單調性,只有大小相同的貝殼之間轉移才有單調性,所以二分找最優決策點時mid代表的不是序列編號,而是在同種大小貝殼中的編號。寫的時候犯了不少錯誤,比如x寫成y,忘記mid特殊性等。
在將i壓入棧前,要先檢查當前棧頂p代替i成為最優決策點的時間是否大於(棧頂-1)q代替棧頂成為最優的時間;若是,則要不斷將棧頂彈出。否則會存在時間t,q比p優,但p不比i優,此時存在q比i優的可能性,但由於先前沒有把p彈出,此時無法繞過p直接比較i和q,從而錯過最優決策點。這個思想很重要,大部分決策單調的題都要考慮類似情況。
斜率優化
未完
凸優化
未完
優化的一些例項
優化使用的工具,使用loadrunner做為壓力測試工具,使用jprobe進行 剖析。1 第乙個例項。原狀況 呼叫乙個api,發現執行的時間很高,用jprobe分析,發現消耗時間最長的是把快取中的乙個樹從第三個節點進行扁平化,就是把第二個節點的子樹構造為乙個列表,不知道為什麼構造這個資料的耗時比直接...
mysql的一些優化
前言 sql優化,是一種概率層面的優化。至於是否實際使用了我們的優化,需要通過explain進行推測。注意 服務層中有sql優化器,可能會影響我們的優化,同時註明 sql的優化前提是有索引 有索引 有索引 in和exists的使用場景 select from a where exists selec...
Elasticsearch的一些優化
1.多執行緒程式插入,可以根據伺服器情況開啟多個執行緒index 速度可以提高n倍,n 2 2.如果有多台機器,可以以每台設定n個shards的方式,根據業務情況,可以考慮取消replias curl xput d 這裡設定20個shards,複製為0,如果需要replicas,可以完成index後...