• <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亚洲精品天堂 | 综合色丁香网| 插阴视频在线观看视频| 别揉我奶头 嗯啊视频| 国产成人午夜福利电影在线观看| 插逼视频在线观看| 99热网站在线观看| 日韩免费高清中文字幕av| 久热久热在线精品观看| 亚洲国产日韩一区二区| 精品久久久久久久久亚洲| 亚洲精品国产成人久久av| 日韩亚洲欧美综合| 国产淫语在线视频| 国产爱豆传媒在线观看| 一级片'在线观看视频| 亚洲国产最新在线播放| 老女人水多毛片| 伦理电影大哥的女人| 国产真实伦视频高清在线观看| 亚洲精品国产色婷婷电影| 在线 av 中文字幕| 午夜免费观看性视频| 成年版毛片免费区| 久久99热这里只有精品18| 啦啦啦中文免费视频观看日本| 国产乱来视频区| a级一级毛片免费在线观看| 国内精品美女久久久久久| 亚洲怡红院男人天堂| 色网站视频免费| 日本av手机在线免费观看| 国产亚洲av嫩草精品影院| 国产v大片淫在线免费观看| 一级毛片aaaaaa免费看小| 久久久久久久久久成人| 99视频精品全部免费 在线| 1000部很黄的大片| 亚洲综合色惰| 久久人人爽av亚洲精品天堂 | 97热精品久久久久久| 啦啦啦啦在线视频资源| 在线观看人妻少妇| 免费黄频网站在线观看国产| 国产毛片在线视频| 少妇高潮的动态图| 免费高清在线观看视频在线观看| 我的女老师完整版在线观看| 天天躁日日操中文字幕| 日韩亚洲欧美综合| 国产亚洲一区二区精品| 伊人久久国产一区二区| 亚洲,欧美,日韩| 成人毛片60女人毛片免费| 亚洲真实伦在线观看| 99热国产这里只有精品6| 精华霜和精华液先用哪个| 国产成人91sexporn| 男女国产视频网站| 亚洲国产精品成人综合色| 五月天丁香电影| 国产69精品久久久久777片| 涩涩av久久男人的天堂| 日韩成人伦理影院| 全区人妻精品视频| 国产精品福利在线免费观看| 我的女老师完整版在线观看| 啦啦啦中文免费视频观看日本| 午夜爱爱视频在线播放| 别揉我奶头 嗯啊视频| 欧美高清成人免费视频www| 日韩av在线免费看完整版不卡| 久久久久久久午夜电影| 特大巨黑吊av在线直播| 国产有黄有色有爽视频| 一级毛片电影观看| 国产精品久久久久久精品古装| 伦精品一区二区三区| av播播在线观看一区| 亚洲av一区综合| 又爽又黄无遮挡网站| 久久久久久久久久成人| 亚洲综合色惰| 丝袜脚勾引网站| a级一级毛片免费在线观看| 亚洲精品乱码久久久久久按摩| 男女国产视频网站| 在线亚洲精品国产二区图片欧美 | 春色校园在线视频观看| 久热这里只有精品99| 亚洲激情五月婷婷啪啪| av国产精品久久久久影院| 免费黄网站久久成人精品| 亚洲成色77777| 少妇人妻久久综合中文| 在线免费十八禁| 波多野结衣巨乳人妻| 亚洲真实伦在线观看| 观看美女的网站| 在线亚洲精品国产二区图片欧美 | 丝袜脚勾引网站| 免费av观看视频| 街头女战士在线观看网站| 久久影院123| 天天躁日日操中文字幕| 波多野结衣巨乳人妻| 三级男女做爰猛烈吃奶摸视频| 伦理电影大哥的女人| av.在线天堂| 街头女战士在线观看网站| 久久久成人免费电影| 搡老乐熟女国产| 美女cb高潮喷水在线观看| 极品教师在线视频| 国产成人午夜福利电影在线观看| 高清午夜精品一区二区三区| 深夜a级毛片| 一级a做视频免费观看| 丰满少妇做爰视频| 国产一级毛片在线| 美女被艹到高潮喷水动态| 三级经典国产精品| 91aial.com中文字幕在线观看| 欧美精品国产亚洲| 女人十人毛片免费观看3o分钟| 亚洲成人一二三区av| 亚洲欧美日韩东京热| 一区二区av电影网| 亚洲成人久久爱视频| kizo精华| 免费av毛片视频| 高清欧美精品videossex| 成人欧美大片| av国产免费在线观看| av国产精品久久久久影院| 亚洲av在线观看美女高潮| 高清午夜精品一区二区三区| 99九九线精品视频在线观看视频| 国产精品蜜桃在线观看| 边亲边吃奶的免费视频| 69人妻影院| 丝瓜视频免费看黄片| 你懂的网址亚洲精品在线观看| 亚洲欧洲日产国产| 亚洲精品456在线播放app| 女人久久www免费人成看片| 亚洲综合色惰| 亚洲精品成人av观看孕妇| 在线精品无人区一区二区三 | 久久久久久久午夜电影| 亚洲人成网站在线播| 99视频精品全部免费 在线| 国产国拍精品亚洲av在线观看| 免费在线观看成人毛片| 免费观看在线日韩| 黄色怎么调成土黄色| 伊人久久国产一区二区| 免费看a级黄色片| 国产在线一区二区三区精| 久久久a久久爽久久v久久| 99久久中文字幕三级久久日本| 最近手机中文字幕大全| 尤物成人国产欧美一区二区三区| 国产黄色免费在线视频| 日韩免费高清中文字幕av| 少妇的逼水好多| 国产精品成人在线| 一级毛片我不卡| 免费人成在线观看视频色| 男女边摸边吃奶| av在线播放精品| 在线观看人妻少妇| 久久久午夜欧美精品| 亚洲,一卡二卡三卡| 老师上课跳d突然被开到最大视频| 国产爱豆传媒在线观看| av国产久精品久网站免费入址| 免费人成在线观看视频色| 精品人妻视频免费看| 欧美成人一区二区免费高清观看| 国产欧美日韩精品一区二区| 亚洲天堂av无毛| 性色avwww在线观看| 精品久久久噜噜| 一区二区三区精品91| 久久久久久久久大av| 亚洲四区av| 久久这里有精品视频免费| 精品久久久久久久久亚洲| 日本欧美国产在线视频| 看十八女毛片水多多多| 99九九线精品视频在线观看视频| 直男gayav资源| 交换朋友夫妻互换小说| 欧美成人一区二区免费高清观看| 在线精品无人区一区二区三 | 欧美成人一区二区免费高清观看| 特级一级黄色大片| 国产一区二区亚洲精品在线观看| 中文字幕人妻熟人妻熟丝袜美| 亚洲精品乱码久久久久久按摩| 91精品伊人久久大香线蕉| 天堂网av新在线| 少妇人妻一区二区三区视频| 午夜爱爱视频在线播放| 精品国产一区二区三区久久久樱花 | 国产午夜福利久久久久久| 激情 狠狠 欧美| 又爽又黄a免费视频| 日日啪夜夜撸| 免费观看的影片在线观看| 国产成人一区二区在线| 高清av免费在线| 如何舔出高潮| 国产永久视频网站| 婷婷色综合www| 久久久久久久久久成人| 少妇的逼好多水| 亚洲国产成人一精品久久久| 亚洲精品乱码久久久久久按摩| 国产精品久久久久久av不卡| 国产成人一区二区在线| 亚洲欧洲日产国产| 国产成人a区在线观看| 国产精品成人在线| 国产淫片久久久久久久久| 色综合色国产| 综合色丁香网| 久久久精品免费免费高清| 视频区图区小说| 丝袜脚勾引网站| 免费av不卡在线播放| 丰满乱子伦码专区| 99热这里只有是精品50| 亚洲国产精品专区欧美| 久热久热在线精品观看| 蜜臀久久99精品久久宅男| 成人无遮挡网站| 中文资源天堂在线| 亚洲内射少妇av| 别揉我奶头 嗯啊视频| 亚洲精品久久久久久婷婷小说| 亚洲高清免费不卡视频| 搞女人的毛片| 久久影院123| 国产成人a区在线观看| 少妇被粗大猛烈的视频| 免费看av在线观看网站| 国产高潮美女av| 六月丁香七月| 国产在线男女| 自拍偷自拍亚洲精品老妇| 一级毛片久久久久久久久女| 国产人妻一区二区三区在| 丝袜喷水一区| 日本黄大片高清| 免费看a级黄色片| 国产成人福利小说| 国产成人a∨麻豆精品| 超碰97精品在线观看| 国产色婷婷99| 中文天堂在线官网| 综合色av麻豆| 精品99又大又爽又粗少妇毛片| 国产精品一区二区在线观看99| 精品一区二区免费观看| 日韩免费高清中文字幕av| 男人添女人高潮全过程视频| 中文天堂在线官网| av在线天堂中文字幕| 亚洲精品456在线播放app| 五月开心婷婷网| 激情五月婷婷亚洲| 青春草视频在线免费观看| 国产高潮美女av| 亚洲av电影在线观看一区二区三区 | 女人久久www免费人成看片| 又粗又硬又长又爽又黄的视频| 在线亚洲精品国产二区图片欧美 | 久久久久久久久久久丰满| 欧美亚洲 丝袜 人妻 在线| 国产亚洲精品久久久com| 大香蕉久久网| 天美传媒精品一区二区| 日日摸夜夜添夜夜添av毛片| 97在线视频观看| 中文在线观看免费www的网站| 亚洲成人中文字幕在线播放| 成人鲁丝片一二三区免费| 精品国产三级普通话版| 最近的中文字幕免费完整| 欧美xxⅹ黑人| 2021少妇久久久久久久久久久| 亚洲av二区三区四区| 一级二级三级毛片免费看| 大又大粗又爽又黄少妇毛片口| 免费av毛片视频| 色视频www国产| av网站免费在线观看视频| 最后的刺客免费高清国语| 色综合色国产| 日日摸夜夜添夜夜爱| av在线亚洲专区| 一边亲一边摸免费视频| 夜夜爽夜夜爽视频| 国产成人精品婷婷| 在线观看一区二区三区激情| 精品国产三级普通话版| 精品99又大又爽又粗少妇毛片| 黄片无遮挡物在线观看| 婷婷色av中文字幕| 国产精品成人在线| 免费看av在线观看网站| 日韩欧美精品v在线| 国产成人aa在线观看| 国产免费福利视频在线观看| 99久国产av精品国产电影| 国产精品一区二区在线观看99| 久久97久久精品| 欧美人与善性xxx| 嫩草影院精品99| 成人午夜精彩视频在线观看| 丰满乱子伦码专区| 免费av观看视频| 欧美另类一区| 国产精品人妻久久久久久| 国产国拍精品亚洲av在线观看| 真实男女啪啪啪动态图| 亚洲av男天堂| 在线观看人妻少妇| 国产精品人妻久久久影院| 亚洲精品一区蜜桃| www.色视频.com| 国产91av在线免费观看| 亚洲怡红院男人天堂| 国产爽快片一区二区三区| av国产免费在线观看| 又爽又黄无遮挡网站| 国产精品偷伦视频观看了| 少妇 在线观看| 中文字幕av成人在线电影| 日韩免费高清中文字幕av| 亚洲无线观看免费| 五月伊人婷婷丁香| 毛片一级片免费看久久久久| 久久精品国产亚洲av天美| 一个人看的www免费观看视频| 亚洲欧洲日产国产| 丰满少妇做爰视频| av专区在线播放| 国产黄频视频在线观看| 亚洲婷婷狠狠爱综合网| 小蜜桃在线观看免费完整版高清| 91aial.com中文字幕在线观看| 男插女下体视频免费在线播放| 91狼人影院| 亚洲怡红院男人天堂| 狂野欧美激情性bbbbbb| 大香蕉久久网| 色哟哟·www| 亚洲精品国产av蜜桃| 中文天堂在线官网| 91久久精品国产一区二区成人| 男人添女人高潮全过程视频| 亚洲成人中文字幕在线播放| 国产片特级美女逼逼视频| 久久精品国产亚洲av涩爱| 九色成人免费人妻av| 熟妇人妻不卡中文字幕| 蜜臀久久99精品久久宅男| 国模一区二区三区四区视频| 亚洲av二区三区四区| 91精品伊人久久大香线蕉| 亚洲色图av天堂| 嫩草影院入口| av.在线天堂| 99久国产av精品国产电影| 国产免费福利视频在线观看| 能在线免费看毛片的网站| 另类亚洲欧美激情| 亚洲国产高清在线一区二区三| 波野结衣二区三区在线| 少妇的逼好多水| 国产精品一二三区在线看| av在线蜜桃| 六月丁香七月| 国产成人精品福利久久| 国产综合精华液| 国产成人午夜福利电影在线观看| 黑人高潮一二区| 亚洲久久久久久中文字幕| 日日啪夜夜撸| 性色avwww在线观看| 国产伦在线观看视频一区| 精品国产三级普通话版| 国产老妇伦熟女老妇高清| 国产精品99久久久久久久久| 国产男人的电影天堂91| 国产爽快片一区二区三区| 亚洲精品日韩在线中文字幕| 亚洲婷婷狠狠爱综合网| 国产毛片在线视频| 欧美精品国产亚洲| 亚洲精品国产av蜜桃| 日韩欧美 国产精品| av国产久精品久网站免费入址| 国产伦理片在线播放av一区| 国产国拍精品亚洲av在线观看| 精品99又大又爽又粗少妇毛片| 精品熟女少妇av免费看| 在线观看免费高清a一片| 看黄色毛片网站| 黑人高潮一二区| 中文字幕免费在线视频6| 日韩中字成人| 亚洲国产精品国产精品| 高清日韩中文字幕在线| 联通29元200g的流量卡| 91久久精品国产一区二区三区| 国产成人一区二区在线| 男男h啪啪无遮挡| 国产有黄有色有爽视频| 亚洲成人久久爱视频| 亚洲真实伦在线观看| 国产v大片淫在线免费观看| 亚洲欧洲国产日韩| 丝袜喷水一区| 成人特级av手机在线观看| 高清视频免费观看一区二区| 亚洲精品影视一区二区三区av| 国产精品久久久久久久电影| 国产精品久久久久久精品电影小说 | 国产老妇女一区| 春色校园在线视频观看| 亚洲精品乱码久久久久久按摩| 日本黄色片子视频| 少妇人妻 视频| 国产一区有黄有色的免费视频| 麻豆国产97在线/欧美| 久久久欧美国产精品| 精品少妇久久久久久888优播| 亚洲经典国产精华液单| 2021少妇久久久久久久久久久| 久久热精品热| 超碰97精品在线观看| 搡女人真爽免费视频火全软件| 又黄又爽又刺激的免费视频.| 亚洲国产欧美人成| 国产毛片在线视频| 一区二区三区免费毛片| av网站免费在线观看视频| 色视频www国产| 搡女人真爽免费视频火全软件| 日本一本二区三区精品| av一本久久久久| 欧美激情国产日韩精品一区| 亚洲国产最新在线播放| 日韩av不卡免费在线播放| 男人狂女人下面高潮的视频| 又大又黄又爽视频免费| 国产高清三级在线| 中国国产av一级| 欧美激情久久久久久爽电影| 美女cb高潮喷水在线观看| 男女啪啪激烈高潮av片| 中文字幕制服av| 国产成人免费观看mmmm| 神马国产精品三级电影在线观看| 亚洲成人一二三区av| 亚洲伊人久久精品综合| 可以在线观看毛片的网站| 男女边吃奶边做爰视频| 大又大粗又爽又黄少妇毛片口| 日韩三级伦理在线观看| 免费少妇av软件| 大码成人一级视频| 80岁老熟妇乱子伦牲交| 欧美少妇被猛烈插入视频| 国产精品不卡视频一区二区| 欧美性感艳星| 欧美+日韩+精品| 国产成人免费无遮挡视频| 99久久九九国产精品国产免费| 卡戴珊不雅视频在线播放| 成年版毛片免费区| 欧美成人一区二区免费高清观看| 白带黄色成豆腐渣| 69av精品久久久久久| 亚洲色图av天堂| 国模一区二区三区四区视频| 三级男女做爰猛烈吃奶摸视频| av国产久精品久网站免费入址| 波野结衣二区三区在线| 久久精品久久精品一区二区三区| 欧美人与善性xxx| 嫩草影院精品99| 80岁老熟妇乱子伦牲交| 精品久久久久久久久av| 天堂网av新在线| 高清av免费在线| 男女无遮挡免费网站观看| 日韩av免费高清视频| 午夜视频国产福利| 精品一区在线观看国产| 亚洲人成网站在线观看播放| 激情 狠狠 欧美| 麻豆成人av视频| 91在线精品国自产拍蜜月| 亚洲欧美日韩东京热| 嫩草影院入口| 精品国产一区二区三区久久久樱花 | 综合色av麻豆| av免费在线看不卡| 大片电影免费在线观看免费| 免费黄频网站在线观看国产| 少妇被粗大猛烈的视频| 久久99热6这里只有精品| 蜜臀久久99精品久久宅男| 人妻少妇偷人精品九色| 你懂的网址亚洲精品在线观看| 麻豆久久精品国产亚洲av| 精品一区二区三区视频在线| 国内精品美女久久久久久| 国产一区二区三区av在线| 三级国产精品片| 两个人的视频大全免费| 久久99热这里只频精品6学生| 91久久精品国产一区二区成人| 三级男女做爰猛烈吃奶摸视频| 男女国产视频网站| 成人二区视频| 国产极品天堂在线| 在线免费观看不下载黄p国产| 国语对白做爰xxxⅹ性视频网站| 亚洲四区av| 人体艺术视频欧美日本| 国产成人精品福利久久| 国产精品人妻久久久影院| 少妇人妻一区二区三区视频| 别揉我奶头 嗯啊视频| 在线看a的网站| av在线播放精品| 91精品一卡2卡3卡4卡| 精品久久久久久久久av| 免费大片18禁| 国产色爽女视频免费观看| 亚洲国产精品专区欧美| 欧美一级a爱片免费观看看| 在线观看一区二区三区激情| 久久久久久伊人网av| 六月丁香七月| 国产伦在线观看视频一区| 丝袜美腿在线中文| 男人添女人高潮全过程视频| 色综合色国产| 国产男人的电影天堂91| 亚洲精华国产精华液的使用体验| 成人亚洲精品一区在线观看 | 国产色爽女视频免费观看| 又大又黄又爽视频免费| 欧美极品一区二区三区四区| 国产黄片美女视频| 久久韩国三级中文字幕| 日本一本二区三区精品| 最近最新中文字幕免费大全7| 97在线人人人人妻| 街头女战士在线观看网站| 超碰97精品在线观看| 国产精品久久久久久av不卡| 国产精品一区二区三区四区免费观看| 色视频在线一区二区三区| 久久这里有精品视频免费| 国产高清国产精品国产三级 | 午夜免费鲁丝| 人妻 亚洲 视频| 国产精品国产三级国产av玫瑰| 啦啦啦啦在线视频资源| 久久99精品国语久久久| 精品人妻熟女av久视频| 成人午夜精彩视频在线观看| 五月玫瑰六月丁香| 国产视频内射| 欧美日韩综合久久久久久| 久久精品国产自在天天线| 国产 精品1| 国产av码专区亚洲av| 一本久久精品| 99视频精品全部免费 在线| 中国美白少妇内射xxxbb| av国产久精品久网站免费入址| 夜夜看夜夜爽夜夜摸| 久久人人爽av亚洲精品天堂 | 成年女人在线观看亚洲视频 | 欧美性猛交╳xxx乱大交人| 在现免费观看毛片| 国产女主播在线喷水免费视频网站| 日韩 亚洲 欧美在线| 精品少妇黑人巨大在线播放| 校园人妻丝袜中文字幕| 午夜免费男女啪啪视频观看| 成人特级av手机在线观看| 成年女人在线观看亚洲视频 | 日韩av免费高清视频| 精品亚洲乱码少妇综合久久| 亚洲熟女精品中文字幕| 国产成人aa在线观看| 麻豆成人av视频| 男插女下体视频免费在线播放| 在线看a的网站| 日日撸夜夜添| 精品久久久久久久末码| 精品少妇黑人巨大在线播放| 777米奇影视久久| 最近最新中文字幕大全电影3| 22中文网久久字幕|