青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/liang5630/article/details/7917702

1. 概述

RMQ(Range Minimum/Maximum Query),即區間最值查詢,是指這樣一個問題:對于長度為n的數列A,回答若干詢問RMQ(A,i,j)(i,j<=n),返回數列A中下標在i,j之間的最小/大值。這兩個問題是在實際應用中經常遇到的問題,下面介紹一下解決這兩種問題的比較高效的算法。當然,該問題也可以用線段樹(也叫區間樹)解決,算法復雜度為:O(N)~O(logN),這里我們暫不介紹。


2.RMQ算法

對于該問題,最容易想到的解決方案是遍歷,復雜度是O(n)。但當數據量非常大且查詢很頻繁時,該算法無法在有效的時間內查詢出正解。

本節介紹了一種比較高效的在線算法(ST算法)解決這個問題。所謂在線算法,是指用戶每輸入一個查詢便馬上處理一個查詢。該算法一般用較長的時間做預處理,待信息充足以后便可以用較少的時間回答每個查詢。ST(Sparse Table)算法是一個非常有名的在線處理RMQ問題的算法,它可以在O(nlogn)時間內進行預處理,然后在O(1)時間內回答每個查詢。


(一)首先是預處理,用動態規劃(DP)解決。

設A[i]是要求區間最值的數列,F[i, j]表示從第i個數起連續2^j個數中的最大值。(DP的狀態)

例如:

A數列為:3 2 4 5 6 8 1 2 9 7

F[1,0]表示第1個數起,長度為2^0=1的最大值,其實就是3這個數。同理 F[1,1] = max(3,2) = 3, F[1,2]=max(3,2,4,5) = 5,F[1,3] = max(3,2,4,5,6,8,1,2) = 8;

并且我們可以容易的看出F[i,0]就等于A[i]。(DP的初始值)

這樣,DP的狀態、初值都已經有了,剩下的就是狀態轉移方程。

我們把F[i,j]平均分成兩段(因為f[i,j]一定是偶數個數字),從 i 到i + 2 ^ (j - 1) - 1為一段,i + 2 ^ (j - 1)到i + 2 ^ j - 1為一段(長度都為2 ^ (j - 1))。用上例說明,當i=1,j=3時就是3,2,4,5 和 6,8,1,2這兩段。F[i,j]就是這兩段各自最大值中的最大值。于是我們得到了狀態轉移方程F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1])。

代碼如下:

 

  1. void RMQ(int num) //預處理->O(nlogn)  
  2. {  
  3.     for(int j = 1; j < 20; ++j)  
  4.         for(int i = 1; i <= num; ++i)  
  5.             if(i + (1 << j) - 1 <= num)  
  6.             {  
  7.                 maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);  
  8.                 minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);  
  9.             }  
  10. }  


這里我們需要注意的是循環的順序,我們發現外層是j,內層所i,這是為什么呢?可以是i在外,j在內嗎?

 


答案是不可以。因為我們需要理解這個狀態轉移方程的意義。

狀態轉移方程的含義是:先更新所有長度為F[i,0]即1個元素,然后通過2個1個元素的最值,獲得所有長度為F[i,1]即2個元素的最值,然后再通過2個2個元素的最值,獲得所有長度為F[i,2]即4個元素的最值,以此類推更新所有長度的最值。

而如果是i在外,j在內的話,我們更新的順序就是F[1,0],F[1,1],F[1,2],F[1,3],表示更新從1開始1個元素,2個元素,4個元素,8個元素(A[0],A[1],....A[7])的最值,這里F[1,3] = max(max(A[0],A[1],A[2],A[3]),max(A[4],A[5],A[6],A[7]))的值,但是我們根本沒有計算max(A[0],A[1],A[2],A[3])和max(A[4],A[5],A[6],A[7]),所以這樣的方法肯定是錯誤的。


為了避免這樣的錯誤,一定要好好理解這個狀態轉移方程所代表的含義。



(二)然后是查詢。

假如我們需要查詢的區間為(i,j),那么我們需要找到覆蓋這個閉區間(左邊界取i,右邊界取j)的最小冪(可以重復,比如查詢5,6,7,8,9,我們可以查詢5678和6789)。

因為這個區間的長度為j - i + 1,所以我們可以取k=log2( j - i + 1),則有:RMQ(A, i, j)=max{F[i , k], F[ j - 2 ^ k + 1, k]}。

舉例說明,要求區間[2,8]的最大值,k = log2(8 - 2 + 1)= 2,即求max(F[2, 2],F[8 - 2 ^ 2 + 1, 2]) = max(F[2, 2],F[5, 2]);


在這里我們也需要注意一個地方,就是<<運算符和+-運算符的優先級。

比如這個表達式:5 - 1 << 2是多少?


答案是:4 * 2 * 2 = 16。所以我們要寫成5 - (1 << 2)才是5-1 * 2 * 2 = 1。

