麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

RMQ算法

2019-11-10 20:12:48
字體:
供稿:網(wǎng)友

這篇文章講RMQ(Range Minimum/Maximum Query)算法。 RMQ:即區(qū)間最值查詢。對于一個長度為n的數(shù)列A,詢問關(guān)于數(shù)列A中下標(biāo)在i,j間的最小或最大值。下面將介紹解決這兩個問題比較高效的算法。 RMQ算法:最容易想到的解決方案是遍歷,復(fù)雜度是O(n)。但當(dāng)數(shù)據(jù)量非常大且查詢很頻繁時,該算法無法在有效的時間內(nèi)查詢出正解。本篇文章將介紹一種比較高效的在線算法(ST算法)解決這個問題。所謂在線算法,是指用戶每輸入一個查詢便馬上處理一個查詢。該算法一般用較長的時間做預(yù)處理,待信息充足以后便可以用較少的時間回答每個查詢。ST(Sparse Table)算法是一個非常有名的在線處理RMQ問題的算法,它可以在O(nlogn)時間內(nèi)進(jìn)行預(yù)處理,然后在O(1)時間內(nèi)回答每個查詢。 ①預(yù)處理:預(yù)處理用DP的思想。 首先處理DP的狀態(tài):設(shè)F[i,j]表示[i,i+2^j-1]區(qū)間的最小值。例如,F(xiàn)(0,0)表示[0,0]之間的最小值,F(xiàn)(0,2)表示[0,3]之間的最小值,F(xiàn)(2,4)表示[2,17]之間的最小值。 然后處理DP的初始化:不難看出F[i,0]就等于A[i]。 最后是DP的狀態(tài)轉(zhuǎn)移方程:將F[i,j]平均分成兩段。[i,i+2^(j-1)-1]區(qū)間為一段,[i+2^(j-1),i+2^j-1]區(qū)間為一段。例如,當(dāng)i=1,j=3時,分成[1,4]和[5,8]兩段。所以狀態(tài)轉(zhuǎn)移方程:F[i,j]=max/min(F[i,j-1],F[i+2^(j-1),j-1])。 代碼如下:

void RMQ(int num) { for(int j=1;j<20;++j) for(int i=1;i<=num;++i) if(i+j*j-1<=num) { maxF[i][j]=max(maxF[i][j-1],maxF[i+1<<(j-1)][j-1]); minF[i][j]=min(minF[i][j-1],minF[i+1<<(j-1)][j-1]); } }

注意循環(huán)的順序,會發(fā)現(xiàn)j在外層,i在里層。這是由于動態(tài)轉(zhuǎn)移方程的意義所限制,請讀者自行探索…… ②查詢 假如要查詢[m,n]的最大/小值,那么先求出一個最大的k。使k滿足2^k<=(n-m+1)。于是我們可以將[m,n]分成兩個(部分重疊的)長度為2^k的區(qū)間:[m,m+2^k-1],[n-2^k+1,n];F[m,k]為F[m,m+2^k-1]的最大/小值,F(xiàn)[n-2^k+1,k]是[n-2^k+1,n]的最大/小值。狀態(tài)轉(zhuǎn)移方程:RMQ(i,j)=max/min(F[m,k],F[n-2^k+1,k]);


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产 视频 一区二区 | 国产精品免费一区二区 | 免看黄大片aa | 国产视频导航 | 亚洲国产网址 | 国产精品av久久久久久久久久 | 娇妻被各种姿势c到高潮小说 | 爱操av | 国产午夜电影在线观看 | 女教师~淫辱の动漫在线 | 成人精品aaaa网站 | 成人国产精品色哟哟 | 日韩av官网 | av免费在线不卡 | 性盈盈盈影院 | 日本网站一区二区三区 | 久久综合一区二区 | 青草视频在线观看视频 | 黄色一级片免费在线观看 | 国产一级桃视频播放 | 久久久久久久久浪潮精品 | 国内精品视频饥渴少妇在线播放 | 久久久久免费精品 | 国产午夜精品久久久 | 久色porn | 久国产精品视频 | 免费在线看a | 久久亚洲一区二区三区成人国产 | 久久99精品国产 | 亚洲午夜精品视频 | 国产自在自线午夜精品视频在 | 精品日韩欧美 | 欧美日本不卡 | 欧美性生活久久 | 国产免费一区二区三区最新不卡 | 久久露脸国语精品国产91 | 久久爽精品区穿丝袜 | 国产伦久视频免费观看视频 | 亚洲小视频在线观看,com | 久久成人精品视频 | 91精品国产一区二区在线观看 |