本發(fā)明涉及一種基于摘要的時間序列數(shù)據(jù)索引構建方法,屬于大數(shù)據(jù)以及數(shù)據(jù)庫技術領域。
背景技術:
時間序列數(shù)據(jù)表示由傳感器網(wǎng)絡、金融市場、醫(yī)療保健、監(jiān)控和其他諸多領域中產(chǎn)生的流式數(shù)據(jù)。隨著高頻流式數(shù)據(jù)源的激增,迫切需要針對大量數(shù)據(jù)的交互式分析和實時可視化技術。例如趨勢分析、模式識別、相關性分析、交互式數(shù)據(jù)發(fā)現(xiàn)等。
一個時間序列數(shù)據(jù)可視化的典型例子是顯示一個傳感器在特定時間范圍的值。現(xiàn)在的可視化工具處理該問題,一般分為兩種方法:第一種首先從數(shù)據(jù)庫中查詢所有滿足條件的值,交由可視化模塊渲染展示。這種方式需要反饋大量數(shù)據(jù)從而導致數(shù)據(jù)傳輸過程中消耗很大的帶寬進而造成很高的延遲。第二種是首先在對查詢的結果進行數(shù)據(jù)壓縮,然后返回給可視化模塊,這樣可以極大的減少數(shù)據(jù)傳輸過程中的帶寬消耗,但是在壓縮數(shù)據(jù)時,仍然需要掃描所有符合查詢條件的數(shù)據(jù),這個過程時間代價仍然很高。為了降低掃描壓縮數(shù)據(jù)的時間,可以利用數(shù)據(jù)摘要算法來壓縮時間序列數(shù)據(jù)的存儲量。但兩種方法都具有查詢時延長、數(shù)據(jù)傳輸量大的缺陷。
技術實現(xiàn)要素:
本發(fā)明的目的旨在解決目前常用可視化方法在處理海量時間序列數(shù)據(jù)時,遇到的查詢時延長、數(shù)據(jù)傳輸量大的缺陷,提出了一種基于摘要的時間序列數(shù)據(jù)索引構建方法。
本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法,核心內(nèi)容是:將時間序列數(shù)據(jù)分成小的時間片段,然后用線性擬合的方法壓縮表示每個時間片段以形成該片段的摘要,對于壓縮后的摘要數(shù)據(jù)構建樹狀索引結構;當需要可視化查詢時,基于構建的索引結構采用增量式可視化技術,確??梢暬椒蚀_高效,而且索引結構建立一次,可供多次查詢使用。
一種基于摘要的時間序列數(shù)據(jù)索引構建方法,通過以下步驟實現(xiàn):
步驟1:基于時間序列數(shù)據(jù),初始化系統(tǒng)參數(shù);
其中,系統(tǒng)參數(shù)包括時間序列標號、分段最大誤差以及樹狀索引結構中間節(jié)點的子節(jié)點個數(shù)基準、時間序列片段數(shù)組以及保存索引結構時初始化內(nèi)存緩沖區(qū)的大小;
其中,時間序列標號,記為i,代表時間序列數(shù)據(jù)T中第i個時刻,此第i個時刻的值記為vi,第i時刻記為ti,下標i是大于等于0的整數(shù);將原始時間序列分段時最大的誤差,即分段最大誤差記為ε;樹狀索引結構中間節(jié)點的子節(jié)點個數(shù)基準記為B,B是一個大于0的整數(shù);時間序列片段數(shù)組,記為U,初始化為空;保存索引結構時初始化內(nèi)存緩沖區(qū)的大小,記為X,單位是兆字節(jié);
步驟2:對時間序列數(shù)據(jù)進行分段,輸出時間序列片段并保存到時間序列片段數(shù)組中;
對時間序列數(shù)據(jù)進行分段可以按照等間隔分段,還可以按照不等間隔分段;若為不等間隔分段,可使用《文獻1》中提出的旋轉門算法進行分段;
《文獻1》:Bristol E H.Swinging door trending:adaptive trend recording[C]//ISA National Conference Proceedings.1990,45;其中,文獻1中所述的算法輸入對應本專利中的時間序列數(shù)據(jù)T,文獻1中所述算法里的誤差對應本發(fā)明中分段最大誤差ε;
使用旋轉門算法時,將時間序列數(shù)據(jù)T作為旋轉門算法的輸入,將分段最大誤差ε作為旋轉門算法中的最大誤差;旋轉門算法輸出的時間序列片段保存在時間序列片段數(shù)組U中;
采用旋轉門算法進行不等間隔分段,分段結束后,時間序列數(shù)據(jù)變成了不等間隔的時間片段;
步驟3:采用擬合函數(shù)對步驟2輸出的每一段時間序列片段進行擬合,得到每一段時間序列片段的數(shù)據(jù)摘要信息;
將步驟2輸出結果,時間序列片段數(shù)組U中的每一項采用線性回歸進行擬 合,并記錄每一項的數(shù)據(jù)摘要信息下標j對應時間序列片段在U中的順序,j是大于0小于|U|的整數(shù),|U|代表數(shù)組U的長度;
其中,ts和te分別代表時間序列片段的開始時刻和結束時刻,vs和ve分別表示ts時刻和te時刻的值,e代表用線性擬合后的直線代替時間序列數(shù)據(jù)產(chǎn)生的誤差,即擬合誤差,M代表每一時刻的值累加后的和,P代表每一時刻和該時刻的值相乘后累加的和;
vs根據(jù)公式(1)計算,ve根據(jù)公式(2)計算,e根據(jù)公式(3)計算,M根據(jù)公式(4)計算,P根據(jù)公式(5)計算;
vs=f(ts) (1)
其中,f(ts)代表ts時刻函數(shù)f(t)的值,f(t)代表擬合后直線的函數(shù)表達式,用公式(6)表示;
ve=f(te) (2)
其中,f(te)代表te時刻函數(shù)f(t)的值;
其中,V(t)代表時間序列數(shù)據(jù)中t時刻對應的值;代表從ts到te時刻對V(t)與f(t)差值的平方求和;
其中,代表從ts到te時刻對V(t)求和;
其中,代表從ts到te時刻對V(t)與t的乘積求和;
f(t)=ηt+θ (6)
其中,η和θ分別為f(t)的擬合斜率和擬合偏置,分別用公式(7)和公式(8)計算:
其中,代表從ts到te時刻對的平方求和,
代表從ts到te時刻對和V(t)的乘積求和;
步驟4:利用步驟3得到的數(shù)據(jù)摘要信息,構建樹狀索引結構;
具體為:將步驟3中每一項數(shù)據(jù)摘要信息,當作樹中最底層節(jié)點,自下而上合并產(chǎn)生上層節(jié)點,構建樹狀索引結構;其中,自下而上合并產(chǎn)生上層節(jié)點,即由下一層節(jié)點合并產(chǎn)生上一層節(jié)點的過程如下:
步驟4.1:順序讀取一個下一層節(jié)點到數(shù)據(jù)緩沖區(qū)中,數(shù)據(jù)緩沖區(qū)用來暫時保存讀到的節(jié)點數(shù)據(jù),判斷節(jié)點數(shù)據(jù)的數(shù)量,并進行相應操作:
4.1A:當數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量達到2*B時,跳至步驟4.2;
4.1B:當數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量不足2*B且讀取的節(jié)點不是最后一個節(jié)點時,跳回步驟4.1;否則,若數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量不足2*B且讀取的節(jié)點是最后一個節(jié)點,跳轉至步驟4.5;
步驟4.2:合并相鄰兩個節(jié)點為一個節(jié)點,將合并產(chǎn)生節(jié)點的擬合誤差作為合并代價,計算數(shù)據(jù)緩沖區(qū)中合并任意兩個相鄰節(jié)點的合并代價,采用自下而上的方式,選擇合并代價最小的兩個節(jié)點合并,產(chǎn)生一個合并節(jié)點;
其中,將“合并相鄰兩個節(jié)點為一個節(jié)點”中相鄰兩個節(jié)點的一個節(jié)點記為N1,另一個節(jié)點記為N2,產(chǎn)生的合并節(jié)點記為Na,按照步驟3中的描述
合并過程是利用N1和N2的數(shù)據(jù)摘要信息計算出合并節(jié)點Na的數(shù)據(jù)摘要信息;
在公式(9)-(20)中,用下標k用來區(qū)分不同的節(jié)點,即k可以是1,2,a;即用下標k用來區(qū)分不同的節(jié)點,即k為1時對應節(jié)點N1,k為2時對應節(jié)點N2,k 為a時對應節(jié)點Na;如和分別表示節(jié)點Nk對應的時間序列片段的開始時刻和結束時刻,和分別表示節(jié)點Nk對應的時間序列片段開始時刻的值和結束時刻的值,根據(jù)公式(9)計算,根據(jù)公式(10)計算;
其中,和分別代表時刻和時刻fa(t)的值,并分別記為和和分別為節(jié)點Na數(shù)據(jù)摘要信息中的開始時刻和結束時刻,且節(jié)點Na的開始時刻為節(jié)點N1的開始時刻節(jié)點Na的結束時刻為節(jié)點N2的結束時刻fa(t)表示對和之間的時間序列片段采用線性回歸擬合后直線的函數(shù)表達式,用公式(11)表示,
其中,ηa是fa(t)的擬合斜率,Ma為節(jié)點N1中M1和節(jié)點N2中M2相加的和,表示節(jié)點N1對應的時間序列片段的開始時刻,表示節(jié)點N2對應的時間序列片段的結束時刻;
ea為節(jié)點Na的擬合誤差,同時也看作為N1和N2的合并代價,擬合誤差越小,合并代價越小,反之,擬合誤差越大,合并代價越大,ea根據(jù)公式(12)計算;
其中,e1表示節(jié)點N1的擬合誤差,e2表示節(jié)點N2的擬合誤差;f1(t)表示對節(jié)點N1對應的時間序列片段,采用線性回歸擬合后直線的函數(shù)表達式,f2(t)表示節(jié)點N2對應的時間序列片段,采用線性回歸擬合后直線的函數(shù)表達式;表示節(jié)點N2對應的時間序列片段的開始時刻,表示節(jié)點N1對應的時間序列片段的結束時刻;θ1、θ2和θa分別是f1(t)、f2(t)和fa(t)的擬合偏置;η1和η2分別是f1(t)和f2(t)的擬合斜率;M1和M2分別表示節(jié)點N1和N2對應的時間序列片段每一時刻的值累加后的和,且Ma為節(jié)點N1中M1和節(jié)點N2中M2相加的和;P1和P2分別表示 節(jié)點N1和N2對應時間序列片段每一時刻和對應的值相乘后累加的和;
表示從到時刻對f1(t)和fa(t)差值的平方求和;
表示從到時刻對f2(t)和fa(t)差值的平方求和;
表示從到時刻對f1(t)和(f1(t)-fa(t))的乘積求和;
表示從到時刻對f2(t)和(f2(t)-fa(t))的乘積求和;節(jié)點N1中P1和節(jié)點N2中P2相加的和為Pa;
f1(t)和f2(t)分別用公式(13)和公式(14)表示:
其中,和分別表示節(jié)點N1和N2對應的時間序列片段開始時刻的值;
fa(t)、f1(t)和f2(t)的擬合斜率ηa、η1和η1分別用公式(15)、(16)和(17)表示:
其中,n1表示相鄰的第一個節(jié)點N1可以覆蓋的時間范圍,n2表示相鄰的第二個節(jié)點N2可以覆蓋的時間范圍,na表示合并節(jié)點Na可以覆蓋的時間范圍;和 分別表示節(jié)點N1和N2對應的時間序列片段結束時刻的值;
n1根據(jù)公式(18)計算,n2根據(jù)公式(19)計算,na根據(jù)公式(20)計算;
步驟4.3:將步驟4.2中選擇出來的合并代價最小的兩個節(jié)點用合并節(jié)點替換,判斷節(jié)點數(shù)量并進行相應的操作:
4.3A:當數(shù)據(jù)緩沖區(qū)中的節(jié)點數(shù)量大于2時,跳轉回步驟4.2;
4.3B:當數(shù)據(jù)緩沖區(qū)中只剩下2個節(jié)點時,將合并產(chǎn)生數(shù)據(jù)緩沖區(qū)中第1個節(jié)點的下一層節(jié)點數(shù)量記為C1,其中下標1代表數(shù)據(jù)緩沖區(qū)中第一個節(jié)點;
步驟4.4:保存數(shù)據(jù)緩沖區(qū)中的第一個節(jié)點為上一層節(jié)點;然后,清空數(shù)據(jù)緩沖區(qū);再將合并產(chǎn)生第2個節(jié)點的2*B-C1個下一層節(jié)點讀入數(shù)據(jù)緩沖區(qū),然后跳轉回步驟4.1;
步驟4.5:將數(shù)據(jù)緩沖區(qū)中小于2*B個的節(jié)點合并成一個上一層節(jié)點;
步驟4.6:在上一層節(jié)點中添加指針和子節(jié)點的索引,指向?qū)淖庸?jié)點,同時在每一層節(jié)點上都添加右指針,指向右邊相鄰的節(jié)點;
其中,上一層節(jié)點為父節(jié)點,合并產(chǎn)生上一層節(jié)點的下一層節(jié)點為對應父節(jié)點的子節(jié)點;上一層節(jié)點和下一層節(jié)點之間用指針來建立對應的父子關系;
步驟5:保存步驟4生成的樹狀索引結構;
其中,生成的樹狀索引可以直接保存在硬盤中,也可以保存在數(shù)據(jù)庫中作為數(shù)據(jù)庫的索引結構;將樹狀索引結構直接保存在硬盤中具體為:在內(nèi)存中申請一個大小為X兆字節(jié)的緩沖區(qū),保存步驟4中生成的樹狀索引結構;當緩沖區(qū)滿時或者程序結束時,將緩沖區(qū)內(nèi)的樹狀索引結構保存到文件中,在保存時對于整形實數(shù)采用變長存儲,達到數(shù)據(jù)壓縮的目的;
至此,經(jīng)過步驟1到步驟5,完成了一種基于摘要的時間序列數(shù)據(jù)索引構建方法。
一種自適應的時間序列數(shù)據(jù)查詢方法,通過以下步驟實現(xiàn):
步驟A:當需要查詢時,將步驟5保存的樹狀索引結構的上半部分讀入內(nèi)存,構造查詢語句,初始化查詢結果數(shù)組和數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲以及查詢時深入查找一層所需要的時間;
其中,保存的樹狀索引結構的上半部分,具體為樹狀索引結構中除了最底層子節(jié)點外的其他部分;查詢語句為:
q=select*from dateset where time>Qs and time<Qe and error<Qerror,
其中,Qs代表查詢范圍的開始時刻,Qe代表查詢范圍的結束時刻,Qerror代表 查詢結果允許的最大誤差,即查詢誤差,表示查詢在Qs和Qe時刻之間的數(shù)據(jù),并且誤差要小于等于Qerror;初始化查詢結果數(shù)組R為空;把數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲,記為L;查詢時深入查找一層所需要的時間,記為c;
步驟B:基于步驟A的查詢語句查找包含查詢范圍的開始時刻的節(jié)點,同時保證查詢時延小于用戶要求的最大時延,返回包含查詢范圍的開始時刻的節(jié)點;
具體步驟如下:
步驟B.1:計算查詢時可以查找的最大深度;
其中,查詢時可以查找的最大深度記為h,h=L/c;
步驟B.2:讀取根節(jié)點,判斷根節(jié)點是否包含查詢范圍的開始時刻,并根據(jù)判斷結果返回節(jié)點,進行相應操作:
B.21:若根節(jié)點包含查詢范圍的開始時刻,返回當前判斷的根節(jié)點,跳至步驟B.3;
B.22:若根節(jié)點不包含查詢范圍的開始時刻,則讀取根節(jié)點的右指針指向的節(jié)點作為根節(jié)點,跳轉到步驟B.2;
步驟B.3:讀取步驟B.2返回節(jié)點,記為當前節(jié)點,并判斷當前節(jié)點的擬合誤差是否滿足查詢誤差要求并進行相應操作,具體為:
B.3.1:如果當前節(jié)點的擬合誤差小于等于查詢誤差Qerror,返回當前節(jié)點,然后繼續(xù)步驟C;
B.3.2:如果當前節(jié)點的擬合誤差大于查詢誤差Qerror,繼續(xù)步驟B.4;
其中,查詢誤差要求是指是節(jié)點的擬合誤差要小于等于查詢誤差Qerror;
步驟B.4:計算目前的查詢深度;
查詢深度根據(jù)步驟B.3中的節(jié)點在樹狀索引結構上的位置計算,在最上層根節(jié)點時,代表查詢深度為1,自上而下每深入一層,查詢深度加1;
步驟B.5:根據(jù)步驟B.4計算的目前查詢深度判斷是否可以繼續(xù)深入查詢,具體為:
B.5.1:如果目前的查詢深度小于h,則根據(jù)步驟B.2中節(jié)點的子節(jié)點索 引,讀取包含查詢范圍開始時刻的子節(jié)點作為根節(jié)點,跳至步驟B.2;
B.5.2:如果目前的查詢深度大于等于h,則返回步驟B.2中的節(jié)點,然后跳至步驟C;
步驟C:根據(jù)包含查詢范圍的開始時刻的節(jié)點,將滿足查詢范圍要求的所有節(jié)點加入查詢結果數(shù)組中,并輸出查詢結果數(shù)組,具體為:
步驟C.1:讀取包含查詢范圍的開始時刻的節(jié)點,并更新當前節(jié)點為此節(jié)點;
步驟C.2:判斷當前節(jié)點是否滿足查詢范圍,把滿足查詢范圍要求的節(jié)點加入查詢結果數(shù)組中;
C.2.1:如果當前節(jié)點的結束時間時刻,小于查詢范圍的結束時刻Qe,將當前節(jié)點加入查詢結果數(shù)組R中,并讀取當前節(jié)點的右指針指向的節(jié)點作為當前節(jié)點,然后繼續(xù)步驟C.2;
C.2.2:如果當前節(jié)點的結束時刻大于等于查詢范圍的結束時刻,將當前節(jié)點加入查詢結果數(shù)組R中,結束查詢,繼續(xù)執(zhí)行步驟D;
其中,滿足查詢范圍要求是指節(jié)點開始時刻和結束時刻之間覆蓋的時間范圍和查詢范圍的開始時刻和查詢范圍的結束時刻之間覆蓋的時間范圍存在交集;
步驟D:將查詢結果數(shù)組中的數(shù)據(jù)展示出來,具體為:
步驟D.1:判斷查詢結果數(shù)組R是否有更新,并根據(jù)判斷結果決定是否進行可視化展現(xiàn):
D.1.1:若查詢結果數(shù)組R上存在更新,跳至步驟D.2;
D.1.2:若查詢結果數(shù)組R上不存在更新,跳至步驟E;
步驟D.2:判斷查詢結果數(shù)組R中第一個節(jié)點R[0]的開始時刻與查詢范圍的開始時刻是否一致,更新不一致情況下查詢結果數(shù)組R中第一個節(jié)點的開始時刻和開始時刻的值;
D.2.1:如果判斷結果一致,則跳至步驟D.3;
D.2.2:若判斷結果不一致,即R[0]節(jié)點開始時刻小于查詢范圍的開始時刻Qs,則以R[0]節(jié)點開始時刻和結束時刻的值為橫坐標,R[0]節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,再根據(jù)擬合后的直線求出查詢范圍開始時刻對應的值,用查詢范圍的開始時刻和計算出查詢范圍開始時刻的值替換R[0]節(jié)點的開始時刻和開始時刻的值,然后,繼續(xù)步驟D.3;
步驟D.3:判斷查詢結果數(shù)組中最后一個節(jié)點的結束時刻是否與查詢范圍的結束時刻是否一致,更新不一致情況下查詢結果數(shù)組R中最后一個節(jié)點的結束時刻和結束時刻的值;
D.3.1:如果判斷結果一致,則跳至步驟D.4;
D.3.2:如果查詢結果數(shù)組中最后一個節(jié)點的結束時刻大于查詢的結束時刻Qe,則以查詢結果數(shù)組中最后一個節(jié)點的開始時刻和結束時刻的值為橫坐標,查詢結果數(shù)組中最后一個節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,根據(jù)擬合后的直線求出查詢范圍的結束時刻對應的值,用查詢范圍的結束時刻和計算出查詢范圍結束時刻的值替換查詢結果數(shù)組中最后一個節(jié)點的結束時刻和結束時刻的值,然后繼續(xù)步驟D.4;
步驟D.4:以時間作為橫坐標,以對應的值作為縱坐標,建立直角坐標系,將查詢結果數(shù)組R中所有節(jié)點的開始時刻和結束時刻對應的點,用直線相連,可視化展現(xiàn)出來;
步驟E:依次遍歷查詢結果數(shù)組中的每一個節(jié)點,判斷查詢結果數(shù)組中是否有不滿足查詢誤差要求需要細化查詢的節(jié)點,返回不滿足查詢誤差要求的節(jié)點和細化查詢的查詢語句;
具體步驟如下:
步驟E.1:順序讀取查詢結果數(shù)組R中的一個節(jié)點,判斷讀取到的節(jié)點擬合誤差和查詢誤差的關系,返回不滿足查詢誤差要求的節(jié)點和細化查詢的查詢語句;
E.1.1:如果讀取到的節(jié)點的擬合誤差大于查詢誤差Qerror,則重新構造查詢語句q,如果此次讀取到的節(jié)點的開始時刻比查詢范圍的開始時刻Qs小,查詢語句q的查詢范圍的開始時刻Qs不變,否則q的查詢范圍的開始時刻Qs設置為此次讀取到的節(jié)點的開始時刻;如果此次讀取到的節(jié)點的結束時刻比查詢語句q查詢范圍的結束時刻Qe大,則q的查詢范圍的結束時刻Qe不變,否則q的查詢范圍的結束時刻Qe設置為此次讀取到的節(jié)點的結束時刻;查詢誤差Qerror保持不變;然后返回此次讀取到的節(jié)點和查詢語句q,跳轉至步驟F;
E.1.2:如果讀取到的節(jié)點的擬合誤差小于等于查詢誤差Qerror,且不是最后一個節(jié)點,繼續(xù)步驟E.1;如果讀取到的節(jié)點的擬合誤差小于等于查詢誤差Qerror,且是最后一個節(jié)點,跳轉到步驟E.2;
步驟E.2:查詢結果數(shù)組中所有的節(jié)點的擬合誤差都小于等于查詢誤差Qerror,滿足查詢誤差要求,結束查詢;
步驟F:根據(jù)步驟E中返回的節(jié)點和查詢語句,進行細化查詢并更新查詢結果數(shù)組,具體為:
步驟F.1:在步驟A讀入內(nèi)存的樹狀索引結構中,找到步驟E中返回的節(jié)點并根據(jù)找到節(jié)點的子節(jié)點索引,讀取包含q中查詢范圍開始時刻的子節(jié)點;
步驟F.2:判斷讀取到的子節(jié)點的擬合誤差是否滿足查詢誤差要求,并根據(jù)判斷結果進行如下操作:
F.2.1:如果子節(jié)點的擬合誤差小于等于查詢語句q中查詢誤差Qerror,初始化一個結果緩沖區(qū),暫時保存讀取到的子節(jié)點,按照子節(jié)點的右指針連續(xù)讀取查詢語句q查找范圍內(nèi)包含的所有節(jié)點,依次放入結果緩沖區(qū)中,然后跳轉至步驟F.3;
F.2.2:如果子節(jié)點的擬合誤差大于查詢語句q中查詢誤差Qerror,將當前讀
取到的子節(jié)點當作步驟E返回的節(jié)點,跳轉至步驟F.1;
步驟F.3:將查詢結果數(shù)組R中步驟E返回的節(jié)點用結果緩沖區(qū)的節(jié)點替換,更新查詢結果數(shù)組R,然后跳轉到步驟D;
至此,經(jīng)過步驟A到步驟F,完成了一種自適應的時間序列數(shù)據(jù)查詢方法。
有益效果
本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法采用了一種樹狀索引結構來組織并存儲擬合后的時間序列數(shù)據(jù)摘要,實現(xiàn)了一種自適應的可視化方法,與現(xiàn)有索引構建及查詢的可視化方法相比,具有如下有益效果:
1.本發(fā)明所提出的方法在樹狀索引結構中保存可視化需要的特征變量,而且自根節(jié)點到葉子節(jié)點擬合誤差越來越小,可以適應按不同誤差查詢的需要;
2.本發(fā)明所提出的方法可以實現(xiàn)增量式的可視化技術,即在給定的可視化響應時間延遲下,首先利用索引結構中上層節(jié)點的數(shù)據(jù)摘要信息返回一個粗糙的可視化結果,然后層層深入逐漸細化不滿足誤差要求的部分,最終達到符合用戶查詢要求,返回查詢結果數(shù)據(jù)量小,從查詢到展現(xiàn)結果的時間延遲??;
3.本發(fā)明所提出的方法可以按照不同查詢精度返回查詢結果,從多角度展 現(xiàn)時間序列數(shù)據(jù),可以應用于統(tǒng)計分析、數(shù)據(jù)挖掘、監(jiān)控分析等針對時間序列數(shù)據(jù)分析的領域。
附圖說明
圖1為本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法的及實施例1中索引構建的流程示意圖;
圖2為本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法中利用索引進行自適應的時間序列數(shù)據(jù)查詢及實施例1中查詢可視化的流程示意圖;
圖3為本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法中對應的樹狀索引結構示意圖及實施例1中構建的索引結構;
其中,圖3中箭頭代表指針,指向?qū)?jié)點的位置,Null代表空指針,表明當前節(jié)點右邊不存在節(jié)點。
具體實施方式
下面根據(jù)附圖及實施例對本發(fā)明進行詳細說明,但本發(fā)明的具體實施形式并不局限于此。
實施例1
本實施例詳細闡述了本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法應用于股票數(shù)據(jù)時,首先采用索引構建算法構建數(shù)據(jù)索引,然后基于構建的索引結構利用一種自適應的時間序列數(shù)據(jù)查詢算法進行查詢可視化的流程。
實例中采用的時間序列數(shù)據(jù)T={9.33、9.91、10、10.43、10.48、10.32、10.68、11.11、11.16、11.26、11.43、11.63、11.89、11.67、11.54、11.34、11.22、10.79、11.07、11.1、10.69、10.98、10.92、10.92、10.92、10.08、10.56、10.58、11.27、12.46、12.49、12.51、12.6、12.53、12.15、12.72、12.81、12.8、12.51、12.65},對應的時刻從1到40。
圖1為本發(fā)明一種基于摘要的時間序列數(shù)據(jù)索引構建方法的及本實施例中索引構建的流程示意圖;從圖中可看出,索引構建包含如下步驟:
步驟一:基于時間序列數(shù)據(jù),初始化系統(tǒng)參數(shù);
具體到本實例,時間序列標號i可以是從1到40的整數(shù),由于時間序列數(shù) 據(jù)T整體方差比偏小,因此設置段最大誤差ε=0.2,樹狀索引結構中間節(jié)點的子節(jié)點個數(shù)基準B=3;時間序列片段數(shù)組U,初始化為空;保存索引結構時初始化內(nèi)存緩沖區(qū)的大小為X=100兆字節(jié);
步驟二:對時間序列數(shù)據(jù)進行分段,輸出時間序列片段并保存到時間序列片段數(shù)組中;
具體到本實例實施,不斷讀取時間序列數(shù)據(jù),根據(jù)用戶自定義的分段誤差ε=0.2,采用旋轉門算法進行分段,經(jīng)過分段后T產(chǎn)生了10個時間序列片段,旋轉門算法的輸出結果時間序列片段數(shù)組
步驟三:采用擬合函數(shù)對上一步驟輸出的每一段時間序列片段進行擬合,得到每一段時間序列片段的數(shù)據(jù)摘要信息;
具體到本實例實施,對時間序列片段數(shù)組U中的每一項,采用線性回歸的方法進行線性擬合,同時記錄每一個時間序列片段的開始時刻ts和結束時刻te以及開始時刻的值vs和結束時刻的值ve,計算擬合誤差e,每一時刻的值累加后的和M,每一時刻和該時刻的值相乘后累加的和P,形成該時間序列片段的數(shù)據(jù)摘要信息經(jīng)過步驟三,最終形成了10個時間序列片段的數(shù)據(jù)摘要信息:
{1,9.41,4,10.43,0.01,39.67,100.87}、{5,10.40,7,10.59,0.02,31.48,189.08}、
{8,11.07,14,11.83,0.01,80.15,885.16}、{15,11.58,18,10.87,0.005,44.89,739.5}、
{19,11.06,22,10.86,0.02,43.84,898.38}、{23,10.92,25,10.92,0,32.76,786.24}、
{26,10.08,29,11.16,0.02,42.49,1170.27}、{30,12.47,34,12.57,0.001,62.59,2003.13}、
{35,12.23,37,12.89,0.01,37.68,1357.14}、{38,12.72,40,12.57,0.01,37.96,1480.29}
步驟四:利用上一步驟得到的數(shù)據(jù)摘要信息,構建樹狀索引結構;
具體到本實例實施,將收到步驟三的數(shù)據(jù)摘要信息轉化為10個最底層的子 節(jié)點,同時利用10個最底層的子節(jié)點生成第二層的3個節(jié)點,第二層的3個節(jié)點合并形成1個根節(jié)點。生成樹狀索引結構如圖3,第一層節(jié)點稱為根節(jié)點,第二層稱為中間節(jié)點,最下面的子節(jié)點叫做葉子節(jié)點;根節(jié)點和中間節(jié)點具有相似結構,節(jié)點中第一層兩個數(shù)分別代表開始時刻和開始時刻的值,第二層兩個數(shù)分別代表結束時刻和結束時刻的值,第三層左邊的值表示節(jié)點的擬合誤差,右邊的值表示右邊相鄰的節(jié)點指針,Null表示空,表示當前節(jié)點的右邊沒有節(jié)點,第四層表示子節(jié)點的索引,第五層表示對應子節(jié)點的指針,方便讀取子節(jié)點;葉子節(jié)點的結構只有三層,第一層兩個值分別對應開始時刻和開始時刻的值,第二層兩個值分別對應結束時刻和結束時刻的值,第三層左邊的值表示節(jié)點的擬合誤差,右邊的值用來表示右邊相鄰的節(jié)點指針,Null表示當前節(jié)點右邊沒有節(jié)點;
步驟五:保存上一步驟生成的樹狀索引結構;;
具體到本實例實施,當樹狀索引結構在內(nèi)存中構建完成后,把它保存到硬盤中,保存時需要對整數(shù)進行壓縮,采用變長存儲的方法;
至此,從步驟一到五,完成了本實例一種基于摘要的時間序列數(shù)據(jù)索引構建方法。
當需要查詢可視化時,按照一種自適應的時間序列數(shù)據(jù)查詢方法進行可視化查詢。圖2為一種自適應的時間序列數(shù)據(jù)查詢方法的流程圖以及本實施例的查詢可視化流程圖;從圖中可看出,查詢可視化包含如下步驟:
步驟I:將步驟五保存的樹狀索引結構的上半部分讀入內(nèi)存,構造查詢語句,初始化查詢結果數(shù)組和數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲以及查詢時深入查找一層所需要的時間;;
具體到本實例實施,將樹結構的根節(jié)點和第二層中間節(jié)點讀入內(nèi)存中;同時構建查詢語句q=select*from dateset where time>1and time<29and error<0.1,其中Qs表示查詢范圍的開始時刻,Qs=1,Qe表示查詢范圍的結束時刻,Qe=29,Qerror表示查詢誤差,Qerror=0.1,并且初始化查詢結果數(shù)組R為空,把數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲設置為L=0.01ms,查詢時深入查找一層所需要的時間c=0.001ms;
步驟II:基于步驟I的查詢語句查找包含查詢范圍的開始時刻的節(jié)點,同 時保證查詢時延小于用戶要求的最大時延,返回包含查詢范圍的開始時刻的節(jié)點;
具體到本實例實施,在樹狀索引結構上查找包含查詢范圍的開始時刻的節(jié)點,并返回,滿足條件的節(jié)點是第二層第一個節(jié)點,記為下標2代表第2層,上標1代表第一個節(jié)點;將返回;
步驟III:根據(jù)包含查詢范圍的開始時刻的節(jié)點,將滿足查詢范圍要求的所有節(jié)點加入查詢結果數(shù)組中,并輸出查詢結果數(shù)組;
具體到本實例,將加入R中,賦值給R[0],然后根據(jù)的右指針,讀取第二層中間節(jié)點的第二個節(jié)點,記為下標2代表第2層,上標2代表第2個節(jié)點,將賦值給R[1];
步驟IV:將查詢結果數(shù)組中的數(shù)據(jù)展示出來;
具體到本實例實施,首先判斷判斷查詢結果數(shù)組R是否有變化,查詢結果數(shù)組R存在變化,同時查詢結果數(shù)組中第一個節(jié)點的開始時刻和最后一個節(jié)點的結束時刻和查詢范圍的開始時刻和結束時刻一致,所以把時間作為橫坐標,把對應的值作為縱坐標,建立直角坐標系,將查詢結果數(shù)組R中所有節(jié)點的開始時刻和結束時刻對應的點,用直線相連,可視化展現(xiàn)出來;
步驟V:依次遍歷查詢結果數(shù)組中的每一個節(jié)點,判斷查詢結果數(shù)組中是否有不滿足查詢誤差要求需要細化查詢的節(jié)點,返回不滿足查詢誤差要求的節(jié)點和細化查詢的查詢語句;
具體到本實例實施,查詢結果數(shù)組R中兩個節(jié)點的擬合誤差都小于查詢誤差Qerror=0.1,滿足查詢誤差要求,不需要細化查詢,至此完成了本方法;
至此,從步驟I到V,完成了基于本專利一種基于摘要的時間序列數(shù)據(jù)索引構建方法的自適應數(shù)據(jù)查詢。
實施例2
本實例按照實施例1中所述參數(shù),具體闡述了本發(fā)明步驟4中構建樹狀索引結構的算法及實施例1中的步驟四的執(zhí)行流程。
具體流程為:根據(jù)下一層節(jié)點,采用自下而上的方法,合并產(chǎn)生上一層節(jié)點,自下而上構建根樹狀索引結構。
具體到本實例實施中,由最底層節(jié)點,即葉子層節(jié)點合并產(chǎn)生中間層節(jié)點 的流程如下:
步驟4):利用步驟3)得到的數(shù)據(jù)摘要信息,構建樹狀索引結構;;
上一步驟傳來的數(shù)據(jù)為10時間序列片段的數(shù)據(jù)摘要信息,記為Nj,下標j表示對應時間序列片段的順序,是從1到10的整數(shù);
步驟4).1:順序讀取一個下一層節(jié)點到數(shù)據(jù)緩沖區(qū)中,數(shù)據(jù)緩沖區(qū)用來暫時保存讀到的節(jié)點數(shù)據(jù),判斷節(jié)點數(shù)據(jù)的數(shù)量,并進行相應操作:
4).1A:當數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量達到2*B即6個時,跳至步驟4).2;
4).1B:當數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量不足2*B即6個時,且讀取的節(jié)點不是最后一個節(jié)點時,跳回步驟4).1;否則,若數(shù)據(jù)緩沖區(qū)節(jié)點數(shù)量不足2*B即6個時,且讀取的節(jié)點是最后一個節(jié)點,跳轉至步驟4).5;
具體到本實例實施,數(shù)據(jù)緩沖區(qū),記為Date,不斷循環(huán)執(zhí)行步驟4).1,直到數(shù)據(jù)緩沖區(qū)中節(jié)點數(shù)量達到6個Date={N1,N2,N3,N4,N5,N6}時,執(zhí)行步驟4).2,其中Nl代表下一層中的節(jié)點,下標l表示下一層的第l個節(jié)點,l是大于0的整數(shù);
步驟4).2:按照合并相鄰兩個節(jié)點為一個節(jié)點,將合并產(chǎn)生節(jié)點的擬合誤差作為合并代價的方式,計算數(shù)據(jù)緩沖區(qū)中合并任意兩個相鄰節(jié)點的合并代價,采用自下而上的方式,選擇合并代價最小的兩個節(jié)點合并產(chǎn)生一個合并節(jié)點;
具體到本實例實施,首先計算N1和N2的合并代價,N1={1,9.41,4,10.43和N2={5,10.40,7,10.59,0.02,31.48,189.08},其中節(jié)點Nl包含7個值,分別是節(jié)點的開始時刻ts、開始時刻的值vs、結束時刻te、結束時刻的值ve、擬合誤差e、對應時間序列片段各個時刻值的累加和M、對應時間序列片段每一時刻和對應的值乘積的累加和P;
由公式(12)可知由N1和N2合并產(chǎn)生的合并節(jié)點的擬合誤差ea=0.02,把這個擬合誤差記作合并N1和N2的代價,按照同樣的計算方式可以計算合并N2和N3的、N3和N4、N4和N5、N5和N6的代價分別為0.011、0.078、0.019、0.004;比較合并不同節(jié)點的誤差,發(fā)現(xiàn)合并N5和N6的代價最小,因此首先合并N5和N6,合并節(jié)點記為N5+6,下標5+6表示合并節(jié)點是由N5和N6合并產(chǎn)生的;
步驟4).3:將步驟4).2中選擇出來的合并代價最小的兩個節(jié)點用合并節(jié)點替換,判斷節(jié)點數(shù)量并進行相應的操作:
4).3A:當數(shù)據(jù)緩沖區(qū)中節(jié)點的數(shù)量大于2時,跳轉回步驟4).2;
4).3B:當數(shù)據(jù)緩沖區(qū)中只剩下2個節(jié)點時,將合并產(chǎn)生數(shù)據(jù)緩沖區(qū)中第1個節(jié)點的下一層節(jié)點數(shù)量記為C1,其中下標1代表數(shù)據(jù)緩沖區(qū)中第一個節(jié)點;
具體到本實例實施,用N5+6替換數(shù)據(jù)緩沖區(qū)Date中的N5和N6,然后跳轉回步驟4).2,不斷循環(huán)自下而上的合并,最終數(shù)據(jù)緩沖區(qū)中剩下兩個時間序列段節(jié)點,第一節(jié)點由最初讀入的N1,N2,N3合并形成,第二個節(jié)點由最初讀取到的N4,N5,N6合并形成;
步驟4).4:保存數(shù)據(jù)緩沖區(qū)中的第一個節(jié)點為上一層節(jié)點;然后,清空數(shù)據(jù)緩沖區(qū);再將合并產(chǎn)生第2個節(jié)點的2*B-C1個下一層節(jié)點讀入數(shù)據(jù)緩沖區(qū),然后跳轉回步驟4).1;
具體到本實例實施,將N1,N2,N3合并后的節(jié)點當作中間層的第一個節(jié)點保存,把緩沖區(qū)置空,把合并形成第二個節(jié)點的N4,N5,N6讀入數(shù)據(jù)緩沖區(qū),然后繼續(xù)按照步驟4).1讀取N7,N8,N9,然后自下而上合并,最終由N4,N5,N6,N7合并產(chǎn)生了中間層的第二個節(jié)點,數(shù)據(jù)緩沖區(qū)中現(xiàn)在只剩下了N8,N9然后繼續(xù)步驟4).1讀取最后一個N10,數(shù)據(jù)緩沖區(qū)不足6個,跳轉至步驟4).5;
步驟4).5:將數(shù)據(jù)緩沖區(qū)中小于6個的節(jié)點合并成一個上一層節(jié)點
至此,緩沖區(qū)中只剩下N8,N9,N10,將這三個節(jié)點合并產(chǎn)生中間層的第三個節(jié)點;由葉子層合并產(chǎn)生了中間層的三個節(jié)點;
步驟4).6:在上一層節(jié)點中添加指針和子節(jié)點的索引,指向?qū)淖庸?jié)點,同時在每一層節(jié)點上都添加右指針,指向右邊相鄰的節(jié)點。
按照同樣的流程將中間層作為下一層,合并產(chǎn)生根節(jié)點,最終生成的樹狀索引結構如圖3,樹中分為三層,包括根節(jié)點,中間層和葉子層。
由本實例構建的樹狀索引結構可以看出,樹中節(jié)點自上而下的擬合誤差越來越小,可以實現(xiàn)按照不同的精度查詢,從多層次展現(xiàn)時間序列數(shù)據(jù),很好支持增量式查詢。
由本實例構建的樹狀索引結構可以看出,樹中節(jié)點自上而下的擬合誤差越來越小,便于按照不同的精度返回查詢結果,可以從多層次展現(xiàn)時間序列數(shù)據(jù)。
實施例3
本實例按照實施例1所述的參數(shù)及實施例2中所構建的索引結構,具體闡述利用本發(fā)明構建索引結構的一種自適應的時間序列數(shù)據(jù)查詢算法中從步驟A 到步驟F增量式查詢過程。
具體到本實例實施,按照下面的流程:
步驟(1):將基于步驟5保存的樹狀索引結構的上半部分讀入內(nèi)存,構造查詢語句,初始化查詢結果數(shù)組和數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲以及查詢時深入查找一層所需要的時間;
具體到本實例實施,索引結構如圖3,有三層結構,首先將樹狀索引結構的根節(jié)點和第二層中間節(jié)點讀入內(nèi)存中;同時構建查詢語句q=select*from dateset where time>10and time<20and error<0.02其中Qs=10,Qe=20,Qerror=0.02,并且初始化查詢結果數(shù)組R為空;把數(shù)據(jù)可視化時從查詢開始到展現(xiàn)出來用戶可以接受的最大時間延遲設置為L=0.01ms;查詢時深入查找一層所需要的時間c=0.005ms;
步驟(2):基于步驟(1)的查詢語句查找包含查詢范圍的開始時刻的節(jié)點,同時保證查詢時延小于用戶要求的最大時延,返回包含查詢范圍的開始時刻的節(jié)點;
具體到本實例實施,在樹狀索引結構上查找包含查詢范圍的開始時刻的節(jié)點,并返回,把樹狀索引結構的節(jié)點記為下標r表示第r層,對應樹中根節(jié)點為第1層,中間層為第2層,葉子節(jié)點為第3層;上標t表示節(jié)點在每一層中從左到右的順序,t是大于等于1的整數(shù);按照步驟(2)的流程查找包含查詢范圍的開始時刻的節(jié)點,如下:
步驟(2).1:計算查詢時可以查找的最大深度;
具體到本實例實施,查詢時可以查找的最大深度h=L/c=0.01/0.005=2;
步驟(2).2:讀取根節(jié)點,判斷根節(jié)點是否包含查詢范圍的開始時刻,并根據(jù)判斷結果返回節(jié)點,進行相應操作:
具體到本實例實施,根節(jié)點的時間范圍是1-40,包含查詢范圍10-20.則繼續(xù)步驟(2).3;
步驟(2).3:讀取步驟(2).2返回節(jié)點,記為當前節(jié)點,并判斷當前節(jié)點的 擬合誤差是否滿足查詢誤差要求并進行相應操作,具體為:
(2).3.1:如果當前節(jié)點的擬合誤差小于等于查詢誤差Qerror,返回當前節(jié)點,然后繼續(xù)步驟(3);
(2).3.2:如果當前節(jié)點的擬合誤差大于查詢誤差Qerror,繼續(xù)步驟(2).4;
其中,查詢誤差要求是指是節(jié)點的擬合誤差要小于等于查詢誤差Qerror;
具體到本實例實施,按照步驟(2).3.2要求,當前節(jié)點為節(jié)點的擬合誤差為0.35,比查詢誤差大,則繼續(xù)步驟(2).4;
步驟(2).4:計算目前的查詢深度;
查詢深度根據(jù)步驟(2).3中的節(jié)點在樹狀索引結構上的位置計算,在最上層根節(jié)點時,代表查詢深度為1,自上而下每深入一層,查詢深度加1;
具體到本實例實施,節(jié)點為根節(jié)點,查詢深度為1;
步驟(2).5:根據(jù)步驟(2).4計算的目前查詢深度判斷是否可以繼續(xù)深入查詢,具體為:
(2).5.1:如果目前的查詢深度小于h,則根據(jù)步驟(2).2中節(jié)點的子節(jié)點索引,讀取包含查詢范圍開始時刻的子節(jié)點作為根節(jié)點,跳至步驟(2).2;
(2).5.2:如果目前的查詢深度大于等于h,則返回步驟(2).2中的節(jié)點,然后跳至步驟(3);
具體到本實例實施,目前查詢深度為1小于h=2,可以繼續(xù)查找,根據(jù)孩子節(jié)點的索引,讀取的孩子節(jié)點把作為根節(jié)點繼續(xù)按照步驟(2).2查詢;步驟同上,經(jīng)過步驟(2).2和步驟(2).3的判斷,符合查詢要求,將返回;
步驟(3):根據(jù)包含查詢范圍的開始時刻的節(jié)點,將滿足查詢范圍要求的所有節(jié)點加入查詢結果數(shù)組中,并輸出查詢結果數(shù)組,具體為:
步驟(3).1:讀取包含查詢范圍的開始時刻的節(jié)點,并更新當前節(jié)點為此節(jié)點;
具體到本實例實施,將記為當前節(jié)點;
步驟(3).2:判斷當前節(jié)點是否滿足查詢范圍,把滿足查詢范圍要求的節(jié)點加入查詢結果數(shù)組中;
(3).2.1:如果當前節(jié)點的結束時間時刻,小于查詢范圍的結束時刻Qe,將當前節(jié)點加入查詢結果數(shù)組R中,并讀取當前節(jié)點的右指針指向的節(jié)點作為當 前節(jié)點,然后繼續(xù)步驟(3).2;
(3).2.2:如果當前節(jié)點的結束時刻大于等于查詢范圍的結束時刻,將當前節(jié)點加入查詢結果數(shù)組R中,結束查詢,繼續(xù)執(zhí)行步驟(4);
其中,滿足查詢范圍要求是指節(jié)點開始時刻和結束時刻之間覆蓋的時間范圍和查詢范圍的開始時刻和查詢范圍的結束時刻之間覆蓋的時間范圍存在交集;
具體到本實例實施,節(jié)點的結束時刻小于查詢范圍的結束時刻20,因此把賦值給R[0],根據(jù)R[0]的右指針,讀取第二層中間節(jié)點的第二個節(jié)點,記為 作為當前節(jié)點繼續(xù)步驟(3).2,經(jīng)過步驟(3).2的判斷,的結束時間大于查詢結束時間20,因此將賦值給R[1],繼續(xù)執(zhí)行步驟(4);
步驟(4):將查詢結果數(shù)組中的數(shù)據(jù)展示出來;
具體到本實例實施,按照下面的流程執(zhí)行:
步驟(4).1:判斷查詢結果數(shù)組R是否有更新,并根據(jù)判斷結果決定是否進行可視化展現(xiàn):
(4).1.1:若查詢結果數(shù)組R上存在更新,跳至步驟(4).2;
(4).1.2:若查詢結果數(shù)組R上不存在更新,跳至步驟(5);
具體到本實例實施,R上存在更新,繼續(xù)步驟(4).2;
步驟(4).2:判斷查詢結果數(shù)組R中第一個節(jié)點R[0]的開始時刻與查詢范圍的開始時刻是否一致,更新不一致情況下查詢結果數(shù)組R中第一個節(jié)點的開始時刻和開始時刻的值;
(4).2.1:如果判斷結果一致,則跳至步驟(4).3;
(4).2.2:若判斷結果不一致,即R[0]節(jié)點開始時刻小于查詢范圍的開始時刻Qs,則以R[0]節(jié)點開始時刻和結束時刻的值為橫坐標,R[0]節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,再根據(jù)擬合后的直線求出查詢范圍開始時刻對應的值,用查詢范圍的開始時刻和計算出查詢范圍開始時刻的值替換R[0]節(jié)點的開始時刻和開始時刻的值,然后,繼續(xù)步驟(4).3;
在本實例實施中,R[0]從開始時刻為1,而查詢開始時刻為10,不一致,則以R[0]節(jié)點開始時刻和結束時刻的值為橫坐標,R[0]節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,計算出直線的函數(shù)表達式,記為Fs(t),表示為公式(21):
Fs(t)=0.1777t+9.4723 (21)
其中t表示時刻,是從1到14的整數(shù)。通過公式(21)可以得到開始的時刻的值Fs(10)=11.25,將10和11.25替換R[0]節(jié)點的開始時刻和開始時刻的值,然后繼續(xù)步驟(4).3;
步驟(4).3:判斷查詢結果數(shù)組中最后一個節(jié)點的結束時刻是否與查詢范圍的結束時刻是否一致,更新不一致情況下查詢結果數(shù)組R中最后一個節(jié)點的結束時刻和結束時刻的值;
(4).3.1:如果判斷結果一致,則跳至步驟(4).4;
(4).3.2:如果查詢結果數(shù)組中最后一個節(jié)點的結束時刻大于查詢的結束時刻Qe,則以查詢結果數(shù)組中最后一個節(jié)點的開始時刻和結束時刻的值為橫坐標,查詢結果數(shù)組中最后一個節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,根據(jù)擬合后的直線求出查詢范圍的結束時刻對應的值,用查詢范圍的結束時刻和計算出查詢范圍結束時刻的值替換查詢結果數(shù)組中最后一個節(jié)點的結束時刻和結束時刻的值,然后繼續(xù)步驟(4).4;
在本實例實施中,R[1]結束時刻為29,而查詢結束時刻為20,不一致,則需要按照R[1]的開始時刻和結束時刻的值為橫坐標,查詢結果數(shù)組中最后一個節(jié)點開始時刻的值和結束時刻的值為縱坐標,利用這兩點擬合為一條直線,計算出直線的函數(shù)表達式,記為Fe(t),表示為公式(22):
Fe(t)=-0.047t+11.965 (22)
其中t表示時刻,是從15到29的整數(shù)。通過公式(22)可以得到結束的時刻的值Fe(20)=10.39,將20和10.39替換R[1]節(jié)點的開始時刻和開始時刻的值,然后,繼續(xù)步驟(4).4;
步驟(4).4:以時間作為橫坐標,以對應的值作為縱坐標,建立直角坐標系,將查詢結果數(shù)組R中所有節(jié)點的開始時刻和結束時刻對應的點,用直線相連,可視化展現(xiàn)出來;
在本實例實施中,可視化時以時間作為橫軸,對應的值作為縱軸,建立坐標系,將節(jié)點對應的點用直線相連;查詢結果數(shù)組中目前對應的4個點的坐標分別是(10,11.25)、(14,11.96)、(15,11.26)、(20,10.39),其中每個坐標第一個值對應橫軸,第二個值對應縱軸;
步驟(5):依次遍歷查詢結果數(shù)組中的每一個節(jié)點,判斷查詢結果數(shù)組中是否有不滿足查詢誤差要求需要細化查詢的節(jié)點,返回不滿足查詢誤差要求的節(jié)點和細化查詢的查詢語句;
具體到本實例實施,按照下面的流程執(zhí)行:
步驟(5).1:順序讀取查詢結果數(shù)組R中的一個節(jié)點,判斷讀取到的節(jié)點擬合誤差和查詢誤差的關系,返回不滿足查詢誤差要求的節(jié)點和細化查詢的查詢語句;
(5).1.1:如果讀取到的節(jié)點的擬合誤差大于查詢誤差Qerror,則重新構造查詢語句q,如果此次讀取到的節(jié)點的開始時刻比查詢范圍的開始時刻Qs小,查詢語句q的查詢范圍的開始時刻Qs不變,否則q的查詢范圍的開始時刻Qs設置為此次讀取到的節(jié)點的開始時刻;如果此次讀取到的節(jié)點的結束時刻比查詢語句q查詢范圍的結束時刻Qe大,則q的查詢范圍的結束時刻Qe不變,否則q的查詢范圍的結束時刻Qe設置為此次讀取到的節(jié)點的結束時刻;查詢誤差Qerror保持不變;然后返回此次讀取到的節(jié)點和查詢語句q,跳轉至步驟(6);
(5).1.2:如果讀取到的節(jié)點的擬合誤差小于等于查詢誤差Qerror,且不是最后一個節(jié)點,繼續(xù)步驟(5).1;如果讀取到的節(jié)點的擬合誤差小于等于查詢誤差Qerror,且是最后一個節(jié)點,跳轉到步驟(5).2;
具體到本實例實施,查詢結果數(shù)組R中第一個節(jié)點擬合誤差小于等于0.02,第二個節(jié)點R[1]擬合誤差為0.07大于0.02,所以遍歷到第二個節(jié)點時,重新構造查詢語句q=select*from dateset where time>15and time<20and error<0.02,將和q返回,繼續(xù)步驟(6);
步驟(6):根據(jù)步驟(5)中返回的節(jié)點和查詢語句,進行細化查詢并更新查詢結果數(shù)組;
具體到本實例實施,按照下面的流程執(zhí)行:
步驟(6).1:在步驟(1)讀入內(nèi)存的樹狀索引結構中,找到步驟(5)中返回的節(jié)點并根據(jù)找到節(jié)點的子節(jié)點索引,讀取包含q中查詢范圍開始時刻的子節(jié)點;
具體到本實例實施,根據(jù)的子節(jié)點索引查找包含查詢范圍開始時刻的子節(jié)點是
步驟(6).2:判斷讀取到的子節(jié)點的擬合誤差是否滿足查詢誤差要求,并根 據(jù)判斷結果進行如下操作:
(6).2.1:如果子節(jié)點的擬合誤差小于等于查詢語句q中查詢誤差Qerror,初始化一個結果緩沖區(qū),暫時保存讀取到的子節(jié)點,按照子節(jié)點的右指針連續(xù)讀取查詢語句q查找范圍內(nèi)包含的所有節(jié)點,依次放入結果緩沖區(qū)中,然后跳轉至步驟(6).3;
(6).2.2:如果子節(jié)點的擬合誤差大于查詢語句q中查詢誤差Qerror,將當前讀取到的子節(jié)點當作步驟(5)返回的節(jié)點,跳轉至步驟(6).1;
具體到本實例實施,的擬合誤差小于等于0.02,因此初始化一個結果緩沖區(qū),按照子節(jié)點的右指針連續(xù)讀取15到20范圍內(nèi)的和并保存到結果緩沖區(qū);
步驟(6).3:將查詢結果數(shù)組R中步驟(6)返回的節(jié)點用結果緩沖區(qū)的節(jié)點替換,更新查詢結果數(shù)組R,然后跳轉到步驟(4);
具體到本實例實施,將R中節(jié)點用和節(jié)點替換,然后跳轉至步驟(4),按照步驟(4)再次執(zhí)行,此時查詢結果數(shù)組R對應的可視化的6個點的坐標分別是(10,11.25)、(14,11.96)、(15,11.58)、(18,10.87)、(19,11.06)、(20,10.99),經(jīng)過步驟(5)判斷,每個節(jié)點都滿足查詢誤差要求,結束查詢。
至此,從步驟(1)到(6)完成了本實例一種自適應的時間序列數(shù)據(jù)可視化查詢算法中增量式查詢過程。
由本實例實施的查詢可視化流程可以看出本發(fā)明可以支持增量式的可視化技術,確保在用戶要求的時間延遲前,返回可視化結果,保證了查詢的效率,而且在展現(xiàn)可視化結果時,支持漸進式不斷細化的方式,保證了展示結果的精度,同時與返回查詢時間范圍內(nèi)所有的原始數(shù)據(jù)相比,本方法只返回節(jié)點數(shù)據(jù),數(shù)據(jù)量小,尤其是在查詢時間范圍比較大的查詢時,效果更加明顯。
實施例4
將實施例1中的股票數(shù)據(jù)改成網(wǎng)絡流量數(shù)據(jù),交通路口通過車輛數(shù)據(jù)等其他任意類型的時間序列數(shù)據(jù),本發(fā)明所提出的一種基于摘要的時間序列數(shù)據(jù)索引構建方法仍然有效。
上述實施方式未述及的有關技術采用或借鑒已有的技術即可實現(xiàn)。
以上所述為本發(fā)明的較佳實施例而已,本發(fā)明不應該局限于該實施例和附 圖所公開的內(nèi)容。凡是不脫離本發(fā)明所公開的精神下完成的等效或修改,都落入本發(fā)明保護的范圍。