本發(fā)明涉及一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法,屬于大數(shù)據(jù)以及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域。
背景技術(shù):
時(shí)間序列數(shù)據(jù)表示由傳感器網(wǎng)絡(luò)、金融市場(chǎng)、醫(yī)療保健、監(jiān)控和其他諸多領(lǐng)域中產(chǎn)生的流式數(shù)據(jù)。隨著高頻流式數(shù)據(jù)源的激增,迫切需要針對(duì)大量數(shù)據(jù)的交互式分析和實(shí)時(shí)可視化技術(shù)。例如趨勢(shì)分析、模式識(shí)別、相關(guān)性分析、交互式數(shù)據(jù)發(fā)現(xiàn)等。
一個(gè)時(shí)間序列數(shù)據(jù)可視化的典型例子是顯示一個(gè)傳感器在特定時(shí)間范圍的值?,F(xiàn)在的可視化工具處理該問(wèn)題,一般分為兩種方法:第一種首先從數(shù)據(jù)庫(kù)中查詢所有滿足條件的值,交由可視化模塊渲染展示。這種方式需要反饋大量數(shù)據(jù)從而導(dǎo)致數(shù)據(jù)傳輸過(guò)程中消耗很大的帶寬進(jìn)而造成很高的延遲。第二種是首先在對(duì)查詢的結(jié)果進(jìn)行數(shù)據(jù)壓縮,然后返回給可視化模塊,這樣可以極大的減少數(shù)據(jù)傳輸過(guò)程中的帶寬消耗,但是在壓縮數(shù)據(jù)時(shí),仍然需要掃描所有符合查詢條件的數(shù)據(jù),這個(gè)過(guò)程時(shí)間代價(jià)仍然很高。為了降低掃描壓縮數(shù)據(jù)的時(shí)間,可以利用數(shù)據(jù)摘要算法來(lái)壓縮時(shí)間序列數(shù)據(jù)的存儲(chǔ)量。但兩種方法都具有查詢時(shí)延長(zhǎng)、數(shù)據(jù)傳輸量大的缺陷。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的旨在解決目前常用可視化方法在處理海量時(shí)間序列數(shù)據(jù)時(shí),遇到的查詢時(shí)延長(zhǎng)、數(shù)據(jù)傳輸量大的缺陷,提出了一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法。
本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法,核心內(nèi)容是構(gòu)建基于摘要的時(shí)間序列數(shù)據(jù)索引,需要查詢時(shí),首先查找查詢范圍內(nèi)的節(jié)點(diǎn)并加入查詢結(jié)果數(shù)組,即首先在用戶要求的時(shí)延內(nèi),返回一個(gè)粗糙的查詢結(jié)果;再遍歷查詢結(jié)果數(shù)組中的所有節(jié)點(diǎn),判斷是否有不滿足誤差要求需要細(xì)化查詢的節(jié)點(diǎn),并根據(jù)判斷結(jié)果進(jìn)行細(xì)化查詢與否的相應(yīng)操作;即不斷細(xì)化不滿足用戶查詢要求的部分,最終保證全部查詢結(jié)果達(dá)到用戶查詢要求,最后更新查詢結(jié)果數(shù)組。確保了可視化方法準(zhǔn)確高效,而且索引結(jié)構(gòu)構(gòu)建立一次,可供多次查詢使用。
一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法,通過(guò)以下步驟實(shí)現(xiàn):
步驟1:建立基于摘要的時(shí)間序列數(shù)據(jù)樹(shù)狀索引結(jié)構(gòu),具體包括:
步驟1.1基于時(shí)間序列數(shù)據(jù),初始化系統(tǒng)參數(shù);
其中,系統(tǒng)參數(shù)包括時(shí)間序列標(biāo)號(hào)、分段最大誤差以及樹(shù)狀索引結(jié)構(gòu)中間節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)基準(zhǔn)、時(shí)間序列片段數(shù)組;
其中,時(shí)間序列標(biāo)號(hào),記為i,代表時(shí)間序列數(shù)據(jù)T中第i個(gè)時(shí)刻,此第i個(gè)時(shí)刻的值記為vi,第i時(shí)刻記為ti,下標(biāo)i是大于等于0的整數(shù);將原始時(shí)間序列分段時(shí)最大的誤差,即分段最大誤差記為ε;樹(shù)狀索引結(jié)構(gòu)中間節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)基準(zhǔn)記為B,B是一個(gè)大于0的整數(shù);時(shí)間序列片段數(shù)組,記為U,初始化為空;
步驟1.2:對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行分段,輸出時(shí)間序列片段并保存到時(shí)間序列片段數(shù)組中;對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行分段可以按照等間隔分段,還可以按照不等間隔分段;
步驟1.3:采用擬合函數(shù)對(duì)步驟1.2輸出的每一段時(shí)間序列片段進(jìn)行擬合,得到每一段時(shí)間序列片段的數(shù)據(jù)摘要信息;
將步驟1.2輸出結(jié)果,時(shí)間序列片段數(shù)組U中的每一項(xiàng)采用線性回歸進(jìn)行擬合,并記錄每一項(xiàng)的數(shù)據(jù)摘要信息下標(biāo)j對(duì)應(yīng)時(shí)間序列片段在U中的順序,j是大于0小于|U|的整數(shù),|U|代表數(shù)組U的長(zhǎng)度;ts和te分別代表時(shí)間序列片段的開(kāi)始時(shí)刻和結(jié)束時(shí)刻,vs和ve分別表示ts時(shí)刻和te時(shí)刻的值,e代表用線性擬合后的直線代替時(shí)間序列數(shù)據(jù)產(chǎn)生的誤差,即擬合誤差,M代表每一時(shí)刻的值累加后的和,P代表每一時(shí)刻和該時(shí)刻的值相乘后累加的和;
步驟1.4:利用步驟1.3得到的數(shù)據(jù)摘要,構(gòu)建樹(shù)狀索引結(jié)構(gòu);
具體為:將步驟1.3中每一項(xiàng)數(shù)據(jù)摘要信息,當(dāng)作樹(shù)中最底層節(jié)點(diǎn),自下而上合并產(chǎn)生上層節(jié)點(diǎn),構(gòu)建樹(shù)狀索引結(jié)構(gòu);其中,自下而上合并產(chǎn)生上層節(jié)點(diǎn),即由下一層節(jié)點(diǎn)合并產(chǎn)生上一層節(jié)點(diǎn);
步驟2:將基于步驟1建立的時(shí)間序列樹(shù)狀索引結(jié)構(gòu)的上半部分讀入內(nèi)存,構(gòu)造查詢語(yǔ)句,初始化查詢結(jié)果數(shù)組和數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲以及查詢時(shí)深入查找一層所需要的時(shí)間;
其中,樹(shù)狀索引結(jié)構(gòu)的上半部分,具體為樹(shù)狀索引結(jié)構(gòu)中除了最底層子節(jié)點(diǎn)外的其他部分;查詢語(yǔ)句為:
q=select*from dateset where time>Qs and time<Qe and error<Qerror,
其中,Qs代表查詢范圍的開(kāi)始時(shí)刻,Qe代表查詢范圍的結(jié)束時(shí)刻,Qerror代表查詢結(jié)果允許的最大誤差,即查詢誤差,表示查詢?cè)赒s和Qe時(shí)刻之間的數(shù)據(jù),并且誤差要小于等于Qerror;初始化查詢結(jié)果數(shù)組R為空;把數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲,記為L(zhǎng);查詢時(shí)深入查找一層所需要的時(shí)間,記為c;
步驟3:基于步驟2的查詢語(yǔ)句查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),同時(shí)保證查詢時(shí)延小于用戶要求的最大時(shí)延,返回包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn);
具體步驟如下:
步驟3.1:計(jì)算查詢時(shí)可以查找的最大深度;
其中,查詢時(shí)可以查找的最大深度記為h,h=L/c;
步驟3.2:讀取根節(jié)點(diǎn),判斷根節(jié)點(diǎn)是否包含查詢范圍的開(kāi)始時(shí)刻,并根據(jù)判斷結(jié)果返回節(jié)點(diǎn),進(jìn)行相應(yīng)操作:
3.21:若根節(jié)點(diǎn)包含查詢范圍的開(kāi)始時(shí)刻,返回當(dāng)前判斷的根節(jié)點(diǎn),跳至步驟3.3;
3.22:若根節(jié)點(diǎn)不包含查詢范圍的開(kāi)始時(shí)刻,則讀取根節(jié)點(diǎn)的右指針指向的節(jié)點(diǎn)作為根節(jié)點(diǎn),跳轉(zhuǎn)到步驟3.2;
步驟3.3:讀取步驟3.2返回節(jié)點(diǎn),記為當(dāng)前節(jié)點(diǎn),并判斷當(dāng)前節(jié)點(diǎn)的擬合誤差是否滿足查詢誤差要求并進(jìn)行相應(yīng)操作,具體為:
3.3.1:如果當(dāng)前節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,返回當(dāng)前節(jié)點(diǎn),然后繼續(xù)步驟4;
3.3.2:如果當(dāng)前節(jié)點(diǎn)的擬合誤差大于查詢誤差Qerror,繼續(xù)步驟3.4;
其中,查詢誤差要求是指是節(jié)點(diǎn)的擬合誤差要小于等于查詢誤差Qerror;
步驟3.4:計(jì)算目前的查詢深度;
查詢深度根據(jù)步驟3.3中的節(jié)點(diǎn)在樹(shù)狀索引結(jié)構(gòu)上的位置計(jì)算,在最上層根節(jié)點(diǎn)時(shí),代表查詢深度為1,自上而下每深入一層,查詢深度加1;
步驟3.5:根據(jù)步驟3.4計(jì)算的目前查詢深度判斷是否可以繼續(xù)深入查詢,具體為:
3.5.1:如果目前的查詢深度小于h,則根據(jù)步驟3.2中節(jié)點(diǎn)的子節(jié)點(diǎn)索引,讀取包含查詢范圍開(kāi)始時(shí)刻的子節(jié)點(diǎn)作為根節(jié)點(diǎn),跳至步驟3.2;
3.5.2:如果目前的查詢深度大于等于h,則返回步驟3.2中的節(jié)點(diǎn),然后跳至步驟4;
步驟4:根據(jù)包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),將滿足查詢范圍要求的所有節(jié)點(diǎn)加入查詢結(jié)果數(shù)組中,并輸出查詢結(jié)果數(shù)組,具體為:
步驟4.1:讀取包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),并更新當(dāng)前節(jié)點(diǎn)為此節(jié)點(diǎn);
步驟4.2:判斷當(dāng)前節(jié)點(diǎn)是否滿足查詢范圍,把滿足查詢范圍要求的節(jié)點(diǎn)加入查詢結(jié)果數(shù)組中;
4.2.1:如果當(dāng)前節(jié)點(diǎn)的結(jié)束時(shí)間時(shí)刻,小于查詢范圍的結(jié)束時(shí)刻Qe,將當(dāng)前節(jié)點(diǎn)加入查詢結(jié)果數(shù)組R中,并讀取當(dāng)前節(jié)點(diǎn)的右指針指向的節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),然后繼續(xù)步驟4.2;
4.2.2:如果當(dāng)前節(jié)點(diǎn)的結(jié)束時(shí)刻大于等于查詢范圍的結(jié)束時(shí)刻,將當(dāng)前節(jié)點(diǎn)加入查詢結(jié)果數(shù)組R中,結(jié)束查詢,繼續(xù)執(zhí)行步驟5;
其中,滿足查詢范圍要求是指節(jié)點(diǎn)開(kāi)始時(shí)刻和結(jié)束時(shí)刻之間覆蓋的時(shí)間范圍和查詢范圍的開(kāi)始時(shí)刻和查詢范圍的結(jié)束時(shí)刻之間覆蓋的時(shí)間范圍存在交集;
步驟5:將查詢結(jié)果數(shù)組中的數(shù)據(jù)展示出來(lái),具體為:
步驟5.1:判斷查詢結(jié)果數(shù)組R是否有更新,并根據(jù)判斷結(jié)果決定是否進(jìn)行可視化展現(xiàn):
5.1.1:若查詢結(jié)果數(shù)組R上存在更新,跳至步驟5.2;
5.1.2:若查詢結(jié)果數(shù)組R上不存在更新,跳至步驟6;
步驟5.2:判斷查詢結(jié)果數(shù)組R中第一個(gè)節(jié)點(diǎn)R[0]的開(kāi)始時(shí)刻與查詢范圍的開(kāi)始時(shí)刻是否一致,更新不一致情況下查詢結(jié)果數(shù)組R中第一個(gè)節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值;
5.2.1:如果判斷結(jié)果一致,則跳至步驟5.3;
5.2.2:若判斷結(jié)果不一致,即R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻小于查詢范圍的開(kāi)始時(shí)刻Qs,則以R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,再根據(jù)擬合后的直線求出查詢范圍開(kāi)始時(shí)刻對(duì)應(yīng)的值,用查詢范圍的開(kāi)始時(shí)刻和計(jì)算出查詢范圍開(kāi)始時(shí)刻的值替換R[0]節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,然后,繼續(xù)步驟5.3;
步驟5.3:判斷查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻是否與查詢范圍的結(jié)束時(shí)刻是否一致,更新不一致情況下查詢結(jié)果數(shù)組R中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻和結(jié)束時(shí)刻的值;
5.3.1:如果判斷結(jié)果一致,則跳至步驟5.4;
5.3.2:如果查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻大于查詢的結(jié)束時(shí)刻Qe,則以查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,根據(jù)擬合后的直線求出查詢范圍的結(jié)束時(shí)刻對(duì)應(yīng)的值,用查詢范圍的結(jié)束時(shí)刻和計(jì)算出查詢范圍結(jié)束時(shí)刻的值替換查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻和結(jié)束時(shí)刻的值,然后繼續(xù)步驟5.4;
步驟5.4:以時(shí)間作為橫坐標(biāo),以對(duì)應(yīng)的值作為縱坐標(biāo),建立直角坐標(biāo)系,將查詢結(jié)果數(shù)組R中所有節(jié)點(diǎn)的開(kāi)始時(shí)刻和結(jié)束時(shí)刻對(duì)應(yīng)的點(diǎn),用直線相連,可視化展現(xiàn)出來(lái);
步驟6:依次遍歷查詢結(jié)果數(shù)組中的每一個(gè)節(jié)點(diǎn),判斷查詢結(jié)果數(shù)組中是否有不滿足查詢誤差要求需要細(xì)化查詢的節(jié)點(diǎn),返回不滿足查詢誤差要求的節(jié)點(diǎn)和細(xì)化查詢的查詢語(yǔ)句;
具體步驟如下:
步驟6.1:順序讀取查詢結(jié)果數(shù)組R中的一個(gè)節(jié)點(diǎn),判斷讀取到的節(jié)點(diǎn)擬合誤差和查詢誤差的關(guān)系,返回不滿足查詢誤差要求的節(jié)點(diǎn)和細(xì)化查詢的查詢語(yǔ)句;
6.1.1:如果讀取到的節(jié)點(diǎn)的擬合誤差大于查詢誤差Qerror,則重新構(gòu)造查詢語(yǔ)句q,如果此次讀取到的節(jié)點(diǎn)的開(kāi)始時(shí)刻比查詢范圍的開(kāi)始時(shí)刻Qs小,查詢語(yǔ)句q的查詢范圍的開(kāi)始時(shí)刻Qs不變,否則q的查詢范圍的開(kāi)始時(shí)刻Qs設(shè)置為此次讀取到的節(jié)點(diǎn)的開(kāi)始時(shí)刻;如果此次讀取到的節(jié)點(diǎn)的結(jié)束時(shí)刻比查詢語(yǔ)句q查詢范圍的結(jié)束時(shí)刻Qe大,則q的查詢范圍的結(jié)束時(shí)刻Qe不變,否則q的查詢范圍的結(jié)束時(shí)刻Qe設(shè)置為此次讀取到的節(jié)點(diǎn)的結(jié)束時(shí)刻;查詢誤差Qerror保持不變;然后返回此次讀取到的節(jié)點(diǎn)和查詢語(yǔ)句q,跳轉(zhuǎn)至步驟7;
6.1.2:如果讀取到的節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,且不是最后一個(gè)節(jié)點(diǎn),繼續(xù)步驟6.1;如果讀取到的節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,且是最后一個(gè)節(jié)點(diǎn),跳轉(zhuǎn)到步驟6.2;
步驟6.2:查詢結(jié)果數(shù)組中所有的節(jié)點(diǎn)的擬合誤差都小于等于查詢誤差Qerror,滿足查詢誤差要求,結(jié)束查詢;
步驟7:根據(jù)步驟6中返回的節(jié)點(diǎn)和查詢語(yǔ)句,進(jìn)行細(xì)化查詢并更新查詢結(jié)果數(shù)組,具體為:
步驟7.1:在步驟2讀入內(nèi)存的樹(shù)狀索引結(jié)構(gòu)中,找到步驟6中返回的節(jié)點(diǎn)并根據(jù)找到節(jié)點(diǎn)的子節(jié)點(diǎn)索引,讀取包含q中查詢范圍開(kāi)始時(shí)刻的子節(jié)點(diǎn);
步驟7.2:判斷讀取到的子節(jié)點(diǎn)的擬合誤差是否滿足查詢誤差要求,并根據(jù)判斷結(jié)果進(jìn)行如下操作:
7.2.1:如果子節(jié)點(diǎn)的擬合誤差小于等于查詢語(yǔ)句q中查詢誤差Qerror,初始化一個(gè)結(jié)果緩沖區(qū),暫時(shí)保存讀取到的子節(jié)點(diǎn),按照子節(jié)點(diǎn)的右指針連續(xù)讀取查詢語(yǔ)句q查找范圍內(nèi)包含的所有節(jié)點(diǎn),依次放入結(jié)果緩沖區(qū)中,然后跳轉(zhuǎn)至步驟7.3;
7.2.2:如果子節(jié)點(diǎn)的擬合誤差大于查詢語(yǔ)句q中查詢誤差Qerror,將當(dāng)前讀
取到的子節(jié)點(diǎn)當(dāng)作步驟6返回的節(jié)點(diǎn),跳轉(zhuǎn)至步驟7.1;
步驟7.3:將查詢結(jié)果數(shù)組R中步驟6返回的節(jié)點(diǎn)用結(jié)果緩沖區(qū)的節(jié)點(diǎn)替換,更新查詢結(jié)果數(shù)組R,然后跳轉(zhuǎn)到步驟5;
至此,經(jīng)過(guò)步驟1到步驟7,完成了一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法。
有益效果
本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法基于一種樹(shù)狀索引結(jié)構(gòu)來(lái)組織并存儲(chǔ)擬合后的時(shí)間序列數(shù)據(jù)摘要,實(shí)現(xiàn)了一種自適應(yīng)的可視化方法,與現(xiàn)有索引構(gòu)建及查詢的可視化方法相比,具有如下有益效果:
1.本發(fā)明所提出的方法利用樹(shù)狀索引結(jié)構(gòu)層層深入查詢,而且自根節(jié)點(diǎn)到葉子節(jié)點(diǎn)擬合誤差越來(lái)越小,可以適應(yīng)按不同誤差查詢的需要;
2.本發(fā)明所提出的方法采用了增量式的可視化技術(shù),即在給定的可視化響應(yīng)時(shí)間延遲下,首先立即返回一個(gè)粗糙的可視化結(jié)果,然后逐漸細(xì)化不滿足誤差要求的部分,最終達(dá)到符合用戶查詢要求,返回查詢結(jié)果數(shù)據(jù)量小,從查詢到展現(xiàn)結(jié)果的時(shí)間延遲??;
3.本發(fā)明所提出的方法可以按照不同查詢精度返回查詢結(jié)果,從多角度展現(xiàn)時(shí)間序列數(shù)據(jù),可以應(yīng)用于統(tǒng)計(jì)分析、數(shù)據(jù)挖掘、監(jiān)控分析等針對(duì)時(shí)間序列數(shù)據(jù)分析的領(lǐng)域。
附圖說(shuō)明
圖1為本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法及實(shí)施例1中數(shù)據(jù)查詢的流程示意圖;
圖2為本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法中對(duì)應(yīng)的樹(shù)狀索引結(jié)構(gòu)示意圖及實(shí)施例中構(gòu)建的索引結(jié)構(gòu);
其中,圖2中箭頭代表指針,指向?qū)?yīng)節(jié)點(diǎn)的位置,Null代表空指針,表明當(dāng)前節(jié)點(diǎn)右邊不存在兄弟節(jié)點(diǎn)。
具體實(shí)施方式
下面根據(jù)附圖及實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明,但本發(fā)明的具體實(shí)施形式并不局限于此。
實(shí)施例1
本實(shí)施例詳細(xì)闡述了本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法應(yīng)用于股票數(shù)據(jù)時(shí),首先采用索引構(gòu)建算法構(gòu)建數(shù)據(jù)索引,然后基于構(gòu)建的索引結(jié)構(gòu)利用一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢算法進(jìn)行查詢可視化的流程。
實(shí)例中采用的時(shí)間序列數(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},對(duì)應(yīng)的時(shí)刻從1到40。
圖1為本發(fā)明一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法及本實(shí)施例中數(shù)據(jù)查詢的流程示意圖;從圖中可看出,包含如下步驟:
步驟A:建立基于摘要的時(shí)間序列數(shù)據(jù)索引結(jié)構(gòu),具體步驟如下:
步驟A.1:基于時(shí)間序列數(shù)據(jù),初始化系統(tǒng)參數(shù);
具體到本實(shí)例,時(shí)間序列標(biāo)號(hào)i可以是從1到40的整數(shù),由于時(shí)間序列數(shù)據(jù)T整體方差比偏小,因此設(shè)置段最大誤差ε=0.2,樹(shù)狀索引結(jié)構(gòu)中間節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)基準(zhǔn)B=3;時(shí)間序列片段數(shù)組U,初始化為空;保存索引結(jié)構(gòu)時(shí)初始化內(nèi)存緩沖區(qū)的大小X=100兆字節(jié);
步驟A.2:對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行分段,輸出時(shí)間序列片段并保存到時(shí)間序列片段數(shù)組中;
具體到本實(shí)例實(shí)施,不斷讀取時(shí)間序列數(shù)據(jù),根據(jù)用戶自定義的分段誤差ε=0.2,采用旋轉(zhuǎn)門(mén)算法進(jìn)行分段,經(jīng)過(guò)分段后T產(chǎn)生了10個(gè)時(shí)間序列片段,旋轉(zhuǎn)門(mén)算法的輸出結(jié)果時(shí)間序列片段數(shù)組
步驟A.3:采用擬合函數(shù)對(duì)上一步驟輸出的每一段時(shí)間序列片段進(jìn)行擬合,得到每一段時(shí)間序列片段的數(shù)據(jù)摘要信息;
具體到本實(shí)例實(shí)施,對(duì)時(shí)間序列片段數(shù)組U中的每一項(xiàng),采用線性回歸的方法進(jìn)行線性擬合,同時(shí)記錄每一個(gè)時(shí)間序列片段的開(kāi)始時(shí)刻ts和結(jié)束時(shí)刻te以及開(kāi)始時(shí)刻的值vs和結(jié)束時(shí)刻的值ve,計(jì)算擬合誤差e,每一時(shí)刻的值累加后的和M,每一時(shí)刻和該時(shí)刻的值相乘后累加的和P,形成該時(shí)間序列片段的數(shù)據(jù)摘要信息經(jīng)過(guò)步驟A.3,最終形成了10個(gè)時(shí)間序列片段的數(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}
步驟A.4:利用上一步驟得到的數(shù)據(jù)摘要信息,構(gòu)建樹(shù)狀索引結(jié)構(gòu);
具體到本實(shí)例實(shí)施,將收到步驟A.3的數(shù)據(jù)摘要信息轉(zhuǎn)化為10個(gè)最底層的子節(jié)點(diǎn),同時(shí)利用10個(gè)最底層的子節(jié)點(diǎn)生成第二層的3個(gè)節(jié)點(diǎn),第二層的3個(gè)節(jié)點(diǎn)合并形成1個(gè)根節(jié)點(diǎn);生成樹(shù)狀索引結(jié)構(gòu)如圖2,第一層節(jié)點(diǎn)稱為根節(jié)點(diǎn),第二層稱為中間節(jié)點(diǎn),最下面的子節(jié)點(diǎn)叫做葉子節(jié)點(diǎn);根節(jié)點(diǎn)和中間節(jié)點(diǎn)具有相似結(jié)構(gòu),節(jié)點(diǎn)中第一層兩個(gè)數(shù)分別代表開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,第二層兩個(gè)數(shù)分別代表結(jié)束時(shí)刻和結(jié)束時(shí)刻的值,第三層左邊的值表示節(jié)點(diǎn)的擬合誤差,右邊的值表示右邊相鄰的節(jié)點(diǎn)指針,Null表示空,表示當(dāng)前節(jié)點(diǎn)的右邊沒(méi)有節(jié)點(diǎn),第四層表示子節(jié)點(diǎn)的索引,第五層表示對(duì)應(yīng)子節(jié)點(diǎn)的指針,方便讀取子節(jié)點(diǎn);葉子節(jié)點(diǎn)的結(jié)構(gòu)只有三層,第一層兩個(gè)值分別對(duì)應(yīng)開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,第二層兩個(gè)值分別對(duì)應(yīng)結(jié)束時(shí)刻和結(jié)束時(shí)刻的值,第三層左邊的值表示節(jié)點(diǎn)的擬合誤差,右邊的值用來(lái)表示右邊相鄰的節(jié)點(diǎn)指針,Null表示當(dāng)前節(jié)點(diǎn)右邊沒(méi)有節(jié)點(diǎn);
步驟B:基于步驟A建立的時(shí)間序列樹(shù)狀索引結(jié)構(gòu)的上半部分讀入內(nèi)存,構(gòu)造查詢語(yǔ)句,初始化查詢結(jié)果數(shù)組和數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲以及查詢時(shí)深入查找一層所需要的時(shí)間;;
具體到本實(shí)例實(shí)施,將樹(shù)結(jié)構(gòu)的根節(jié)點(diǎn)和第二層中間節(jié)點(diǎn)讀入內(nèi)存中;同時(shí)構(gòu)建查詢語(yǔ)句q=select*from dateset where time>1 and time<29and error<0.1,其中Qs表示查詢范圍的開(kāi)始時(shí)刻,Qs=1,Qe表示查詢范圍的結(jié)束時(shí)刻,Qe=29,Qerror表示查詢誤差,Qerror=0.1,并且初始化查詢結(jié)果數(shù)組R為空,把數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲設(shè)置為L(zhǎng)=0.01ms,查詢時(shí)深入查找一層所需要的時(shí)間c=0.001ms;
步驟C:基于步驟B的查詢語(yǔ)句查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),同時(shí)保證查詢時(shí)延小于用戶要求的最大時(shí)延,返回包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,在樹(shù)狀索引結(jié)構(gòu)上查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),并返回,滿足條件的節(jié)點(diǎn)是第二層第一個(gè)節(jié)點(diǎn),記為下標(biāo)2代表第2層,上標(biāo)1代表第一個(gè)節(jié)點(diǎn);將返回;
步驟D:根據(jù)包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),將滿足查詢范圍要求的所有節(jié)點(diǎn)加入查詢結(jié)果數(shù)組中,并輸出查詢結(jié)果數(shù)組;
具體到本實(shí)例,將加入R中,賦值給R[0],然后根據(jù)的右指針,讀取第二層中間節(jié)點(diǎn)的第二個(gè)節(jié)點(diǎn),記為下標(biāo)2代表第2層,上標(biāo)2代表第2個(gè)節(jié)點(diǎn),將賦值給R[1];
步驟E:將查詢結(jié)果數(shù)組中的數(shù)據(jù)展示出來(lái);
具體到本實(shí)例實(shí)施,首先判斷判斷查詢結(jié)果數(shù)組R是否有變化,查詢結(jié)果數(shù)組R存在變化,同時(shí)查詢結(jié)果數(shù)組中第一個(gè)節(jié)點(diǎn)的開(kāi)始時(shí)刻和最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻和查詢范圍的開(kāi)始時(shí)刻和結(jié)束時(shí)刻一致,所以把時(shí)間作為橫坐標(biāo),把對(duì)應(yīng)的值作為縱坐標(biāo),建立直角坐標(biāo)系,將查詢結(jié)果數(shù)組R中所有節(jié)點(diǎn)的開(kāi)始時(shí)刻和結(jié)束時(shí)刻對(duì)應(yīng)的點(diǎn),用直線相連,可視化展現(xiàn)出來(lái);
步驟F:依次遍歷查詢結(jié)果數(shù)組中的每一個(gè)節(jié)點(diǎn),判斷查詢結(jié)果數(shù)組中是否有不滿足查詢誤差要求需要細(xì)化查詢的節(jié)點(diǎn),返回不滿足查詢誤差要求的節(jié)點(diǎn)和細(xì)化查詢的查詢語(yǔ)句;
具體到本實(shí)例實(shí)施,查詢結(jié)果數(shù)組R中兩個(gè)節(jié)點(diǎn)的擬合誤差都小于查詢誤差Qerror=0.1,滿足查詢誤差要求,不需要細(xì)化查詢,至此完成了本方法;
至此,從步驟A到F,完成了基于本實(shí)施例應(yīng)用本發(fā)明提出的方法:一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢方法的自適應(yīng)數(shù)據(jù)查詢。
實(shí)施例2
本實(shí)例按照實(shí)施例1中所述參數(shù),具體闡述了本發(fā)明步驟1.4中構(gòu)建樹(shù)狀索引結(jié)構(gòu)的算法及實(shí)施例1中的步驟A.4的執(zhí)行流程。
具體流程為:根據(jù)下一層節(jié)點(diǎn),采用自下而上的方法,合并產(chǎn)生上一層節(jié)點(diǎn),自下而上構(gòu)建根樹(shù)狀索引結(jié)構(gòu)。
具體到本實(shí)例實(shí)施中,由最底層節(jié)點(diǎn),即葉子層節(jié)點(diǎn)合并產(chǎn)生中間層節(jié)點(diǎn)的流程如下:
步驟4):利用步驟3)得到的數(shù)據(jù)摘要信息,構(gòu)建樹(shù)狀索引結(jié)構(gòu);;
上一步驟傳來(lái)的數(shù)據(jù)為10時(shí)間序列片段的數(shù)據(jù)摘要信息,記為Nj,下標(biāo)j表示對(duì)應(yīng)時(shí)間序列片段的順序,是從1到10的整數(shù);
步驟4).1:順序讀取一個(gè)下一層節(jié)點(diǎn)到數(shù)據(jù)緩沖區(qū)中,數(shù)據(jù)緩沖區(qū)用來(lái)暫時(shí)保存讀到的節(jié)點(diǎn)數(shù)據(jù),判斷節(jié)點(diǎn)數(shù)據(jù)的數(shù)量,并進(jìn)行相應(yīng)操作:
4).1A:當(dāng)數(shù)據(jù)緩沖區(qū)節(jié)點(diǎn)數(shù)量達(dá)到2*B即6個(gè)時(shí),跳至步驟4).2;
4).1B:當(dāng)數(shù)據(jù)緩沖區(qū)節(jié)點(diǎn)數(shù)量不足2*B即6個(gè)時(shí),且讀取的節(jié)點(diǎn)不是最后一個(gè)節(jié)點(diǎn)時(shí),跳回步驟4).1;否則,若數(shù)據(jù)緩沖區(qū)節(jié)點(diǎn)數(shù)量不足2*B即6個(gè)時(shí),且讀取的節(jié)點(diǎn)是最后一個(gè)節(jié)點(diǎn),跳轉(zhuǎn)至步驟4).5;
具體到本實(shí)例實(shí)施,數(shù)據(jù)緩沖區(qū),記為Date,不斷循環(huán)執(zhí)行步驟4).1,直到數(shù)據(jù)緩沖區(qū)中節(jié)點(diǎn)數(shù)量達(dá)到6個(gè)Date={N1,N2,N3,N4,N5,N6}時(shí),執(zhí)行步驟4).2,其中Nl代表下一層中的節(jié)點(diǎn),下標(biāo)l表示下一層的第l個(gè)節(jié)點(diǎn),l是大于0的整數(shù);
步驟4).2:按照合并相鄰兩個(gè)節(jié)點(diǎn)為一個(gè)節(jié)點(diǎn),將合并產(chǎn)生節(jié)點(diǎn)的擬合誤差作為合并代價(jià)的方式,計(jì)算數(shù)據(jù)緩沖區(qū)中合并任意兩個(gè)相鄰節(jié)點(diǎn)的合并代價(jià),采用自下而上的方式,選擇合并代價(jià)最小的兩個(gè)節(jié)點(diǎn)合并產(chǎn)生一個(gè)合并節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,首先計(jì)算N1和N2的合并代價(jià),N1={1,9.41,4,10.43,0.01,39.67,100.87}和N2={5,10.40,7,10.59,0.02,31.48,189.08},其中節(jié)點(diǎn)Nl包含7個(gè)值,分別是節(jié)點(diǎn)的開(kāi)始時(shí)刻ts、開(kāi)始時(shí)刻的值vs、結(jié)束時(shí)刻te、結(jié)束時(shí)刻的值ve、擬合誤差e、對(duì)應(yīng)時(shí)間序列片段各個(gè)時(shí)刻值的累加和M、對(duì)應(yīng)時(shí)間序列片段每一時(shí)刻和對(duì)應(yīng)的值乘積的累加和P;
由公式(12)可知由N1和N2合并產(chǎn)生的合并節(jié)點(diǎn)的擬合誤差ea=0.02,把這個(gè)擬合誤差記作合并N1和N2的代價(jià),按照同樣的計(jì)算方式可以計(jì)算合并N2和N3的、N3和N4、N4和N5、N5和N6的代價(jià)分別為0.011、0.078、0.019、0.004;比較合并不同節(jié)點(diǎn)的誤差,發(fā)現(xiàn)合并N5和N6的代價(jià)最小,因此首先合并N5和N6,合并節(jié)點(diǎn)記為N5+6,下標(biāo)5+6表示合并節(jié)點(diǎn)是由N5和N6合并產(chǎn)生的;
步驟4).3:將步驟4).2中選擇出來(lái)的合并代價(jià)最小的兩個(gè)節(jié)點(diǎn)用合并節(jié)點(diǎn)替換,判斷節(jié)點(diǎn)數(shù)量并進(jìn)行相應(yīng)的操作:
4).3A:當(dāng)數(shù)據(jù)緩沖區(qū)中節(jié)點(diǎn)的數(shù)量大于2時(shí),跳轉(zhuǎn)回步驟4).2;
4).3B:當(dāng)數(shù)據(jù)緩沖區(qū)中只剩下2個(gè)節(jié)點(diǎn)時(shí),將合并產(chǎn)生數(shù)據(jù)緩沖區(qū)中第1個(gè)節(jié)點(diǎn)的下一層節(jié)點(diǎn)數(shù)量記為C1,其中下標(biāo)1代表數(shù)據(jù)緩沖區(qū)中第一個(gè)節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,用N5+6替換數(shù)據(jù)緩沖區(qū)Date中的N5和N6,然后跳轉(zhuǎn)回步驟4).2,不斷循環(huán)自下而上的合并,最終數(shù)據(jù)緩沖區(qū)中剩下兩個(gè)時(shí)間序列段節(jié)點(diǎn),第一節(jié)點(diǎn)由最初讀入的N1,N2,N3合并形成,第二個(gè)節(jié)點(diǎn)由最初讀取到的N4,N5,N6合并形成;
步驟4).4:保存數(shù)據(jù)緩沖區(qū)中的第一個(gè)節(jié)點(diǎn)為上一層節(jié)點(diǎn);然后,清空數(shù)據(jù)緩沖區(qū);再將合并產(chǎn)生第2個(gè)節(jié)點(diǎn)的2*B-C1個(gè)下一層節(jié)點(diǎn)讀入數(shù)據(jù)緩沖區(qū),然后跳轉(zhuǎn)回步驟4).1;
具體到本實(shí)例實(shí)施,將N1,N2,N3合并后的節(jié)點(diǎn)當(dāng)作中間層的第一個(gè)節(jié)點(diǎn)保存,把緩沖區(qū)置空,把合并形成第二個(gè)節(jié)點(diǎn)的N4,N5,N6讀入數(shù)據(jù)緩沖區(qū),然后繼續(xù)按照步驟4).1讀取N7,N8,N9,然后自下而上合并,最終由N4,N5,N6,N7合并產(chǎn)生了中間層的第二個(gè)節(jié)點(diǎn),數(shù)據(jù)緩沖區(qū)中現(xiàn)在只剩下了N8,N9然后繼續(xù)步驟4).1讀取最后一個(gè)N10,數(shù)據(jù)緩沖區(qū)不足6個(gè),跳轉(zhuǎn)至步驟4).5;
步驟4).5:將數(shù)據(jù)緩沖區(qū)中小于6個(gè)的節(jié)點(diǎn)合并成一個(gè)上一層節(jié)點(diǎn)
至此,緩沖區(qū)中只剩下N8,N9,N10,將這三個(gè)節(jié)點(diǎn)合并產(chǎn)生中間層的第三個(gè)節(jié)點(diǎn);由葉子層合并產(chǎn)生了中間層的三個(gè)節(jié)點(diǎn);
步驟4).6:在上一層節(jié)點(diǎn)中添加指針和子節(jié)點(diǎn)的索引,指向?qū)?yīng)的子節(jié)點(diǎn),同時(shí)在每一層節(jié)點(diǎn)上都添加右指針,指向右邊相鄰的節(jié)點(diǎn)。
按照同樣的流程將中間層作為下一層,合并產(chǎn)生根節(jié)點(diǎn),最終生成的樹(shù)狀索引結(jié)構(gòu)如圖2,樹(shù)中分為三層,包括根節(jié)點(diǎn),中間層和葉子層。
由本實(shí)例構(gòu)建的樹(shù)狀索引結(jié)構(gòu)可以看出,樹(shù)中節(jié)點(diǎn)自上而下的擬合誤差越來(lái)越小,可以實(shí)現(xiàn)按照不同的精度查詢,從多層次展現(xiàn)時(shí)間序列數(shù)據(jù),很好支持增量式查詢。
由本實(shí)例構(gòu)建的樹(shù)狀索引結(jié)構(gòu)可以看出,樹(shù)中節(jié)點(diǎn)自上而下的擬合誤差越來(lái)越小,可以實(shí)現(xiàn)按照不同的精度查詢,從多層次展現(xiàn)時(shí)間序列數(shù)據(jù),很好支持增量式查詢。
實(shí)施例3
本實(shí)例按照實(shí)施例1所述的參數(shù)及實(shí)施例2中所構(gòu)建的索引結(jié)構(gòu),具體闡述執(zhí)行本發(fā)明中一種自適應(yīng)的時(shí)間序列數(shù)據(jù)查詢算法中步驟2到步驟7增量式查詢過(guò)程。
具體到本實(shí)例實(shí)施,按照下面的流程:
步驟(2):將基于步驟(1)建立的時(shí)間序列樹(shù)狀索引結(jié)構(gòu)的上半部分讀入內(nèi)存,構(gòu)造查詢語(yǔ)句,初始化查詢結(jié)果數(shù)組和數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲以及查詢時(shí)深入查找一層所需要的時(shí)間;
具體到本實(shí)例實(shí)施,索引結(jié)構(gòu)如圖2,有三層結(jié)構(gòu),首先將樹(shù)狀索引結(jié)構(gòu)的根節(jié)點(diǎn)和第二層中間節(jié)點(diǎn)讀入內(nèi)存中;同時(shí)構(gòu)建查詢語(yǔ)句q=select*from dateset where time>10and time<20and error<0.02其中Qs=10,Qe=20,Qerror=0.02,并且初始化查詢結(jié)果數(shù)組R為空;把數(shù)據(jù)可視化時(shí)從查詢開(kāi)始到展現(xiàn)出來(lái)用戶可以接受的最大時(shí)間延遲設(shè)置為L(zhǎng)=0.01ms;查詢時(shí)深入查找一層所需要的時(shí)間c=0.005ms;
步驟(3):基于步驟(2)的查詢語(yǔ)句查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),同時(shí)保證查詢時(shí)延小于用戶要求的最大時(shí)延,返回包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,在樹(shù)狀索引結(jié)構(gòu)上查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),并返回,把樹(shù)狀索引結(jié)構(gòu)的節(jié)點(diǎn)記為下標(biāo)r表示第r層,對(duì)應(yīng)樹(shù)中根節(jié)點(diǎn)為第1層,中間層為第2層,葉子節(jié)點(diǎn)為第3層;上標(biāo)t表示節(jié)點(diǎn)在每一層中從左到右的順序,t是大于等于1的整數(shù);按照步驟(3)的流程查找包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),如下:
步驟(3).1:計(jì)算查詢時(shí)可以查找的最大深度;
具體到本實(shí)例實(shí)施,查詢時(shí)可以查找的最大深度h=L/c=0.01/0.005=2;
步驟(3).2:讀取根節(jié)點(diǎn),判斷根節(jié)點(diǎn)是否包含查詢范圍的開(kāi)始時(shí)刻,并根據(jù)判斷結(jié)果返回節(jié)點(diǎn),進(jìn)行相應(yīng)操作:
具體到本實(shí)例實(shí)施,根節(jié)點(diǎn)的時(shí)間范圍是1-40,包含查詢范圍10-20.則繼續(xù)步驟(3).3;
步驟(3).3:讀取步驟(3).2返回節(jié)點(diǎn),記為當(dāng)前節(jié)點(diǎn),并判斷當(dāng)前節(jié)點(diǎn)的擬合誤差是否滿足查詢誤差要求并進(jìn)行相應(yīng)操作,具體為:
(3).3.1:如果當(dāng)前節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,返回當(dāng)前節(jié)點(diǎn),然后繼續(xù)步驟(4);
(3).3.2:如果當(dāng)前節(jié)點(diǎn)的擬合誤差大于查詢誤差Qerror,繼續(xù)步驟(3).4;
其中,查詢誤差要求是指是節(jié)點(diǎn)的擬合誤差要小于等于查詢誤差Qerror;
具體到本實(shí)例實(shí)施,按照步驟(3).3.2要求,當(dāng)前節(jié)點(diǎn)為節(jié)點(diǎn)的擬合誤差為0.35,比查詢誤差大,則繼續(xù)步驟(3).4;
步驟(3).4:計(jì)算目前的查詢深度;
查詢深度根據(jù)步驟(3).3中的節(jié)點(diǎn)在樹(shù)狀索引結(jié)構(gòu)上的位置計(jì)算,在最上層根節(jié)點(diǎn)時(shí),代表查詢深度為1,自上而下每深入一層,查詢深度加1;
具體到本實(shí)例實(shí)施,節(jié)點(diǎn)為根節(jié)點(diǎn),查詢深度為1;
步驟(3).5:根據(jù)步驟(3).4計(jì)算的目前查詢深度判斷是否可以繼續(xù)深入查詢,具體為:
(3).5.1:如果目前的查詢深度小于h,則根據(jù)步驟(3).2中節(jié)點(diǎn)的子節(jié)點(diǎn)索引,讀取包含查詢范圍開(kāi)始時(shí)刻的子節(jié)點(diǎn)作為根節(jié)點(diǎn),跳至步驟(3).2;
(3).5.2:如果目前的查詢深度大于等于h,則返回步驟(3).2中的節(jié)點(diǎn),然后跳至步驟(4);
具體到本實(shí)例實(shí)施,目前查詢深度為1小于h=2,可以繼續(xù)查找,根據(jù)孩子節(jié)點(diǎn)的索引,讀取的孩子節(jié)點(diǎn)把作為根節(jié)點(diǎn)繼續(xù)按照步驟(3).2查詢;步驟同上,經(jīng)過(guò)步驟(3).2和步驟(3).3的判斷,符合查詢要求,將返回;
步驟(4):根據(jù)包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),將滿足查詢范圍要求的所有節(jié)點(diǎn)加入查詢結(jié)果數(shù)組中,并輸出查詢結(jié)果數(shù)組,具體為:
步驟(4).1:讀取包含查詢范圍的開(kāi)始時(shí)刻的節(jié)點(diǎn),并更新當(dāng)前節(jié)點(diǎn)為此節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,將記為當(dāng)前節(jié)點(diǎn);
步驟(4).2:判斷當(dāng)前節(jié)點(diǎn)是否滿足查詢范圍,把滿足查詢范圍要求的節(jié)點(diǎn)加入查詢結(jié)果數(shù)組中;
(4).2.1:如果當(dāng)前節(jié)點(diǎn)的結(jié)束時(shí)間時(shí)刻,小于查詢范圍的結(jié)束時(shí)刻Qe,將當(dāng)前節(jié)點(diǎn)加入查詢結(jié)果數(shù)組R中,并讀取當(dāng)前節(jié)點(diǎn)的右指針指向的節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),然后繼續(xù)步驟(4).2;
(4).2.2:如果當(dāng)前節(jié)點(diǎn)的結(jié)束時(shí)刻大于等于查詢范圍的結(jié)束時(shí)刻,將當(dāng)前節(jié)點(diǎn)加入查詢結(jié)果數(shù)組R中,結(jié)束查詢,繼續(xù)執(zhí)行步驟(5);
其中,滿足查詢范圍要求是指節(jié)點(diǎn)開(kāi)始時(shí)刻和結(jié)束時(shí)刻之間覆蓋的時(shí)間范圍和查詢范圍的開(kāi)始時(shí)刻和查詢范圍的結(jié)束時(shí)刻之間覆蓋的時(shí)間范圍存在交集;
具體到本實(shí)例實(shí)施,節(jié)點(diǎn)的結(jié)束時(shí)刻小于查詢范圍的結(jié)束時(shí)刻20,因此把賦值給R[0],根據(jù)R[0]的右指針,讀取第二層中間節(jié)點(diǎn)的第二個(gè)節(jié)點(diǎn),記為作為當(dāng)前節(jié)點(diǎn)繼續(xù)步驟(4).2,經(jīng)過(guò)步驟(4).2的判斷,的結(jié)束時(shí)間大于查詢結(jié)束時(shí)間20,因此將賦值給R[1],繼續(xù)執(zhí)行步驟(5);
步驟(5):將查詢結(jié)果數(shù)組中的數(shù)據(jù)展示出來(lái);
具體到本實(shí)例實(shí)施,按照下面的流程執(zhí)行:
步驟(5).1:判斷查詢結(jié)果數(shù)組R是否有更新,并根據(jù)判斷結(jié)果決定是否進(jìn)行可視化展現(xiàn):
(5).1.1:若查詢結(jié)果數(shù)組R上存在更新,跳至步驟(5).2;
(5).1.2:若查詢結(jié)果數(shù)組R上不存在更新,跳至步驟(6);
具體到本實(shí)例實(shí)施,R上存在更新,繼續(xù)步驟(5).2;
步驟(5).2:判斷查詢結(jié)果數(shù)組R中第一個(gè)節(jié)點(diǎn)R[0]的開(kāi)始時(shí)刻與查詢范圍的開(kāi)始時(shí)刻是否一致,更新不一致情況下查詢結(jié)果數(shù)組R中第一個(gè)節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值;
(5).2.1:如果判斷結(jié)果一致,則跳至步驟(5).3;
(5).2.2:若判斷結(jié)果不一致,即R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻小于查詢范圍的開(kāi)始時(shí)刻Qs,則以R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,再根據(jù)擬合后的直線求出查詢范圍開(kāi)始時(shí)刻對(duì)應(yīng)的值,用查詢范圍的開(kāi)始時(shí)刻和計(jì)算出查詢范圍開(kāi)始時(shí)刻的值替換R[0]節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,然后,繼續(xù)步驟(5).3;
在本實(shí)例實(shí)施中,R[0]從開(kāi)始時(shí)刻為1,而查詢開(kāi)始時(shí)刻為10,不一致,則以R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),R[0]節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,計(jì)算出直線的函數(shù)表達(dá)式,記為Fs(t),表示為公式(1):
Fs(t)=0.1777t+9.4723(1)
其中t表示時(shí)刻,是從1到14的整數(shù)。通過(guò)公式(1)可以得到開(kāi)始的時(shí)刻的值Fs(10)=11.25,將10和11.25替換R[0]節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,然后繼續(xù)步驟(5).3;
步驟(5).3:判斷查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻是否與查詢范圍的結(jié)束時(shí)刻是否一致,更新不一致情況下查詢結(jié)果數(shù)組R中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻和結(jié)束時(shí)刻的值;
(5).3.1:如果判斷結(jié)果一致,則跳至步驟(5).4;
(5).3.2:如果查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻大于查詢的結(jié)束時(shí)刻Qe,則以查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,根據(jù)擬合后的直線求出查詢范圍的結(jié)束時(shí)刻對(duì)應(yīng)的值,用查詢范圍的結(jié)束時(shí)刻和計(jì)算出查詢范圍結(jié)束時(shí)刻的值替換查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)的結(jié)束時(shí)刻和結(jié)束時(shí)刻的值,然后繼續(xù)步驟(5).4;
在本實(shí)例實(shí)施中,R[1]結(jié)束時(shí)刻為29,而查詢結(jié)束時(shí)刻為20,不一致,則需要按照R[1]的開(kāi)始時(shí)刻和結(jié)束時(shí)刻的值為橫坐標(biāo),查詢結(jié)果數(shù)組中最后一個(gè)節(jié)點(diǎn)開(kāi)始時(shí)刻的值和結(jié)束時(shí)刻的值為縱坐標(biāo),利用這兩點(diǎn)擬合為一條直線,計(jì)算出直線的函數(shù)表達(dá)式,記為Fe(t),表示為公式(2):
Fe(t)=-0.047t+11.965(2)
其中t表示時(shí)刻,是從15到29的整數(shù)。通過(guò)公式(2)可以得到結(jié)束的時(shí)刻的值Fe(20)=10.39,將20和10.39替換R[1]節(jié)點(diǎn)的開(kāi)始時(shí)刻和開(kāi)始時(shí)刻的值,然后,繼續(xù)步驟(5).4;
步驟(5).4:以時(shí)間作為橫坐標(biāo),以對(duì)應(yīng)的值作為縱坐標(biāo),建立直角坐標(biāo)系,將查詢結(jié)果數(shù)組R中所有節(jié)點(diǎn)的開(kāi)始時(shí)刻和結(jié)束時(shí)刻對(duì)應(yīng)的點(diǎn),用直線相連,可視化展現(xiàn)出來(lái);
在本實(shí)例實(shí)施中,可視化時(shí)以時(shí)間作為橫軸,對(duì)應(yīng)的值作為縱軸,建立坐標(biāo)系,將節(jié)點(diǎn)對(duì)應(yīng)的點(diǎn)用直線相連;查詢結(jié)果數(shù)組中目前對(duì)應(yīng)的4個(gè)點(diǎn)的坐標(biāo)分別是(10,11.25)、(14,11.96)、(15,11.26)、(20,10.39),其中每個(gè)坐標(biāo)第一個(gè)值對(duì)應(yīng)橫軸,第二個(gè)值對(duì)應(yīng)縱軸;
步驟(6):依次遍歷查詢結(jié)果數(shù)組中的每一個(gè)節(jié)點(diǎn),判斷查詢結(jié)果數(shù)組中是否有不滿足查詢誤差要求需要細(xì)化查詢的節(jié)點(diǎn),返回不滿足查詢誤差要求的節(jié)點(diǎn)和細(xì)化查詢的查詢語(yǔ)句;
具體到本實(shí)例實(shí)施,按照下面的流程執(zhí)行:
步驟(6).1:順序讀取查詢結(jié)果數(shù)組R中的一個(gè)節(jié)點(diǎn),判斷讀取到的節(jié)點(diǎn)擬合誤差和查詢誤差的關(guān)系,返回不滿足查詢誤差要求的節(jié)點(diǎn)和細(xì)化查詢的查詢語(yǔ)句;
(6).1.1:如果讀取到的節(jié)點(diǎn)的擬合誤差大于查詢誤差Qerror,則重新構(gòu)造查詢語(yǔ)句q,如果此次讀取到的節(jié)點(diǎn)的開(kāi)始時(shí)刻比查詢范圍的開(kāi)始時(shí)刻Qs小,查詢語(yǔ)句q的查詢范圍的開(kāi)始時(shí)刻Qs不變,否則q的查詢范圍的開(kāi)始時(shí)刻Qs設(shè)置為此次讀取到的節(jié)點(diǎn)的開(kāi)始時(shí)刻;如果此次讀取到的節(jié)點(diǎn)的結(jié)束時(shí)刻比查詢語(yǔ)句q查詢范圍的結(jié)束時(shí)刻Qe大,則q的查詢范圍的結(jié)束時(shí)刻Qe不變,否則q的查詢范圍的結(jié)束時(shí)刻Qe設(shè)置為此次讀取到的節(jié)點(diǎn)的結(jié)束時(shí)刻;查詢誤差Qerror保持不變;然后返回此次讀取到的節(jié)點(diǎn)和查詢語(yǔ)句q,跳轉(zhuǎn)至步驟(7);
(6).1.2:如果讀取到的節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,且不是最后一個(gè)節(jié)點(diǎn),繼續(xù)步驟(6).1;如果讀取到的節(jié)點(diǎn)的擬合誤差小于等于查詢誤差Qerror,且是最后一個(gè)節(jié)點(diǎn),跳轉(zhuǎn)到步驟(6).2;
具體到本實(shí)例實(shí)施,查詢結(jié)果數(shù)組R中第一個(gè)節(jié)點(diǎn)擬合誤差小于等于0.02,第二個(gè)節(jié)點(diǎn)R[1]擬合誤差為0.07大于0.02,所以遍歷到第二個(gè)節(jié)點(diǎn)時(shí),重新構(gòu)造查詢語(yǔ)句q=select*from dateset where time>15 and time<20 and error<0.02,將和q返回,繼續(xù)步驟(7);
步驟(7):根據(jù)步驟(6)中返回的節(jié)點(diǎn)和查詢語(yǔ)句,進(jìn)行細(xì)化查詢并更新查詢結(jié)果數(shù)組;
具體到本實(shí)例實(shí)施,按照下面的流程執(zhí)行:
步驟(7).1:在步驟(2)讀入內(nèi)存的樹(shù)狀索引結(jié)構(gòu)中,找到步驟(6)中返回的節(jié)點(diǎn)并根據(jù)找到節(jié)點(diǎn)的子節(jié)點(diǎn)索引,讀取包含q中查詢范圍開(kāi)始時(shí)刻的子節(jié)點(diǎn);
具體到本實(shí)例實(shí)施,根據(jù)的子節(jié)點(diǎn)索引查找包含查詢范圍開(kāi)始時(shí)刻的子節(jié)點(diǎn)是
步驟(7).2:判斷讀取到的子節(jié)點(diǎn)的擬合誤差是否滿足查詢誤差要求,并根據(jù)判斷結(jié)果進(jìn)行如下操作:
(7).2.1:如果子節(jié)點(diǎn)的擬合誤差小于等于查詢語(yǔ)句q中查詢誤差Qerror,初始化一個(gè)結(jié)果緩沖區(qū),暫時(shí)保存讀取到的子節(jié)點(diǎn),按照子節(jié)點(diǎn)的右指針連續(xù)讀取查詢語(yǔ)句q查找范圍內(nèi)包含的所有節(jié)點(diǎn),依次放入結(jié)果緩沖區(qū)中,然后跳轉(zhuǎn)至步驟(7).3;
(7).2.2:如果子節(jié)點(diǎn)的擬合誤差大于查詢語(yǔ)句q中查詢誤差Qerror,將當(dāng)前讀取到的子節(jié)點(diǎn)當(dāng)作步驟(6)返回的節(jié)點(diǎn),跳轉(zhuǎn)至步驟(7).1;
具體到本實(shí)例實(shí)施,的擬合誤差小于等于0.02,因此初始化一個(gè)結(jié)果緩沖區(qū),按照子節(jié)點(diǎn)的右指針連續(xù)讀取15到20范圍內(nèi)的和并保存到結(jié)果緩沖區(qū);
步驟(7).3:將查詢結(jié)果數(shù)組R中步驟(6)返回的節(jié)點(diǎn)用結(jié)果緩沖區(qū)的節(jié)點(diǎn)替換,更新查詢結(jié)果數(shù)組R,然后跳轉(zhuǎn)到步驟(5);
具體到本實(shí)例實(shí)施,將R中節(jié)點(diǎn)用和節(jié)點(diǎn)替換,然后跳轉(zhuǎn)至步驟(5),按照步驟(5)再次執(zhí)行,此時(shí)查詢結(jié)果數(shù)組R對(duì)應(yīng)的可視化的6個(gè)點(diǎn)的坐標(biāo)分別是(10,11.25)、(14,11.96)、(15,11.58)、(18,10.87)、(19,11.06)、(20,10.99),經(jīng)過(guò)步驟(6)判斷,每個(gè)節(jié)點(diǎn)都滿足查詢誤差要求,結(jié)束查詢。
至此,從步驟(2)到(7)完成了本實(shí)例一種自適應(yīng)的時(shí)間序列數(shù)據(jù)可視化查詢算法中增量式查詢過(guò)程。
由本實(shí)例實(shí)施的查詢可視化流程可以看出本發(fā)明可以確保在用戶要求的時(shí)間延遲前,返回一個(gè)可視化結(jié)果,保證了查詢的效率,而且在展現(xiàn)可視化結(jié)果時(shí),采用了漸進(jìn)式不斷細(xì)化的方式,保證了展示結(jié)果的精度,同時(shí)與返回查詢時(shí)間范圍內(nèi)所有的原始數(shù)據(jù)相比,本方法只返回節(jié)點(diǎn)數(shù)據(jù),數(shù)據(jù)量小,尤其是在查詢時(shí)間范圍比較大的查詢時(shí),效果更加明顯。
實(shí)施例4
將實(shí)施例1中的股票數(shù)據(jù)改成網(wǎng)絡(luò)流量數(shù)據(jù),交通路口通過(guò)車(chē)輛數(shù)據(jù)等其他任意類型的時(shí)間序列數(shù)據(jù),本發(fā)明所提出的自適應(yīng)的時(shí)間序列數(shù)據(jù)可視化方法仍然有效。
上述實(shí)施方式未述及的有關(guān)技術(shù)采用或借鑒已有的技術(shù)即可實(shí)現(xiàn)。
以上所述為本發(fā)明的較佳實(shí)施例而已,本發(fā)明不應(yīng)該局限于該實(shí)施例和附圖所公開(kāi)的內(nèi)容。凡是不脫離本發(fā)明所公開(kāi)的精神下完成的等效或修改,都落入本發(fā)明保護(hù)的范圍。