日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RMQ LCA

發布時間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RMQ LCA 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一節?RMQ、LCA概述

? ? ? LCA:Lowest?Common?Ancestor,譯為最近公共祖先。其解釋就是說:在有根樹中,找出樹中任意兩個節點最近的公共祖先,或者說找到任意兩個節點離樹根最遠的公共祖先。

? ? ? ?RMQ:Range?Minimum?Query,譯為區間最小值查詢。其解釋就是說:對于含有N個元素的數列A,在數列中找到兩個指定索引之間的最小值及最小值的位置。

第二節?RMQ Algorithm

? ?首先我們來看RQM算法,我將會根據預處理和查詢的速度介紹幾種解決該問題的方法。
? 設有數組A[N],其表示如下:

?要求求得區間(2,7)的最小元素,如下圖所示:

解法一:Sparse?Table(ST)?algorithm
? ? ?ST算法是一種比較高效的在線處理RMQ問題的算法,所謂在線算法,是指每輸入一個查詢就會馬上處理這個查詢。ST算法首先會對序列做預處理,完成之后就可以對查詢做回答了。
? ? 分析:
? ? ? ? ? ? 預處理:O(N * LogN)。
? ? ? ? ? ? 查詢:O(1),這樣的查詢正是我們想要的。
? 算法流程:
預處理:首先用維護一個數組M[N][LogN],M[i][j]的值是從原序列A的i位置開始,連續2j?個元素的最小值的下標,如下所示:

? ? ? ? ? ?

?那么,我們如何計算M[i][j]呢?
? ??我們采用DP的思想將區間分成兩部分,即M[i][j?-?1]和M[i][2^(j?-?1)]?,F在我們只需比較這兩個子區間就可以得到M[i][j]了。比較規則如下:

? ? ? ? ? ? ? ? ? ? ?

?于是乎,就可按照此寫出代碼:

void Proprocessing(int M[N][logN], int *A, int N){int i, j;for(j = 1; (1 << j) < N; j++){for(i = 0; (i + (1 << j) - 1) < N; i++){if(A[ M[i][j - 1] ] < A[ M[i + (1 << (j - 1))][i - 1]]){M[i][j] = M[i][j - 1];}else{M[i][j] = A[ M[i + (1 << (j - 1))][i - 1]];}}} }

?????
https://blog.csdn.net/fengchaokobe/article/details/8104784#
??? ? ?https://blog.csdn.net/blaze003003/article/details/81084954

總結

以上是生活随笔為你收集整理的RMQ LCA的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。