posted on 2012-12-17 10:45 jackdong 閱讀(571) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構與算法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国产99| 在线视频精品| 欧美成人午夜激情在线| 亚洲自啪免费| 国产欧美一区二区三区久久| aa国产精品| 亚洲三级免费观看| 毛片精品免费在线观看| 亚洲国产黄色| 亚洲电影网站| 欧美精品午夜| 亚洲免费婷婷| 久久av资源网| 亚洲日本中文| 亚洲一本视频| 欧美日本簧片| 久久岛国电影| 欧美日本二区| 久久综合给合| 欧美精品福利视频| 久久精品免费观看| 欧美成人中文字幕在线| 亚洲少妇在线| 美国成人毛片| 欧美一区二区三区日韩视频| 麻豆精品视频| 久久精品在线观看| 久久国产精品久久久| 一区二区三区毛片| 亚洲黄色影片| 国产主播一区二区| 一区二区三欧美| 日韩午夜高潮| 欧美国产综合视频| 亚洲精品日本| 亚洲午夜小视频| 亚洲六月丁香色婷婷综合久久| 亚洲综合大片69999| 日韩亚洲不卡在线| 欧美成人免费在线观看| 另类天堂av| 在线精品亚洲| 麻豆久久久9性大片| 国产色综合网| 亚洲免费影视第一页| 亚洲欧美日韩区| 国产精品久久9| 午夜精品视频网站| 噜噜噜躁狠狠躁狠狠精品视频| 国产日本欧美一区二区三区在线| 日韩午夜在线视频| 一本色道久久综合亚洲91| 欧美日韩激情小视频| 99精品欧美一区二区三区综合在线| 99国产精品私拍| 国产精品永久免费在线| 久久久久免费| 亚洲麻豆av| 裸体丰满少妇做受久久99精品| 影音先锋一区| 国产精品久久久亚洲一区| 久久久精品欧美丰满| 亚洲精品午夜精品| 久久综合电影| 性做久久久久久免费观看欧美| 国产一区二区三区免费观看| 欧美国产亚洲精品久久久8v| 亚洲宅男天堂在线观看无病毒| 牛牛精品成人免费视频| 亚洲一区二区三区在线| 亚洲国产成人精品久久| 国产精品理论片在线观看| 欧美夜福利tv在线| 亚洲精品中文字幕女同| 国产精品腿扒开做爽爽爽挤奶网站| 久久一区二区精品| 欧美在线亚洲一区| 午夜亚洲视频| 欧美亚洲在线观看| 亚洲欧美日本日韩| 亚洲视频图片小说| 亚洲线精品一区二区三区八戒| 亚洲破处大片| 最新国产の精品合集bt伙计| 亚洲成人中文| av成人免费观看| 99xxxx成人网| 亚洲永久免费| 久久高清一区| 亚洲福利一区| 亚洲精品午夜精品| 中文欧美日韩| 久久久青草青青国产亚洲免观| 久久精品视频在线| 欧美黑人在线观看| 国产精品高潮在线| 国产精品一区久久久久| 亚洲电影免费观看高清| 在线观看视频一区二区| 亚洲精品永久免费精品| 亚洲欧美激情视频| 免费观看成人鲁鲁鲁鲁鲁视频| 免费观看一级特黄欧美大片| 亚洲丰满在线| 久久精品人人| 国产精品老牛| 在线亚洲精品| 欧美国产日韩一区二区三区| 亚洲一区二区三区在线观看视频 | 欧美日韩1080p| 亚洲成人直播| 欧美日韩一区二区三区免费 | 欧美另类高清视频在线| 欧美日韩亚洲一区二| 激情欧美日韩一区| 亚洲免费视频一区二区| 亚洲人成在线免费观看| 欧美在线影院在线视频| 国产精品久久一区主播| 一本久久a久久免费精品不卡 | 亚洲影院污污.| 亚洲第一黄色| 免费观看在线综合| 在线成人免费视频| 欧美高清免费| 免播放器亚洲| 亚洲看片免费| 亚洲激情在线播放| 老色鬼精品视频在线观看播放| 国产麻豆精品theporn| 午夜久久电影网| 亚洲女人av| 激情文学一区| 亚洲成色最大综合在线| 牛夜精品久久久久久久99黑人| 黄色成人精品网站| 欧美高清视频一区二区| 暖暖成人免费视频| 一区二区三区精品视频| 亚洲午夜国产一区99re久久| 国产亚洲人成a一在线v站| 久久人人超碰| 午夜欧美电影在线观看| 在线观看91精品国产麻豆| 亚洲精品一级| 国产午夜精品一区二区三区欧美| 久久综合给合| 欧美天堂在线观看| 欧美wwwwww| 国产精品嫩草99av在线| 蜜臀91精品一区二区三区| 欧美日韩一区二区免费在线观看| 国产精品久久久一区二区三区| 久久精品官网| 国产精品私房写真福利视频| 欧美高清在线观看| 国产老肥熟一区二区三区| 亚洲激情女人| 伊人成人在线视频| 亚洲一区二区在线视频| 一区二区三区av| 欧美日本久久| 亚洲电影免费观看高清完整版在线| 欧美三区美女| 99人久久精品视频最新地址| 国产尤物精品| 欧美在线免费播放| 欧美一区二区三区视频在线| 亚洲欧美国产77777| 一区二区三区精品国产| 欧美性猛交xxxx乱大交蜜桃| 欧美激情乱人伦| 亚洲黄色成人久久久| 欧美一区二区三区四区在线观看地址| 亚洲自拍都市欧美小说| 国产精品海角社区在线观看| 正在播放亚洲一区| 欧美一区网站| 亚洲大片精品永久免费| 欧美国产日韩xxxxx| 99国产精品久久久久久久| 亚洲香蕉在线观看| 国产在线一区二区三区四区 | 久久综合亚洲社区| 亚洲国产欧美在线人成| 一本色道久久综合精品竹菊| 国产精品爽爽ⅴa在线观看| 欧美一区二区在线看| 欧美电影美腿模特1979在线看| 日韩视频一区二区| 国产一区二区三区奇米久涩| 免费观看久久久4p| 亚洲欧美综合另类中字| 欧美激情亚洲一区| 久久本道综合色狠狠五月| 日韩视频精品| 亚洲毛片在线观看| 黑人巨大精品欧美一区二区小视频| 欧美激情一区二区三区蜜桃视频| 亚洲欧美日韩综合|