最近在看mysql技術內幕:sql程式設計時,發現裡面提到了乙個關於連續區間的經典問題,首先生成測試資料,目的是想查詢出rank表中,所有id的連續區間
書中提供的方法很巧妙,首先利用mysql中的變數計算出行號,由於行號是連續的,所以連續的數值與行號的差值就是乙個常量,當出現數值不連續時,差值就會變大,利用這點,我們可以根據差值分組計算連續區間,計算的sql如下
同時書中也留下了乙個問題,如何計算不連續區間,本人想到乙個辦法,同樣也是利用mysql中的變數,但是需要3個變數,不連續區間開始值,不連續區間結束值,上一列的id值,用於與當前列比較計算是否是不連續區間,詳細sql如下
select start_value, end_value
from (select id,
case
when @prev <> id - 1 then
@start_value := @prev + 1
else
@start_value := null
end as start_value,
case
when @prev <> id - 1 then
@end_value := id - 1
else
@end_value := null
end as end_value,
@prev := id
from rank,
(select @prev := null, @start_value := 0, @end_value := 0) as a) as b
where start_value is not null
order by cast(start_value as unsigned)
首先判斷上一列的id是否等於當前列的id值減一,如果不等那麼說明上一列是上乙個連續區間的結束,當前列是新連續區間的開始,所以不連續區間的開始值為上一列id值加1,結束之為當前列id值減一,如果上一列的id時候等於當前列的id值減一,那麼說明是連續區間,開始值和結束值都不賦值,之後再通過乙個子查詢限定開始值不為空就可以查詢出不連續區間了
連續區間和模板
水果店裡有 nn個水果排成一列。店長要求顧客只能買一段連續的水果。小陽對每個水果都有乙個喜愛程度 aiai,最終的滿意度為他買到的水果的喜歡程度之和。如果和為正 不管是正多少,只要大於 0 即可 他就滿意了。小陽想知道在他滿意的條件下最多能買多少個水果。你能幫幫他嗎?第一行輸入乙個正整數 n,表示水...
dp m段連續區間和
問題描述 最大m子段和問題 給定由 n個整數 可能為負整數 組成的序列a1,a2,a3,an,以及乙個正整數 m,要求確定序列 a1,a2,a3,an的 m個不相交子段,使這m個子段的總和達到最大,求出最大和。用dp i j 來表示在前j個數中,以a j 結尾並分為i段的最大和。dp i j max...
連續區間最大和問題
連續區間最大和問題指的是在給定的一串串行中找出和最大的連續區間。解決這類問題有下面五種方法 1.o n 3 暴力列舉 這種方法就不需要多說了,最簡單的方法,但複雜度很高,資料量大時不可取。2.o n 2 預處理 列舉 這種方法無非是在上一種方法的基礎上做些優化。sum i 表示從1 i 這段區間的和...