• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    二叉樹隊列關(guān)系問題非遞歸算法的推導(dǎo)及形式化證明

    2022-05-27 10:01:30左正康黃志鵬王昌晶
    關(guān)鍵詞:二叉樹結(jié)點(diǎn)隊列

    左正康,方 越,黃志鵬,黃 箐,王昌晶

    (江西師范大學(xué)計算機(jī)信息工程學(xué)院,江西 南昌 330022)

    0 引言

    二叉樹是在計算機(jī)科學(xué)中一種經(jīng)典的非線性數(shù)據(jù)結(jié)構(gòu),它不僅能夠提供有規(guī)律的數(shù)據(jù)存儲還能支持強(qiáng)大的搜索算法.二叉樹遞歸算法簡單、易理解,但它需要更多的運(yùn)行時間和存儲空間;而非遞歸算法的效率要遠(yuǎn)高于遞歸算法,因此二叉樹非遞歸算法的推導(dǎo)及形式化證明具有重要的價值.通過分析被求解二叉樹問題的背景知識和相關(guān)數(shù)學(xué)特性,對二叉樹類問題進(jìn)行分劃,確定二叉樹可以用2種方式來求解序列的遞推關(guān)系:棧和隊列.本文給出了二叉樹隊列關(guān)系問題推導(dǎo)和形式化證明策略,結(jié)合具有隊列遞推關(guān)系(簡稱“隊列關(guān)系”)的這一類問題來驗(yàn)證策略的正確性和實(shí)用性.由于二叉樹非遞歸算法的代碼復(fù)雜、難以理解,而且證明過程晦澀難懂,正確性得不到保證[1],因此如何推導(dǎo)及形式化證明二叉樹隊列關(guān)系問題非遞歸算法成為一大難點(diǎn).

    開發(fā)二叉樹非遞歸算法的循環(huán)不變式一直是形式化開發(fā)的難點(diǎn)[2],循環(huán)不變式是理解、推導(dǎo)和證明循環(huán)程序的基礎(chǔ)[3-4].文獻(xiàn)[5-6]提供了前序遍歷二叉樹非遞歸算法的循環(huán)不變式,但是表達(dá)十分煩瑣,邏輯關(guān)系較為復(fù)雜,沒有很好的可行性和實(shí)用性.本文通過開發(fā)眾多二叉樹隊列關(guān)系問題非遞歸算法的循環(huán)不變式,發(fā)現(xiàn)循環(huán)不變式之間的共性和特性.由此,提出了開發(fā)二叉樹隊列關(guān)系問題循環(huán)不變式的3種策略和二叉樹隊列關(guān)系問題通用循環(huán)不變式的模板.

    本文通過推導(dǎo)3類派生問題為代表,分別是基于層次遍歷二叉樹派生出的問題、基于求二叉樹深度派生出的問題以及基于層次遍歷二叉樹和求二叉樹深度共同派生出的問題,得到遞推關(guān)系表達(dá)式和循環(huán)不變式,由此導(dǎo)出抽象程序設(shè)計語言Apla(Abstract Programming Language)[2,4,7]程序,極大地提高了算法的開發(fā)效率;然后,用Dijkstra-Gries標(biāo)準(zhǔn)程序證明方法證明了這些算法的正確性;最后通過“Apla到C++程序自動生成系統(tǒng)”自動生成可執(zhí)行程序[8].

    1 相關(guān)工作

    開發(fā)正確的算法程序是計算機(jī)科學(xué)的核心.通常人們是針對已編好的程序來測試驗(yàn)證該程序是否正確,盡可能地找出程序的漏洞,但是該方法無法從根本上保證算法程序的正確性.于是,出現(xiàn)了越來越多的形式化推導(dǎo)方法,將待解決問題精確地描述出來,再根據(jù)各方法的形式化規(guī)則進(jìn)行推理,最終得出正確的結(jié)構(gòu)化程序[9].目前,存在著大量的形式化推導(dǎo)方法,其中E. W. Djkstra[6]提出的最弱前置謂詞方法wp(Q,R)是程序求解變換的經(jīng)典方法之一.給出程序規(guī)約,并將驗(yàn)證程序正確性的理論融入開發(fā)過程中,在開發(fā)過程中保證了程序的正確性.該方法自動化程度低,對于復(fù)雜的算法難以進(jìn)行推導(dǎo).D.L. Chaudhari等[10]提出的推導(dǎo)方法是在最弱謂詞方法的基礎(chǔ)上,將后置斷言不斷拆分,直至開發(fā)出循環(huán)不變式,但該方法在處理復(fù)雜問題上還是存在著較大的困難.D.G. Kourie等[11]提出了一種結(jié)合Dijkstra的GCL和Morgan的細(xì)化演算規(guī)則的方法,依靠經(jīng)驗(yàn)推測循環(huán)不變式,這導(dǎo)致在推導(dǎo)過程中非常依賴循環(huán)不變式,存在很大的不確定性.D.L. Chaudhari等[12]無縫地將自下而上的技術(shù)結(jié)合到自上而下的推導(dǎo)方法中,以此避免不必要的回溯和相關(guān)的返工,提出了新的推導(dǎo)策略,以捕捉在自上而下階段中所做的假設(shè),并隨后將這些假設(shè)反向傳播到適當(dāng)?shù)某绦蛭恢?并在 CAPS 系統(tǒng)中實(shí)現(xiàn)了這種方法.

    開發(fā)正確迭代程序的關(guān)鍵是循環(huán)不變式,這已經(jīng)被程序設(shè)計和形式化方法方面的專家所認(rèn)可,循環(huán)不變式是程序設(shè)計理論中的一個重要概念,在形式化證明中承擔(dān)著至關(guān)重要的作用[13].循環(huán)不變式不僅可以用來分析程序的性質(zhì),而且可以用來證明循環(huán)程序的正確性,但是開發(fā)循環(huán)不變式的標(biāo)準(zhǔn)策略僅僅適用于一些簡單的算法程序,對于復(fù)雜的算法程序仍無較好的辦法.T. Hoare認(rèn)為循環(huán)不變式不能通過簡單的規(guī)則計算來驗(yàn)證.為了獲得適當(dāng)?shù)难h(huán)不變式,通常需要人工干預(yù)才能完成.目前只能針對特定的情況提出了一些啟發(fā)式的方法,沒有一種通用的方法可以對所有的情況得到正確的結(jié)果[14].一般來說,對于一個給定函數(shù)的前置斷言和后置斷言,循環(huán)不變式并不是唯一的,開發(fā)者往往會逐步得到循環(huán)不變式:首先猜測出粗略的循環(huán)不變式,然后通過觀察程序的行為逐步精化循環(huán)不變式,最后證明需要的信息是否正確[15].開發(fā)循環(huán)不變式一般的方法是假定程序中的變量在無限范圍上求值.然而,變量在程序執(zhí)行過程中由有限長度的位向量表示.在無限范圍上的循環(huán)不變量式可能不再是在有限范圍程序中的循環(huán)不變量式,反之也是如此[16].采用消元法對程序進(jìn)行驗(yàn)證[17],可生成非線性循環(huán)不變式,并判定循環(huán)程序的終止性,如基于Dixon結(jié)式.M.D. Ernst等[18]提出了循環(huán)不變式的動態(tài)探測技術(shù),并設(shè)計了動態(tài)監(jiān)測器來實(shí)現(xiàn)此技術(shù).

    二叉樹是計算機(jī)科學(xué)中一種經(jīng)典的非線性數(shù)據(jù)結(jié)構(gòu),有強(qiáng)大的功能和效率,因此二叉樹的推導(dǎo)和形式化證明具有非常重要的意義.D. Gries[5]對E.W. Dijkstra[6]提出的構(gòu)造循環(huán)不變式開發(fā)策略進(jìn)行了補(bǔ)充和解釋,提供了前序遍歷二叉樹非遞歸算法的循環(huán)不變式.在二叉樹非遞歸算法的形式化驗(yàn)證上,秦勝潮等[19]用HIP/SLEEK形式化驗(yàn)證了AVL樹和二叉搜索樹.

    目前,二叉樹的推導(dǎo)是基于最弱前置謂詞方法,其推導(dǎo)過程煩瑣,循環(huán)不變式較為復(fù)雜.本文提出的推導(dǎo)方法是基于嚴(yán)格的數(shù)理邏輯,對原算法程序規(guī)約進(jìn)行了一系列的求精變換步驟.每一步都減少了一定的抽象程度或增加了一定的程序可執(zhí)行性,大大降低了在算法求精過程中的創(chuàng)造性工作.并且,開發(fā)循環(huán)不變式的策略是一種基于遞歸定義技術(shù)來開發(fā)具有固有遞歸性質(zhì)的迭代程序的循環(huán)不變式,提高了開發(fā)效率.

    2 二叉樹隊列關(guān)系問題推導(dǎo)及形式化證明策略

    2.1 求解步驟

    對二叉樹類問題進(jìn)行分劃,尋找遞推關(guān)系.關(guān)于求解序列的遞推關(guān)系為隊列的這類問題,通過推導(dǎo)及形式化證明,總結(jié)出如下7個步驟:

    (i)構(gòu)造算法程序規(guī)約.構(gòu)造形式化規(guī)約來明確二叉樹隊列關(guān)系問題的任務(wù)目標(biāo),程序規(guī)約是由程序的前置斷言(AQ)和后置斷言(AR)構(gòu)成.對于二叉樹隊列關(guān)系問題的非遞歸算法,前置斷言均為給定1個有限的二叉樹T;后置斷言根據(jù)求解問題的定義和實(shí)現(xiàn)的功能以形式化語言描述程序達(dá)到所要的目的.雖然后置斷言只有1個,但是為了供后續(xù)更容易地推導(dǎo)算法,可以分劃出求解問題的關(guān)鍵功能,對這部分功能構(gòu)造出新的形式化規(guī)約.

    (ii)分劃原問題.二叉樹隊列關(guān)系問題的算法或遞推關(guān)系均由分劃決定,不同的算法會有不同的分劃,可以從步驟(i)中形式規(guī)約得到分劃二叉樹隊列關(guān)系問題的啟示:劃分二叉樹,得到一定數(shù)量的子樹,子樹需滿足結(jié)構(gòu)與原二叉樹相同但規(guī)模比原二叉樹更小的特征,再把子樹進(jìn)行相同方式劃分,直到求解出每一個子樹.

    (iii)尋找遞推關(guān)系.通過分析二叉樹問題的背景知識和數(shù)學(xué)特性,確定其求解序列的遞推關(guān)系和所需的全部循環(huán)變量,用謂詞精確表達(dá)它們的變化規(guī)律.二叉樹擁有2種求解序列的遞推關(guān)系:棧和隊列.

    對于隊列,可以看成是一個序列q[0…#q-1],并規(guī)定q[0]端為隊頭,q[#q-1]為隊尾,則隊列的常用操作可以用如下序列的操作加以實(shí)現(xiàn):

    (a)測試隊列是否為空,即#q=0;

    (b)引用隊列頭元素,即X:=q[0];

    (c)對隊列q實(shí)施進(jìn)隊,即q:=q↑[X];

    (d)對隊列q實(shí)施出隊,即q:=q[1…].

    將隊列及其運(yùn)算封裝在一起構(gòu)成抽象數(shù)據(jù)類型,用量詞轉(zhuǎn)換法推導(dǎo)出隊列問題求解序列的遞推關(guān)系Si=F(Sj),Si是其子解Sj的函數(shù),其中1

    (iv)構(gòu)造循環(huán)不變式.通過步驟(iii)構(gòu)造的遞推關(guān)系表達(dá)式,采用本文提出的開發(fā)二叉樹隊列關(guān)系問題循環(huán)不變式的策略,使用循環(huán)不變式遞歸定義技術(shù),并結(jié)合二叉樹隊列關(guān)系問題通用循環(huán)不變式模板,根據(jù)不同問題的特性和要求,以此開發(fā)該問題的循環(huán)不變式.

    (v)導(dǎo)出非遞歸算法Apla程序.依據(jù)步驟(iii)統(tǒng)一的遞推關(guān)系和步驟(iv)統(tǒng)一的循環(huán)不變式,推導(dǎo)出二叉樹隊列關(guān)系問題的Apla算法程序.

    (vi)形式化證明.通過Dijkstra-Gries標(biāo)準(zhǔn)程序證明法證明Apla算法程序的正確性.

    (vii)生成C++程序.通過“Apla到C++程序自動生成系統(tǒng)”自動生成C++可執(zhí)行程序.

    2.2 改進(jìn)循環(huán)不變式

    E.W. Dijkstra和D. Gries給出了4個循環(huán)不變式的傳統(tǒng)開發(fā)策略[20],D. Gries對其進(jìn)行了解釋和補(bǔ)充,開發(fā)了前序遍歷二叉樹非遞歸算法的循環(huán)不變式[5-6]:

    ρ:0≤c≤#p∧fpreorder(p)=b[0:c-1]|fpreorder(r0)|fpreporder(r1)…|fpreorder(rr-1).

    觀察該循環(huán)不變式,看出此循環(huán)不變式用“…”表示顯得冗長、不易理解.于是,使用循環(huán)不變式的遞歸定義技術(shù),重新對前序遍歷二叉樹非遞歸算法的循環(huán)不變式進(jìn)行開發(fā)[4]:

    ρ:HPre(T)=X↑HPre(q)↑F(S),

    該循環(huán)不變式引進(jìn)了3個輔助變量:X,S,q.其中X存放已遍歷的結(jié)點(diǎn)序列;S是起堆棧作用的變量,用于存放尚待遍歷的T的右子樹;q用于存放正準(zhǔn)備遍歷的T的子樹.

    比較以上2個循環(huán)不變式,可以很清晰地發(fā)現(xiàn)本文的循環(huán)不變式更簡單、精確.因此,以文獻(xiàn)[21-22]提出的開發(fā)循環(huán)不變式的新定義和新的開發(fā)策略為基礎(chǔ),提出了對二叉樹隊列關(guān)系問題開發(fā)循環(huán)不變式的策略.

    先寫出其前置斷言和后置斷言,前置斷言均為“給定一個有限的二叉樹T”,而后置斷言的不同則決定著每個問題是屬于什么輸出類型,再根據(jù)問題的實(shí)現(xiàn)思路,并結(jié)合后置斷言,可將開發(fā)二叉樹隊列關(guān)系問題循環(huán)不變式的策略分為3種.

    策略1輸出結(jié)果為結(jié)點(diǎn)序列的問題.

    通過分析求解問題的特性,確定后置斷言為X=算法F(T)形式,以表明輸出結(jié)果為結(jié)點(diǎn)序列.通過分劃遞推,尋找序列變量和隊列存放待求解子問題的變化規(guī)律,以此推導(dǎo)出遞推關(guān)系,并確定循環(huán)變量,采用遞歸定義技術(shù)定義序列變量和隊列中的內(nèi)容,即構(gòu)成所需的循環(huán)不變式.

    策略2輸出結(jié)果為固定值的問題.

    根據(jù)求解問題的定義和實(shí)現(xiàn)的功能,確定后置斷言為算法F(T)=固定值,以表明輸出結(jié)果為固定值.通過分劃遞推,尋找能判別待求解子問題的固定值變化規(guī)律是否均滿足求解問題需實(shí)現(xiàn)功能的約束條件的這一規(guī)律,以此推導(dǎo)出遞推關(guān)系,并結(jié)合隊列存放待求解子問題的變化規(guī)律,確定循環(huán)變量,采用遞歸定義技術(shù)定義固定值、序列變量和隊列中元素的組成,即構(gòu)成所需的循環(huán)不變式.

    策略3輸出結(jié)果為屬性判斷的問題.

    根據(jù)求解問題的定義和實(shí)現(xiàn)的功能,確定后置斷言為算法F(T)=對于任一結(jié)點(diǎn)的該問題的屬性判斷均為真,以表明輸出結(jié)果為true或false.通過分劃遞推,尋找待求解子問題的屬性判斷變化規(guī)律是否均滿足求解問題需實(shí)現(xiàn)功能的約束條件的這一規(guī)律,以此推導(dǎo)出遞推關(guān)系,并結(jié)合隊列存放待求解子問題的變化規(guī)律,確定循環(huán)變量,再采用遞歸定義技術(shù)定義屬性判斷、序列變量和隊列中元素的組成,即構(gòu)成所需的循環(huán)不變式.

    2.3 二叉樹隊列關(guān)系問題通用循環(huán)不變式模板

    在推導(dǎo)出眾多二叉樹隊列關(guān)系問題得出的循環(huán)不變式過程中,發(fā)現(xiàn)每個問題的循環(huán)不變式都存在共性.因此,構(gòu)造一個二叉樹隊列關(guān)系問題通用循環(huán)不變式模板,供后續(xù)開發(fā)更多的二叉樹隊列關(guān)系問題.該模板形式為

    ρ:HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧P(x),

    其中HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])為層次遍歷二叉樹的循環(huán)不變式.序列變量X用于存放已訪問的結(jié)點(diǎn)標(biāo)志序列,當(dāng)有限二叉樹遍歷結(jié)束時,X=HLay(T);S為隊列,用來存放待訪問的頂點(diǎn);h為序列頭的域名;q用于存放正在訪問的頂點(diǎn).在隊列S中的首元素為即將訪問的頂點(diǎn),且在被訪問后,該頂點(diǎn)的未被遍歷的相鄰頂點(diǎn)要作為待訪問頂點(diǎn)進(jìn)入隊列.所以S中的內(nèi)容由函數(shù)F定義為

    F([])=[],

    (1)

    F(S)=[S.h]↑F(S[h+1..t]↑[S[h].l]↑

    [S[h].r]);

    (2)

    當(dāng)q未訪問時,

    F([q↑S])=[q.d]↑F(S↑[q.l]↑[q.r]),

    (3)

    當(dāng)q已訪問時,

    F([q↑S])=F(S).

    (4)

    P(x)是指根據(jù)不同問題的特性和要求,合取滿足條件的斷言.

    2.4 預(yù)定義ADT

    抽象程序設(shè)計語言Apla[4]提供了序列(list)和二叉樹(btree)預(yù)定義的ADT類型,下面給出本文中所用的序列和二叉樹ADT相關(guān)數(shù)據(jù)和操作說明.

    2.4.1 序列 關(guān)于序列的定義和操作如下:

    varh,t:integer:=0,0;//t表示序列尾的域名;

    varS,T:list:=[],[];//S和T為序列;

    X:data;i,j:integer;//X是序列中的元素;

    []//序列為空;

    [X]//序列中有一個元素X;

    #(S)//計算S中元素的個數(shù);

    S[i]//S的第i個元素,S.h≤i≤S.t;

    S[i..j]//S的子序列,S.h≤i,j≤S.t;

    S↑T//S的尾和T的頭用“↑”運(yùn)算合成一個新序列.

    2.4.2 二叉樹 關(guān)于二叉樹的定義和操作如下:

    T.d//產(chǎn)生二叉樹T的根結(jié)點(diǎn);

    T.l//產(chǎn)生二叉樹T的左子樹;

    T.r//產(chǎn)生二叉樹T的右子樹;

    n+T//把結(jié)點(diǎn)n加到T中,使T成為和T結(jié)構(gòu)相同的新樹;

    ReadNode(n)//建立結(jié)點(diǎn)n;

    WriteNode(n)//輸出結(jié)點(diǎn)n.

    2.5 二叉樹隊列關(guān)系問題的3類派生問題

    通過深入研究大量二叉樹隊列關(guān)系問題非遞歸算法,思考各個問題的思想和數(shù)據(jù)結(jié)構(gòu)特性,尋找它們的共性和特性,發(fā)現(xiàn)很多算法可以在實(shí)現(xiàn)母算法功能的同時增添符合該問題的功能實(shí)現(xiàn)條件,以此最終實(shí)現(xiàn)該問題.因此,將層次遍歷二叉樹和求二叉樹深度作為母算法,將二叉樹隊列關(guān)系問題分為3類派生問題(見圖1).

    (i)基于層次遍歷二叉樹派生出的問題:以判斷完滿二叉樹為例.在層次遍歷二叉樹的同時判斷當(dāng)前結(jié)點(diǎn)有幾個孩子,若有2個或0個則繼續(xù)判斷隊列中的下一個結(jié)點(diǎn);若有1個則不是完滿二叉樹.直至層次遍歷完所有結(jié)點(diǎn),若所有節(jié)點(diǎn)均滿足條件,則該二叉樹為完滿二叉樹.

    (ii)基于求二叉樹深度派生出的問題:以判斷一顆具有xsize個結(jié)點(diǎn)二叉樹是否為滿二叉樹為例.在求出二叉樹深度為xheight后,若滿足2xheight-1=xsize,則是滿二叉樹,否則不是滿二叉樹.

    (iii)基于層次遍歷二叉樹和求二叉樹深度共同派生出的問題:以判斷平衡二叉樹為例.在層次遍歷二叉樹的同時以當(dāng)前結(jié)點(diǎn)作為根結(jié)點(diǎn),通過求二叉樹深度的功能判斷左右子樹的深度之差的絕對值是否小于等于1,若滿足則繼續(xù)判斷隊列中的下一個結(jié)點(diǎn),若不滿足則不是平衡二叉樹.直至層次遍歷完所有結(jié)點(diǎn),若所有節(jié)點(diǎn)均滿足條件,則該二叉樹為平衡二叉樹.

    圖1 3類派生問題

    3 二叉樹隊列關(guān)系問題非遞歸算法推導(dǎo)

    3.1 母算法

    層次遍歷二叉樹和求二叉樹深度對二叉樹隊列關(guān)系問題非遞歸算法的推導(dǎo)起著至關(guān)重要的作用.若2個母算法成功推導(dǎo),則這便于派生問題的推導(dǎo),也有助于更好地發(fā)現(xiàn)3類派生問題循環(huán)不變式的共性和特性.因此,需要先對這2個母算法進(jìn)行推導(dǎo).

    3.1.1 層次遍歷二叉樹 文獻(xiàn)[23]已經(jīng)成功推導(dǎo)出層次遍歷二叉樹非遞歸算法的循環(huán)不變式:

    ρ:HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])

    以及非遞歸算法Apla程序:

    do ┐(q=%)→S,X,q:=S↑[q.l]↑[q.r],X↑[q.d],%;

    [] ┐(S=[])→q,S:=S[h],S[h+1..t];

    od.

    3.1.2 求二叉樹深度 文獻(xiàn)[23]已經(jīng)成功推導(dǎo)出求二叉樹深度非遞歸算法的循環(huán)不變式:

    ρ:h=[(N,n:0≤n:n=#(S))-1]∧HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])

    以及非遞歸算法Apla程序:

    do (num≥1)→q,S:=S[S.h],S[S.h+1..S.t];

    X:=X↑[q.d];

    if (q.l≠%)→S:=S↑[q.l];fi;

    if (q.r≠%)→S:=S↑[q.r];fi;

    n:=n-1;

    [] ┐(q=%)→n,h,q:=#(S),h+1,%;

    od.

    3.2 形式推導(dǎo)實(shí)例

    限于篇幅,本節(jié)以判斷平衡二叉樹為實(shí)例,完整地展現(xiàn)如何基于母算法推導(dǎo)派生問題.

    (i)算法程序規(guī)約.用HLay(T)表示T的層次遍歷產(chǎn)生的結(jié)點(diǎn)序列,存放已訪問的結(jié)點(diǎn)標(biāo)志序列在序列變量X中,X=HLay(T).LDepth(T)表示T的深度.abs() 函數(shù)表示返回數(shù)字的絕對值.用abs(LDepth(q.l)-LDepth(q.r))≤1來判斷當(dāng)前結(jié)點(diǎn)q左右子樹的深度之差的絕對值是否符合判斷條件,若滿足abs(LDepth(q.l)-LDepth(q.r))≤1,則繼續(xù)層次遍歷下一個結(jié)點(diǎn),重復(fù)此操作,直至遍歷結(jié)束.若fBalance(T)=true,則T是平衡二叉樹;若fBalance(T)=false,則T不是平衡二叉樹.即求解問題的算法規(guī)約:

    |[X:list (integer,40);T:btree (integer,40);msize:integer]|;

    AQ:給定一個有限的二叉樹T;

    AR:fBalance(T)=?(a:a∈HLay(T):abs(LDepth(a.l)-LDepth(a.r))≤1).

    創(chuàng)建布爾變量isbalance(a)函數(shù)記錄abs(LDepth(a.l)-LDepth(a.r))≤1的判斷結(jié)果.

    (ii)尋找遞推關(guān)系.根據(jù)判斷完全二叉樹的算法程序規(guī)約,僅需尋找fPerfect(T)的遞推關(guān)系:

    若T=%,則fBalance(T)=true;

    若T≠%,則為了得到一個非遞歸的算法程序,分劃fBalance(T),得到遞推關(guān)系為

    fBalance(T)=(isbalance(T)=true)∧fBalance(T.l)∧fBalance(T.r)=(isbalance(T)=true)∧(isbalance(T.l)=true)∧fBalance(T.l.l)∧fBalance(T.l.r)∧fBalance(T.r)=….

    由以上遞推關(guān)系發(fā)現(xiàn):該過程是通過層次遍歷二叉樹HLay(T)來表示二叉樹T中所有結(jié)點(diǎn)構(gòu)成的一個序列X.在實(shí)現(xiàn)過程中,必須使用隊列S存放待訪問的頂點(diǎn),q用于存放正在訪問的頂點(diǎn),序列變量X用來存放已訪問的結(jié)點(diǎn)標(biāo)志序列,當(dāng)有限二叉樹遍歷結(jié)束時,X=HLay(T).

    (iii)構(gòu)造循環(huán)不變式.由于X存放了層次遍歷后的結(jié)點(diǎn)序列,因此flag的值始終依賴于X中的結(jié)點(diǎn),即有如下性質(zhì)成立:

    flag=?(a:a∈X:isbalance(a)=true).

    因此,上式與HLay(T)的循環(huán)不變式合取即構(gòu)成本問題算法程序的循環(huán)不變式:

    ρ:HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true).

    (iv)非遞歸算法Apla程序.通過遞推關(guān)系(ii)和循環(huán)不變式(iii),簡捷地導(dǎo)出Apla語言過程:

    procedurefBalance(T:btree(integer,40);varX:list(integer,40));

    begin

    X,S,q,flag:=[],[],T,true;

    {ρ:HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true)};

    doflag∧(┐(q=%)∨┐(S=[]))→if (q≠%)∧(isbalance(q)=true)→flag,X,S,q:=true,X↑[q.d],S↑[q.l]↑[q.r],%;

    [] (q≠%)∧(isbalance(q)=false)→flag,X,S,q:=false,X↑[q.d],S↑[q.l]↑[q.r],%;

    [] (q=%)∧┐(S=[])→q,S:=S[S.h],S[S.h+1..S.t];fi;

    od;

    if(flag=true)→ writeln(“是平衡二叉樹”);

    []→writeln(“不是平衡二叉樹”);

    fi;

    end.

    4 二叉樹隊列關(guān)系問題非遞歸算法形式化證明

    Dijkstra-Gries標(biāo)準(zhǔn)程序證明法是形式化證明的重要方法,通過證明{Q}S{R}的正確性,以此來驗(yàn)證算法程序的正確性.S表示語句,Q表示謂詞公式或S的前置斷言,R表示謂詞公式或S的后置斷言.對于二叉樹隊列關(guān)系問題,由于此類問題是循環(huán)語句do的一般形式,所以基于在Dijkstra-Gries標(biāo)準(zhǔn)程序證明法中循環(huán)語句do的證明條件來證明二叉樹隊列關(guān)系問題.本節(jié)以判斷平衡二叉樹為例,詳細(xì)地展現(xiàn)如何形式化證明二叉樹隊列關(guān)系問題.

    (i)證明在執(zhí)行循環(huán)之前ρ是正確的.

    由于斷言中給出的AQ并非do語句中的AQ,而是整個程序的AQ.因此,若為保證do語句執(zhí)行開始迭代之前ρ為真,使得AQ?ρ,則必須保證如下斷言成立:

    語句S0為S,X,q,flag:=[],[],T,true,

    AQ?wp(S0,ρ)≡(HLay(T)=X↑[q.d]↑F(S↑

    HLay(T)=[]↑[T.d]↑F([T.l]↑[T.r])∧true=?(a:a∈X:isbalance(a)=true);

    {使用遞推關(guān)系式(4)}≡true.

    將聲明S0中的3個變量賦值給ρ,顯然實(shí)現(xiàn)AQ?wp(S0,ρ),顯然上述斷言成立.

    (ii)證明ρ是循環(huán)不變式.

    用布爾變量flag記錄fBalance(T)的判斷結(jié)果,可更深地進(jìn)行細(xì)化,便于下面形式化證明:

    ?(a:a∈HLay(T):isbalance(a)=true)→flag=true∨?(a:a∈HLay(T):isbalance(a)=false)→flag=false.

    (a)針對循環(huán)體中的第1個條件子句:

    條件C1為flag∧(┐(q=%)∨┐(S=[]))∧(q≠%)∧(isbalance(q)=true)

    語句S1為flag,X,S,q:=true,X↑[q.d],S↑[q.l]↑[q.r],%;

    [q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true)∧flag∧(┐(q=%)∨┐(S=[]))∧(q≠%)∧(isbalance(q)=true)?HLay(T)=X↑F(S)∧true=?(a:a∈X↑[%]:isbalance(a)=true);

    {使用遞推關(guān)系式(4)}≡true.

    將聲明S1中的3個變量賦值給ρ,實(shí)現(xiàn)ρ∧C1?wp(S1,ρ),顯然第1個條件子句成立.

    (b)針對循環(huán)體中的第2個條件子句:

    條件C2為flag∧(┐(q=%)∨┐(S=[]))∧(q≠%)∧(isbalance(q)=false);

    語句S2為flag,X,S,q:=false,X↑[q.d],S↑[q.l]↑[q.r],%;

    {使用遞推關(guān)系式(3)和遞推關(guān)系式(4)}≡HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true)∧flag∧(┐(q=%)∨┐(S=[]))∧(q≠%)∧(isbalance(q)=false)?HLay(T)=X↑F(S)∧false=?(a:a∈X↑[%]:isbalance(a)=true)≡true.

    將聲明S2中的2個變量賦值給ρ,實(shí)現(xiàn)ρ∧C2?wp(S2,ρ),顯然第2個條件子句成立.

    (c)針對循環(huán)體中的第3條件子句:

    條件C3為flag∧(┐(q=%)∨┐(S=[]))∧(q=%)∧┐(S=[]);

    語句S3為q,S:=S[S.h],S[S.h+1..S.t];

    {使用遞推關(guān)系式(3)和遞推關(guān)系式(4)}≡HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true)∧flag∧(┐(q=%)∨┐(S=[]))∧(q=%)∧┐(S=[])?(HLay(T)=X↑F(S)∧flag=?(a:a∈X:isbalance(a)=true)≡true.

    將聲明S3中的2個變量賦值給ρ,實(shí)現(xiàn)ρ∧C3?wp(S3,ρ),顯然第3個條件子句成立.

    (iii)證明后置斷言R在循環(huán)終止時必須為真.

    ρ∧┐ (flag∧(┐(q=%)∨┐(S=[])))?AR≡ρ∧(┐flag∨((q=%)∧(S=[])))?fbalance(T)=?(a:a∈HLay(T):abs(Ldepth(a.l)-Ldepth(a.r))≤1)≡ρ∧(┐flag∨(flag∧(q=%)∧(S=[])))?fbalance(T)=?(a:a∈HLay(T):abs(Ldepth(a.l)-Ldepth(a.r))≤1)≡HLay(T)=X↑[q.d]↑F(S↑[q.l]↑[q.r])∧flag=?(a:a∈X:isbalance(a)=true)∧(flag∧(q=%)∧(S=[]))?fbalance(T)=?(a:a∈HLay(T):abs(Ldepth(a.l)-Ldepth(a.r))≤1)≡HLay(T)=X∧true=?(a:a∈X:isbalance(a)=true)∧(flag∧(q=%)∧(S=[]))?fbalance(T)=?(a:a∈Lay(T):abs(Ldepth(a.l)-Ldepth(a.r))≤1)≡true∧true=?(a:a∈X:isbalance(a)=true)∧(flag∧(q=%)∧(S=[]))?fbalance(T)=?(a:a∈HLay(T):abs(Ldepth(a.l)-Ldepth(a.r))≤1)≡true.

    (iv)循環(huán)的終止性顯然成立.

    至此, 完成了此程序的正確性證明.

    5 二叉樹隊列關(guān)系問題C++程序的自動生成

    本實(shí)驗(yàn)室研究團(tuán)隊已經(jīng)開發(fā)了一個“Apla到C++程序自動生成系統(tǒng)”[7],可以實(shí)現(xiàn)Apla到C++程序的自動轉(zhuǎn)換,實(shí)現(xiàn)算法程序的機(jī)器無關(guān)性.“Apla到C++程序自動生成系統(tǒng)”總體結(jié)構(gòu)如圖2所示.

    圖2 “Apla到C++程序自動生成系統(tǒng)”總體結(jié)構(gòu)圖

    通過“Apla到C++程序自動生成系統(tǒng)”,可將推導(dǎo)并形式化證明的Apla算法程序作為源語言,自動生成對應(yīng)的C++可執(zhí)行程序[22],本文的實(shí)例均可自動生成對應(yīng)的C++可執(zhí)行程序,以判斷平衡二叉樹為例(見圖3).“Apla到C++程序自動生成系統(tǒng)”集詞法分析、語法分析、語義一致性分析、轉(zhuǎn)換、編譯、運(yùn)行為一體.Apla語言中抽象數(shù)據(jù)的操作均基于簡單數(shù)據(jù)類型及其操作,為了轉(zhuǎn)換一些簡單數(shù)據(jù)類型及其操作,于是,先構(gòu)造了一個簡單的程序轉(zhuǎn)換系統(tǒng),稱為“核心轉(zhuǎn)換器”,然后通過抽象數(shù)據(jù)類型的操作推導(dǎo)得到Apla程序,再用“核心轉(zhuǎn)換器”轉(zhuǎn)換為C++程序,作為相應(yīng)的C++可重用部件庫中的操作,最后通過這種方式C++可重用部件庫的正確性就得到了保證.由此,Apla算法程序自動生成C++程序的正確性也得到了保證,最終實(shí)現(xiàn)了從抽象規(guī)約到具體的可執(zhí)行程序的完整求精過程[9].

    圖3 Apla到C++程序自動生成系統(tǒng)生成判斷平衡二叉樹的C++程序

    圖3代碼為判斷平衡二叉樹非遞歸算法的Apla程序,通過左邊的Apla代碼自動生成對應(yīng)的C++可執(zhí)行程序如下:

    flag=true;

    do {

    if (flag && (!(q.Equa(tempTree0.SetEmpty0))||!(S.Equal(tempList1.SetEmpty0)))) {

    if ((q!tempTree0.SetEmpty0)&&(isbalance(q)==true)){

    flag=true;

    X.Copy(X.Concat(OneitemList(q.Data0)));

    S.Copy(S.Concat(OneitemList(q.Left0).Concat(OneitemList(q.Right0))));

    q.Copy(tempTree0.SetEmpty0);

    }

    else if ((q!=tempTree0.SetEmpty0) && (isbalance(q)==false)) {

    flag=false;

    X.Copy(X.Concat(OneitemList(q.Data0)));

    S.Copy(S.Concat(OneitemList(q.Left0).Concat(OneitemList(q.Right0))));

    q.Copy(tempTree0.SetEmpty0);

    }

    else if ((q.Equal(tempTree0.SetEmpty0)) &&!(S.Equal(tempList1.SetEmpty0))) {

    q.Copy(S.Get(S.h));

    S.Copy(S.Sublist(S.h+1,S.t));

    }

    }

    else.

    輸入10個無序的整數(shù)序列,并將其構(gòu)成二叉排序樹,對二叉排序樹進(jìn)行判斷是否為平衡二叉樹(見圖4).

    圖4 構(gòu)建二叉排序樹

    通過驗(yàn)證,自動生成的C++程序是正確的.“Apla到C++程序自動生成系統(tǒng)”將預(yù)定義的組合數(shù)據(jù)類型(集合、列表、二叉樹、圖、關(guān)系數(shù)據(jù)和其他預(yù)定義的數(shù)據(jù)類型)以ADT的形式進(jìn)行封裝,并且可以用作標(biāo)準(zhǔn)數(shù)據(jù)類型,這極大地提高算法和程序的開發(fā)效率.

    6 結(jié)束語

    本文通過對二叉樹類問題進(jìn)行分劃,尋找遞推關(guān)系,對求解序列的遞推關(guān)系為隊列這類問題,給出推導(dǎo)和形式化證明策略.探索二叉樹隊列關(guān)系問題非遞歸算法的循環(huán)不變式之間的共性和特性,發(fā)現(xiàn)很多二叉樹隊列關(guān)系問題都是可以基于層次遍歷二叉樹和求二叉樹深度這2個算法的功能加以實(shí)現(xiàn),由此,可將二叉樹隊列關(guān)系問題分為3類派生問題.本文對派生問題代表進(jìn)行推導(dǎo),得出遞推關(guān)系表達(dá)式和循環(huán)不變式,由此導(dǎo)出非遞歸Apla算法,再用Dijkstra-Gries標(biāo)準(zhǔn)程序證明法證明算法的正確性,最后使用“Apla到C++程序自動生成系統(tǒng)”自動生成C++可執(zhí)行程序,實(shí)現(xiàn)了從抽象規(guī)約到具體的可執(zhí)行程序的完整求精過程.相比國內(nèi)外現(xiàn)有研究,本文具有如下特點(diǎn):

    1)提出了二叉樹隊列關(guān)系問題非遞歸算法推導(dǎo)及形式化證明策略.主要對3種輸出結(jié)果問題對應(yīng)地提出了3種開發(fā)循環(huán)不變式策略,并根據(jù)循環(huán)不變式之間的共性和特性,構(gòu)造一個二叉樹隊列關(guān)系問題通用循環(huán)不變式模板,使求解二叉樹隊列關(guān)系問題更具有針對性.

    2)成功地推導(dǎo)和形式化證明了一系列二叉樹隊列關(guān)系問題非遞歸算法.在推導(dǎo)過程中,基于層次遍歷二叉樹和求二叉樹深度這2個算法的功能,將推導(dǎo)二叉樹隊列關(guān)系問題分為3類派生問題.這便于派生問題更準(zhǔn)確、更便捷地推導(dǎo)和形式化證明.

    3)使用開發(fā)的“Apla到C++程序自動生成系統(tǒng)”,對原算法程序規(guī)約進(jìn)行了一系列的求精變換步驟.每一步都減少了一定的抽象程度或增加了一定的程序可執(zhí)行性,并最終得到相應(yīng)的C++可執(zhí)行程序.該程序?qū)崿F(xiàn)了從抽象規(guī)約到具體的可執(zhí)行程序的完整求精過程,這極大地提高了算法和程序的開發(fā)效率和可靠性.

    本文的研究提升了開發(fā)共性算法程序的高效性和有效性,對尋找各種二叉樹隊列關(guān)系問題非遞歸算法的循環(huán)不變式指明了新的方向,對非線性數(shù)據(jù)結(jié)構(gòu)算法程序的推導(dǎo)及形式化證明具有指導(dǎo)意義.

    猜你喜歡
    二叉樹結(jié)點(diǎn)隊列
    CSP真題——二叉樹
    電腦報(2022年37期)2022-09-28 05:31:07
    二叉樹創(chuàng)建方法
    隊列里的小秘密
    基于多隊列切換的SDN擁塞控制*
    軟件(2020年3期)2020-04-20 00:58:44
    在隊列里
    Ladyzhenskaya流體力學(xué)方程組的確定模與確定結(jié)點(diǎn)個數(shù)估計
    豐田加速駛?cè)胱詣玉{駛隊列
    一種由層次遍歷和其它遍歷構(gòu)造二叉樹的新算法
    論復(fù)雜二叉樹的初始化算法
    河南科技(2014年24期)2014-02-27 14:20:01
    基于Raspberry PI為結(jié)點(diǎn)的天氣云測量網(wǎng)絡(luò)實(shí)現(xiàn)
    成人漫画全彩无遮挡| 中文字幕av在线有码专区| 亚洲av二区三区四区| 汤姆久久久久久久影院中文字幕 | 国产av不卡久久| 日韩欧美精品免费久久| 欧美高清性xxxxhd video| 国产伦在线观看视频一区| 亚洲激情五月婷婷啪啪| 我要看日韩黄色一级片| 人妻系列 视频| 一级毛片aaaaaa免费看小| 日本黄色视频三级网站网址| 精品午夜福利在线看| 日日摸夜夜添夜夜爱| 女人被狂操c到高潮| 久久久久久久久中文| 麻豆久久精品国产亚洲av| 午夜a级毛片| 天美传媒精品一区二区| 超碰97精品在线观看| 日韩在线高清观看一区二区三区| 亚洲欧美精品专区久久| 嫩草影院新地址| 色视频www国产| 久久久久久久久中文| 国产乱人视频| 亚洲av福利一区| 成人无遮挡网站| 国产精品久久电影中文字幕| 精品不卡国产一区二区三区| 黑人高潮一二区| 男人的好看免费观看在线视频| 亚洲精品一区蜜桃| 日本黄色视频三级网站网址| 床上黄色一级片| 好男人在线观看高清免费视频| 真实男女啪啪啪动态图| 一区二区三区高清视频在线| 综合色av麻豆| 国产单亲对白刺激| 久久久久久久久久久免费av| 七月丁香在线播放| 久久久久网色| 啦啦啦韩国在线观看视频| 国产一级毛片七仙女欲春2| 亚洲精品色激情综合| 国产在视频线精品| 亚洲在线观看片| 日本-黄色视频高清免费观看| av免费在线看不卡| 国产淫片久久久久久久久| 夜夜爽夜夜爽视频| 午夜日本视频在线| 偷拍熟女少妇极品色| 久久精品国产亚洲网站| 国产午夜精品论理片| 亚洲真实伦在线观看| 亚洲最大成人av| 精品无人区乱码1区二区| 国产午夜精品一二区理论片| 熟女电影av网| 2022亚洲国产成人精品| 国产高清有码在线观看视频| 国产精品久久电影中文字幕| 午夜福利在线观看免费完整高清在| 国产精品一及| 成人性生交大片免费视频hd| 91狼人影院| 2021天堂中文幕一二区在线观| 我要看日韩黄色一级片| 亚洲一区高清亚洲精品| 黄色日韩在线| 国产av不卡久久| 午夜爱爱视频在线播放| 91狼人影院| 美女大奶头视频| 一夜夜www| 极品教师在线视频| 夜夜看夜夜爽夜夜摸| 免费不卡的大黄色大毛片视频在线观看 | 免费电影在线观看免费观看| 简卡轻食公司| 精品少妇黑人巨大在线播放 | 免费看a级黄色片| 最近2019中文字幕mv第一页| 波多野结衣巨乳人妻| 亚洲精品日韩在线中文字幕| 免费观看人在逋| 久99久视频精品免费| 国产精品麻豆人妻色哟哟久久 | 日韩人妻高清精品专区| 午夜亚洲福利在线播放| 尤物成人国产欧美一区二区三区| 午夜福利网站1000一区二区三区| 国国产精品蜜臀av免费| 超碰97精品在线观看| 国产探花极品一区二区| 99久久精品热视频| 国产精品一区www在线观看| 国产午夜精品一二区理论片| av国产免费在线观看| 99国产精品一区二区蜜桃av| 国产乱人偷精品视频| 久久精品91蜜桃| 亚洲欧洲日产国产| 国产精品伦人一区二区| 熟女电影av网| 听说在线观看完整版免费高清| 欧美3d第一页| 欧美最新免费一区二区三区| 国产私拍福利视频在线观看| 在线免费观看不下载黄p国产| 国产亚洲精品av在线| 精华霜和精华液先用哪个| 亚洲精品影视一区二区三区av| 国产大屁股一区二区在线视频| 麻豆久久精品国产亚洲av| 国产一区二区亚洲精品在线观看| 欧美成人精品欧美一级黄| 国语自产精品视频在线第100页| 国产成人免费观看mmmm| 最近的中文字幕免费完整| 亚洲无线观看免费| 日日撸夜夜添| 免费在线观看成人毛片| 少妇高潮的动态图| 长腿黑丝高跟| 久久精品久久久久久久性| 岛国毛片在线播放| 久久精品影院6| 秋霞在线观看毛片| 看十八女毛片水多多多| 国产一区二区在线av高清观看| 日韩一区二区三区影片| 免费av不卡在线播放| 国产欧美另类精品又又久久亚洲欧美| 免费黄色在线免费观看| 在线观看66精品国产| 国产男人的电影天堂91| 久久精品国产99精品国产亚洲性色| 久久久久久久久久久免费av| 97在线视频观看| 久久久国产成人精品二区| 国产精品.久久久| 97超视频在线观看视频| 国产精品国产三级国产专区5o | 国产精品嫩草影院av在线观看| 亚洲av中文字字幕乱码综合| 成人国产麻豆网| 亚洲四区av| 国产成人午夜福利电影在线观看| 亚洲国产精品专区欧美| 好男人在线观看高清免费视频| 亚洲国产日韩欧美精品在线观看| 国产私拍福利视频在线观看| 美女高潮的动态| 看十八女毛片水多多多| 淫秽高清视频在线观看| 女的被弄到高潮叫床怎么办| 人妻夜夜爽99麻豆av| 成人漫画全彩无遮挡| 内地一区二区视频在线| 婷婷色麻豆天堂久久 | 日本-黄色视频高清免费观看| 色综合站精品国产| 又爽又黄a免费视频| 在线观看av片永久免费下载| 男女视频在线观看网站免费| 国产激情偷乱视频一区二区| 成人三级黄色视频| 亚洲国产精品成人久久小说| 少妇高潮的动态图| 国产亚洲最大av| 亚洲久久久久久中文字幕| 寂寞人妻少妇视频99o| 中国国产av一级| 九九爱精品视频在线观看| 国产高潮美女av| 亚洲av一区综合| 精品人妻一区二区三区麻豆| 国产午夜精品久久久久久一区二区三区| 91精品伊人久久大香线蕉| 夜夜爽夜夜爽视频| 国产精品av视频在线免费观看| 老司机影院成人| 欧美人与善性xxx| 国产成人免费观看mmmm| 国产乱来视频区| 三级经典国产精品| 偷拍熟女少妇极品色| 日韩欧美国产在线观看| 日本午夜av视频| 大香蕉97超碰在线| 久久久久免费精品人妻一区二区| 亚洲国产欧美在线一区| 内地一区二区视频在线| 日本与韩国留学比较| av国产久精品久网站免费入址| 欧美潮喷喷水| 精品久久久久久电影网 | 少妇被粗大猛烈的视频| 国产真实乱freesex| 黄色一级大片看看| or卡值多少钱| 国产在线一区二区三区精 | 大香蕉97超碰在线| 免费看光身美女| 美女国产视频在线观看| 国产黄色视频一区二区在线观看 | 亚洲欧美日韩高清专用| 一个人看视频在线观看www免费| 美女黄网站色视频| 国产91av在线免费观看| av播播在线观看一区| 最近手机中文字幕大全| 大香蕉久久网| 欧美性猛交黑人性爽| 久久精品国产鲁丝片午夜精品| 亚洲精品亚洲一区二区| 国产亚洲精品久久久com| 精品少妇黑人巨大在线播放 | 欧美激情国产日韩精品一区| 久久久久久久午夜电影| 男女那种视频在线观看| 精品人妻视频免费看| 久久国内精品自在自线图片| 国内精品一区二区在线观看| 欧美性猛交╳xxx乱大交人| 老师上课跳d突然被开到最大视频| 午夜福利在线在线| 久久久久网色| 亚洲中文字幕日韩| 少妇猛男粗大的猛烈进出视频 | 老女人水多毛片| 黄片无遮挡物在线观看| 在现免费观看毛片| 国产高清不卡午夜福利| 我要看日韩黄色一级片| 久久精品国产亚洲av涩爱| 亚州av有码| 免费看日本二区| 国产精品综合久久久久久久免费| 最后的刺客免费高清国语| 色5月婷婷丁香| 亚洲av福利一区| 国产91av在线免费观看| 久久99精品国语久久久| 最近2019中文字幕mv第一页| 亚洲av日韩在线播放| 国产免费视频播放在线视频 | 我的老师免费观看完整版| 狠狠狠狠99中文字幕| 可以在线观看毛片的网站| 草草在线视频免费看| 一级黄片播放器| 欧美三级亚洲精品| 国产精品久久视频播放| 欧美激情久久久久久爽电影| 色综合站精品国产| 久久久久久久亚洲中文字幕| 国产成人91sexporn| 美女高潮的动态| 永久免费av网站大全| 男女视频在线观看网站免费| 91精品一卡2卡3卡4卡| 美女黄网站色视频| 亚洲精品456在线播放app| 在线观看av片永久免费下载| 99久久精品国产国产毛片| 九草在线视频观看| 一个人免费在线观看电影| 大又大粗又爽又黄少妇毛片口| 久久婷婷人人爽人人干人人爱| 人妻系列 视频| 麻豆久久精品国产亚洲av| 丝袜美腿在线中文| 搞女人的毛片| 乱人视频在线观看| 波多野结衣巨乳人妻| 97超视频在线观看视频| 天堂影院成人在线观看| 日本wwww免费看| 青春草国产在线视频| 我的老师免费观看完整版| 午夜福利在线观看吧| 国产免费男女视频| 偷拍熟女少妇极品色| 日韩一区二区视频免费看| 亚洲av.av天堂| 晚上一个人看的免费电影| 2022亚洲国产成人精品| 精品无人区乱码1区二区| 国产成人精品久久久久久| 免费搜索国产男女视频| 国内精品一区二区在线观看| 最近中文字幕高清免费大全6| 看黄色毛片网站| 国产成年人精品一区二区| 高清毛片免费看| 免费观看a级毛片全部| 精品无人区乱码1区二区| 永久免费av网站大全| 国语对白做爰xxxⅹ性视频网站| 日韩,欧美,国产一区二区三区 | 亚洲经典国产精华液单| 日韩av在线大香蕉| 99久久九九国产精品国产免费| 超碰av人人做人人爽久久| 亚洲av中文字字幕乱码综合| 国国产精品蜜臀av免费| a级一级毛片免费在线观看| 五月玫瑰六月丁香| 国产一区有黄有色的免费视频 | 一边亲一边摸免费视频| 国产精品蜜桃在线观看| 国产av在哪里看| 国产成人aa在线观看| 欧美三级亚洲精品| 97热精品久久久久久| 伦理电影大哥的女人| 日韩成人av中文字幕在线观看| 精品久久久久久久久久久久久| 成人国产麻豆网| 爱豆传媒免费全集在线观看| 日本欧美国产在线视频| 人人妻人人澡人人爽人人夜夜 | 少妇裸体淫交视频免费看高清| 成人鲁丝片一二三区免费| 纵有疾风起免费观看全集完整版 | 亚洲欧美日韩高清专用| 国产熟女欧美一区二区| 亚洲高清免费不卡视频| .国产精品久久| 最近中文字幕高清免费大全6| 精品久久久久久久人妻蜜臀av| 亚洲国产欧美在线一区| 国产色爽女视频免费观看| 九九久久精品国产亚洲av麻豆| 一级av片app| 婷婷色麻豆天堂久久 | 亚洲国产精品sss在线观看| 免费黄色在线免费观看| 日韩欧美 国产精品| 日本一二三区视频观看| av.在线天堂| 好男人视频免费观看在线| 黄色一级大片看看| 69av精品久久久久久| 熟妇人妻久久中文字幕3abv| 校园人妻丝袜中文字幕| 高清视频免费观看一区二区 | a级毛色黄片| 亚洲激情五月婷婷啪啪| 99热6这里只有精品| 一区二区三区高清视频在线| 亚洲国产色片| 寂寞人妻少妇视频99o| 午夜免费激情av| 亚洲成人av在线免费| 色播亚洲综合网| 不卡视频在线观看欧美| 日日干狠狠操夜夜爽| 内射极品少妇av片p| 99九九线精品视频在线观看视频| 国产伦一二天堂av在线观看| 日本av手机在线免费观看| 国产伦一二天堂av在线观看| 日日干狠狠操夜夜爽| 天天一区二区日本电影三级| 亚洲aⅴ乱码一区二区在线播放| 人妻制服诱惑在线中文字幕| 日韩av在线大香蕉| 国产黄片美女视频| 能在线免费看毛片的网站| 国产老妇女一区| 欧美成人a在线观看| 国产午夜精品论理片| 爱豆传媒免费全集在线观看| 久久精品国产99精品国产亚洲性色| 欧美激情久久久久久爽电影| 精品国产一区二区三区久久久樱花 | 国产精华一区二区三区| 麻豆成人av视频| 淫秽高清视频在线观看| 免费人成在线观看视频色| 色噜噜av男人的天堂激情| 能在线免费观看的黄片| 欧美最新免费一区二区三区| 免费观看人在逋| 麻豆一二三区av精品| 亚洲熟妇中文字幕五十中出| 高清在线视频一区二区三区 | 最后的刺客免费高清国语| 亚洲欧美日韩东京热| 国产黄a三级三级三级人| av线在线观看网站| 日韩中字成人| 亚洲一区高清亚洲精品| av在线蜜桃| 日韩欧美精品免费久久| 国内精品一区二区在线观看| 一夜夜www| 欧美高清成人免费视频www| 亚洲av福利一区| 在线播放国产精品三级| 国产一区二区在线观看日韩| 99热全是精品| 国产精品一区二区性色av| 国产免费视频播放在线视频 | 国产午夜精品论理片| 国国产精品蜜臀av免费| 久久人妻av系列| 国产一区二区在线观看日韩| 桃色一区二区三区在线观看| 日本免费在线观看一区| 国产黄片视频在线免费观看| 成人综合一区亚洲| eeuss影院久久| 国产麻豆成人av免费视频| 欧美区成人在线视频| 亚洲av一区综合| 久久精品熟女亚洲av麻豆精品 | 精品不卡国产一区二区三区| 久久综合国产亚洲精品| 亚洲丝袜综合中文字幕| 亚洲综合色惰| 欧美成人免费av一区二区三区| 亚洲精品久久久久久婷婷小说 | 免费一级毛片在线播放高清视频| 亚洲伊人久久精品综合 | 亚洲国产精品合色在线| 乱人视频在线观看| 免费观看精品视频网站| 久久久成人免费电影| 日本黄色片子视频| 深夜a级毛片| 老司机福利观看| 亚洲美女视频黄频| 国产日韩欧美在线精品| a级毛片免费高清观看在线播放| 日韩成人伦理影院| 国产高清有码在线观看视频| 老师上课跳d突然被开到最大视频| 国产高清视频在线观看网站| 日韩欧美在线乱码| 一个人免费在线观看电影| 九草在线视频观看| 国产在视频线精品| 午夜日本视频在线| 99久国产av精品| 日韩制服骚丝袜av| 成人一区二区视频在线观看| 变态另类丝袜制服| 国产成人午夜福利电影在线观看| 免费观看性生交大片5| 亚洲经典国产精华液单| 国产精品熟女久久久久浪| 精品人妻偷拍中文字幕| 亚洲一区高清亚洲精品| 亚洲伊人久久精品综合 | 国产成人91sexporn| 久久久精品大字幕| 青春草亚洲视频在线观看| 两性午夜刺激爽爽歪歪视频在线观看| 日韩精品有码人妻一区| 成人亚洲精品av一区二区| 久久久久久伊人网av| 国产精品电影一区二区三区| 久久综合国产亚洲精品| 精品不卡国产一区二区三区| 最近2019中文字幕mv第一页| 亚洲精品日韩av片在线观看| 精品久久久久久久久久久久久| 又粗又硬又长又爽又黄的视频| 97超碰精品成人国产| 亚洲av熟女| 全区人妻精品视频| 国产中年淑女户外野战色| 美女大奶头视频| 又爽又黄a免费视频| 高清av免费在线| 日韩成人伦理影院| 国模一区二区三区四区视频| 中文天堂在线官网| 国产精品蜜桃在线观看| 丰满人妻一区二区三区视频av| 亚洲丝袜综合中文字幕| 日日干狠狠操夜夜爽| 欧美日韩一区二区视频在线观看视频在线 | 天天躁夜夜躁狠狠久久av| 成人鲁丝片一二三区免费| 色综合亚洲欧美另类图片| 中文字幕久久专区| 在线观看美女被高潮喷水网站| 亚洲经典国产精华液单| 水蜜桃什么品种好| 久久精品国产自在天天线| av在线老鸭窝| 久久久精品欧美日韩精品| 色综合色国产| 日韩亚洲欧美综合| 日本与韩国留学比较| 99久久人妻综合| 99在线人妻在线中文字幕| 91狼人影院| 性插视频无遮挡在线免费观看| 网址你懂的国产日韩在线| 91久久精品国产一区二区成人| 精品国产一区二区三区久久久樱花 | 18禁裸乳无遮挡免费网站照片| 欧美一区二区精品小视频在线| 久久久久性生活片| 婷婷六月久久综合丁香| 精品久久久久久久人妻蜜臀av| 一二三四中文在线观看免费高清| 午夜福利网站1000一区二区三区| 99久国产av精品| 亚洲国产欧美在线一区| 久久精品国产亚洲av涩爱| 午夜老司机福利剧场| 日韩av不卡免费在线播放| 亚洲av不卡在线观看| 亚洲精品色激情综合| 亚洲无线观看免费| 一区二区三区乱码不卡18| 亚洲精品亚洲一区二区| 亚洲人成网站在线播| АⅤ资源中文在线天堂| 看免费成人av毛片| 国产片特级美女逼逼视频| av国产免费在线观看| 又黄又爽又刺激的免费视频.| 日韩强制内射视频| av天堂中文字幕网| 99热6这里只有精品| 久久99热这里只有精品18| 免费一级毛片在线播放高清视频| 99久久无色码亚洲精品果冻| 日韩av在线免费看完整版不卡| 内地一区二区视频在线| 成年女人永久免费观看视频| 国产毛片a区久久久久| 好男人在线观看高清免费视频| 亚洲成人中文字幕在线播放| 日韩视频在线欧美| 欧美zozozo另类| 纵有疾风起免费观看全集完整版 | 一级爰片在线观看| 一个人免费在线观看电影| 寂寞人妻少妇视频99o| 国产v大片淫在线免费观看| 国产精品一区二区三区四区久久| 成人高潮视频无遮挡免费网站| av女优亚洲男人天堂| 亚洲精品成人久久久久久| 国产免费又黄又爽又色| 日本爱情动作片www.在线观看| 午夜福利在线观看免费完整高清在| 美女高潮的动态| 丰满人妻一区二区三区视频av| 伦精品一区二区三区| 春色校园在线视频观看| 国产真实伦视频高清在线观看| 男女那种视频在线观看| 少妇裸体淫交视频免费看高清| 日本黄大片高清| 欧美成人免费av一区二区三区| 精品久久国产蜜桃| 国产毛片a区久久久久| 国产麻豆成人av免费视频| 久久这里只有精品中国| 欧美日本视频| 最近手机中文字幕大全| 国产真实伦视频高清在线观看| 啦啦啦观看免费观看视频高清| 午夜亚洲福利在线播放| 国产精品一区二区性色av| 欧美另类亚洲清纯唯美| 成年女人永久免费观看视频| 小说图片视频综合网站| 99热这里只有是精品在线观看| 爱豆传媒免费全集在线观看| 看免费成人av毛片| 免费黄色在线免费观看| 亚洲精品乱久久久久久| 国产成人freesex在线| 成人av在线播放网站| 草草在线视频免费看| 欧美高清成人免费视频www| 免费观看的影片在线观看| av国产免费在线观看| 国产在线男女| 亚洲欧美清纯卡通| 亚洲成人中文字幕在线播放| 天堂av国产一区二区熟女人妻| 午夜老司机福利剧场| 日本色播在线视频| 国产精品野战在线观看| 成人无遮挡网站| 国产午夜精品久久久久久一区二区三区| av在线老鸭窝| 卡戴珊不雅视频在线播放| 午夜日本视频在线| 久久久久久久亚洲中文字幕| 女人十人毛片免费观看3o分钟| 亚洲精品自拍成人| 国产又黄又爽又无遮挡在线| 久久精品久久精品一区二区三区| 日韩av在线免费看完整版不卡| 国产高清三级在线| 一个人观看的视频www高清免费观看| 久久99精品国语久久久| 国产色婷婷99| 免费搜索国产男女视频|