一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法和裝置,首先進行初始化,創(chuàng)建一個檢測分支棧及相關(guān)數(shù)據(jù)結(jié)構(gòu),開始檢測第一個數(shù)據(jù),如果沒有檢測出錯誤則入棧,對棧頂分支按確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人與本分支關(guān)系人集合進行比較,若檢測出錯誤親緣關(guān)系環(huán)或超出檢測的最大關(guān)系長度則將本分支從棧中刪除,直至棧為空。本發(fā)明使異常血親關(guān)系數(shù)據(jù)能通過對多個親緣關(guān)系數(shù)據(jù)進行綜合判斷而檢測出錯誤。
【專利說明】一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計算機信息處理領(lǐng)域,尤其涉及一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法和裝置。
【背景技術(shù)】
[0002]數(shù)據(jù)質(zhì)量問題是影響數(shù)據(jù)可用性的一個重要因素,在數(shù)據(jù)質(zhì)量問題當(dāng)中,主要有兩類問題,一是數(shù)據(jù)沖突,二是數(shù)據(jù)錯誤。數(shù)據(jù)沖突和數(shù)據(jù)錯誤在很多時候存在交叉,一般來說有很多數(shù)據(jù)沖突是由于錯誤的數(shù)據(jù)引起的,比如兩個數(shù)據(jù)分別表示某人有兩個不同親生父親,顯然其中有一個是錯誤的,但也不全部如此,有些數(shù)據(jù)沖突是親緣關(guān)系表示的原因造成的,比如說同類的親緣關(guān)系數(shù)據(jù)只能選其中一個(一般選最優(yōu)的),比如一個人有兩個妻子,但其中必然有一個是不合法的或者是過去式的(前妻),但兩個數(shù)據(jù)本身并沒有錯。數(shù)據(jù)沖突只有在有兩個親緣關(guān)系數(shù)據(jù)進行比較時才有,而數(shù)據(jù)錯誤可以在兩個數(shù)據(jù)比較時發(fā)現(xiàn)錯誤,也可以在不進行比較時發(fā)現(xiàn)錯誤,還可以通過對多個數(shù)據(jù)進行綜合判斷而得出。這里的數(shù)據(jù)錯誤就是指形成一個關(guān)系環(huán)的數(shù)據(jù)錯誤,一般要通過對兩個以上的多個數(shù)據(jù)進行綜合判斷(但在極端情況下也可通過對一個或者兩個數(shù)據(jù)親緣關(guān)系數(shù)據(jù)進行判斷而得出)才能發(fā)現(xiàn)的錯誤,以和數(shù)據(jù)沖突時很多情形的數(shù)據(jù)錯誤及單個數(shù)據(jù)可以判斷等情況相區(qū)別。
[0003]并不是所有的關(guān)系環(huán)都是錯誤親緣關(guān)系環(huán),一個親生父母子女關(guān)系在非通用的表示中,親生父母的親緣關(guān)系數(shù)據(jù)通過其親生子女屬性指向親生子女,而親生子女的親緣關(guān)系數(shù)據(jù)通過其親生父親或母親屬性指向親生父親或母親,就形成了一個關(guān)系環(huán),這是由于親緣關(guān)系的相互性形成的最小的關(guān)系環(huán),是正常的。錯誤親緣關(guān)系環(huán)的錯誤種類與親緣關(guān)系種類(包含多種親緣關(guān)系類別)有關(guān),以血親關(guān)系為例,甲的父親為乙,乙的父親為丙,丙的父親為甲,這就形成了一個錯誤的親緣關(guān)系環(huán),跨親緣關(guān)系種類的錯誤親緣關(guān)系環(huán)肯定也會存在,但比較復(fù)雜這里不考慮,這里只考慮一種親緣關(guān)系種類中的錯誤親緣關(guān)系環(huán),也可以更短如甲的父親為甲或甲的父親為乙及乙的父親為甲,但這兩種情況可以通過其它的錯誤檢測方法檢測出來,這里作為兩種特例,即關(guān)系人自身之間的關(guān)系和兩個互為自反的關(guān)系的特例情況。一個有的親緣關(guān)系類別的親緣關(guān)系數(shù)據(jù)有可以判斷的數(shù)據(jù)錯誤,而有的則沒有。收養(yǎng)關(guān)系中也存在相同的情況,因此要檢測錯誤親緣關(guān)系環(huán),必須根據(jù)不同親緣關(guān)系種類分別進行考慮,而目前還沒有相關(guān)的研究及檢測方法和裝置。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決錯誤親緣關(guān)系環(huán)檢測的問題,為解決上述問題,本發(fā)明的目的在于提供一種錯誤親緣關(guān)系環(huán)檢測方法和裝置,采用深度優(yōu)先的算法,使錯誤親緣關(guān)系環(huán)能通過一個及以上(一般是三個及以上的多個)的親緣關(guān)系數(shù)據(jù)進行綜合判斷而檢測出錯誤。上述錯誤親緣關(guān)系環(huán)相比正確的關(guān)系環(huán)有一個最大的特點,就是親緣關(guān)系單向關(guān)聯(lián),上述幾個例子就都是以親生父親關(guān)系人作為單向關(guān)聯(lián)的條件,所以導(dǎo)致錯誤的親緣關(guān)系環(huán),而正常的則是雙向的關(guān)聯(lián)。其實在單向關(guān)聯(lián)的同時引入平行關(guān)系的關(guān)聯(lián)也是能夠判斷錯誤親緣關(guān)系環(huán)的,甲的父親為乙,乙的同父兄弟姐妹為丙,丙的父親為甲,也構(gòu)成一個錯誤的關(guān)系環(huán)。單向關(guān)聯(lián)不限于同樣的關(guān)系人進行關(guān)聯(lián),比如前面例子中的父親關(guān)系人,用母親關(guān)系人也可以,如甲的父親為乙,乙的同父兄弟姐妹為丙,丙的母親為甲,也構(gòu)成一個錯誤的關(guān)系環(huán)。因此錯誤親緣關(guān)系環(huán)檢測的關(guān)鍵在于進行單向關(guān)聯(lián),單向往上(上一輩的關(guān)系人)或者單向往下(下一輩的關(guān)系人),平行方向關(guān)系人(平輩關(guān)系人)均可包含在內(nèi)不影響整個檢測的單向性,以上所有親緣關(guān)系均限于同一親緣關(guān)系種類之中。
[0005]為解決上述技術(shù)問題,本發(fā)明提出的錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法,主要包括以下步驟:
第一步,進行初始化,創(chuàng)建一個檢測分支棧并將第一個分支入棧成為棧頂分支,設(shè)置一個關(guān)系長度最高允許值,為棧頂?shù)谝粋€分支創(chuàng)建相應(yīng)的關(guān)系長度計數(shù)器并置為零及創(chuàng)建一個為空的關(guān)系人集合、一個空的親緣關(guān)系數(shù)據(jù)集合及一個該親緣關(guān)系數(shù)據(jù)數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記;
第二步,將開始檢測的第一個親緣關(guān)系數(shù)據(jù)放入棧頂?shù)谝粋€分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù),然后提取數(shù)據(jù)中參與親緣關(guān)系的兩個關(guān)系人,如果不相同則均放入棧頂?shù)谝粋€分支相應(yīng)的關(guān)系人集合并將第一個分支相應(yīng)的關(guān)系長度計數(shù)器加I,然后將相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理;如果相同則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在上述親緣關(guān)系數(shù)據(jù)集合中,檢測過程結(jié)束;
第三步,如果棧為空則檢測過程結(jié)束;如果不為空對于且棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,則按照確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取棧頂分支下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),否則直接執(zhí)行第五步;
第四步,如果沒有關(guān)聯(lián)數(shù)據(jù)則得出檢測結(jié)果是棧頂分支沒有檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果有關(guān)聯(lián)數(shù)據(jù),第一個關(guān)聯(lián)數(shù)據(jù)作為棧頂分支的延續(xù)繼續(xù)使用棧頂分支的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等資源,如果有兩個或以上關(guān)聯(lián)數(shù)據(jù),則另外分別為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧同時復(fù)制一個相同的資源備份為本分支所有,以后所有操作中各個分支均為操作本分支所有的關(guān)系人集合和親緣關(guān)系數(shù)據(jù)集合,然后分別將各個關(guān)聯(lián)數(shù)據(jù)放入本分支所有的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù),同時將該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為未處理;
第五步,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人,如果本分支所有的關(guān)系人集合中不存在該關(guān)系人則將其放入該集合并將關(guān)系長度計數(shù)器加I但連續(xù)第二個及以上的平行方向關(guān)聯(lián)情況的關(guān)系長度計數(shù)器不再增加,如果本分支關(guān)系長度計數(shù)器已達關(guān)系長度最高允許值,則得出檢測結(jié)果是棧頂分支未檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果關(guān)系人集合中已存在該關(guān)系人則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在棧頂分支所有的親緣關(guān)系數(shù)據(jù)集合中,然后將棧頂分支出棧;否則將當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,然后回到第二步。[0006]為解決上述技術(shù)問題,本發(fā)明提出的錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測裝置,具備:
至少一個處理器;及
至少一個存儲器,含有計算機程序代碼,所述至少一個存儲器和計算機程序代碼被配置為利用所述至少一個處理器使得所述裝置
第一步,進行初始化,創(chuàng)建一個檢測分支棧并將第一個分支入棧成為棧頂分支,設(shè)置一個關(guān)系長度最高允許值,為棧頂?shù)谝粋€分支創(chuàng)建相應(yīng)的關(guān)系長度計數(shù)器并置為零及創(chuàng)建一個為空的關(guān)系人集合、一個空的親緣關(guān)系數(shù)據(jù)集合及一個該親緣關(guān)系數(shù)據(jù)數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記;
第二步,將開始檢測的第一個親緣關(guān)系數(shù)據(jù)放入棧頂?shù)谝粋€分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù),然后提取數(shù)據(jù)中參與親緣關(guān)系的兩個關(guān)系人,如果不相同則均放入棧頂?shù)谝粋€分支相應(yīng)的關(guān)系人集合并將第一個分支相應(yīng)的關(guān)系長度計數(shù)器加1,然后將相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理;如果相同則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在上述親緣關(guān)系數(shù)據(jù)集合中,檢測過程結(jié)束;
第三步,如果棧為空則檢測過程結(jié)束;如果不為空對于且棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,則按照確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取棧頂分支下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),否則直接執(zhí)行第五步;
第四步,如果沒有關(guān)聯(lián)數(shù)據(jù)則得出檢測結(jié)果是棧頂分支沒有檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果有關(guān)聯(lián)數(shù)據(jù),第一個關(guān)聯(lián)數(shù)據(jù)作為棧頂分支的延續(xù)繼續(xù)使用棧頂分支的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等資源,如果有兩個或以上關(guān)聯(lián)數(shù)據(jù),則另外分別為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧同時復(fù)制一個相同的資源備份為本分支所有,以后所有操作中各個分支均為操作本分支所有的關(guān)系人集合和親緣關(guān)系數(shù)據(jù)集合,然后分別將各個關(guān)聯(lián)數(shù)據(jù)放入本分支所有的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù),同時將該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為未處理;
第五步,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人,如果本分支所有的關(guān)系人集合中不存在該關(guān)系人則將其放入該集合并將關(guān)系長度計數(shù)器加I但連續(xù)第二個及以上的平行方向關(guān)聯(lián)情況的關(guān)系長度計數(shù)器不再增加,如果本分支關(guān)系長度計數(shù)器已達關(guān)系長度最高允許值,則得出檢測結(jié)果是棧頂分支未檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果關(guān)系人集合中已存在該關(guān)系人則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在棧頂分支所有的親緣關(guān)系數(shù)據(jù)集合中,然后將棧頂分支出棧;否則將當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,然后回到第二步。
【專利附圖】
【附圖說明】
[0007]圖1為錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法或裝置的基本流程。
【具體實施方式】[0008]下面結(jié)合附圖,對本發(fā)明的實施方式進行詳細說明。
[0009]圖1示出錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法或裝置的基本流程:
第一步,進行初始化,創(chuàng)建一個檢測分支棧并將第一個分支入棧成為棧頂分支,設(shè)置一個關(guān)系長度最高允許值,為棧頂?shù)谝粋€分支創(chuàng)建相應(yīng)的關(guān)系長度計數(shù)器并置為零及創(chuàng)建一個為空的關(guān)系人集合、一個空的親緣關(guān)系數(shù)據(jù)集合及一個該親緣關(guān)系數(shù)據(jù)數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記;由于在檢測過程中可能會有很多的分支,為了一一對這些分支進行處理,因此建立一個棧,每一個需要檢測的分支都放在棧中,其位置按照發(fā)現(xiàn)的次序順序入棧。另外為了記錄每一個分支的親緣關(guān)系數(shù)據(jù)及判斷是否存在錯誤親緣關(guān)系環(huán),還需要創(chuàng)建兩個集合用以存儲分支上的親緣關(guān)系數(shù)據(jù)及關(guān)系人,實現(xiàn)形式也可以采取棧、隊列等的形式,或鏈表及其它形式。親緣關(guān)系數(shù)據(jù)及關(guān)系人在各自的集合也按次序存放。設(shè)置一個關(guān)系長度最高允許值的意義在于控制檢測的深度使檢測是可以在預(yù)期的步驟內(nèi)結(jié)束。
[0010]第二步,將開始檢測的第一個親緣關(guān)系數(shù)據(jù)放入棧頂?shù)谝粋€分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù),然后提取數(shù)據(jù)中參與親緣關(guān)系的兩個關(guān)系人,如果不相同則均放入棧頂?shù)谝粋€分支相應(yīng)的關(guān)系人集合并將第一個分支相應(yīng)的關(guān)系長度計數(shù)器加1,然后將相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理;如果相同則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在上述親緣關(guān)系數(shù)據(jù)集合中,檢測過程結(jié)束;由于此時棧中還沒有分支,所以先處理要檢測的第一個親緣關(guān)系數(shù)據(jù),在全庫檢測時,此步可以變成一個遍歷過程,依次對沒有處理的親緣關(guān)系數(shù)據(jù)或沒有被完全處理的數(shù)據(jù)進行處理。提取的兩個關(guān)系人若相同,則該數(shù)據(jù)表示的就是自己和自己的關(guān)系,這里就是一種錯誤的親緣關(guān)系環(huán)特例。
[0011]第三步,如果棧為空則檢測過程結(jié)束;如果不為空對于且棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,則按照確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取棧頂分支下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),否則直接執(zhí)行第五步;首先棧中只有一個棧頂分支即第二步處理親緣關(guān)系數(shù)據(jù)時建立的一個分支,但可能隨著檢測的深入,分支不斷增加,最后又隨著檢測的進一步深入,各個分支先后通過檢測得出結(jié)論,一個個從棧中刪除,棧為空后整個檢測結(jié)束。若是全庫檢測,則繼續(xù)進行第二步處理下一個未處理過的親緣關(guān)系數(shù)據(jù)或未全部處理完的親緣關(guān)系數(shù)據(jù)。同種類親緣關(guān)系數(shù)據(jù)是指血親關(guān)系、收養(yǎng)關(guān)系等同一種親緣關(guān)系種類的親緣關(guān)系類別,血親關(guān)系僅限于血親關(guān)系的各種親緣關(guān)系,不能跨種類取婚姻關(guān)系、收養(yǎng)關(guān)系的數(shù)據(jù)。按確定的親緣關(guān)系方向往上或往下(均可包括平行方向)是指單向往上(上一輩的關(guān)系人,如血親關(guān)系中的親生父親或母親)或者單向往下(下一輩的關(guān)系人,如血親關(guān)系中的親生子女),平行方向關(guān)系人(平輩關(guān)系人,如血親關(guān)系中的同胞兄弟姐妹)均可包含在內(nèi)不影響整個檢測的單向性,所以下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),可以全部是單向(往上或往下)的取,也可以是單向加平行的取,但不能雙向(既有往上又有往下)的取。上述的“取”就是檢索,在基于通用表示的親緣關(guān)系數(shù)據(jù)庫中,檢索關(guān)聯(lián)數(shù)據(jù)一般要全庫檢索,而在基于非通用表示的親緣關(guān)系數(shù)據(jù)庫中,則要看親緣關(guān)系數(shù)據(jù)是否有相應(yīng)的屬性,沒有或有但為空則無法進一步檢索,屬于取不到的情況。每次檢測都只檢測棧頂分支,棧頂分支的狀態(tài)可能有兩種,一是所屬的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)已處理,但檢測還未結(jié)束,這種情況下,就必須繼續(xù)檢索關(guān)聯(lián)數(shù)據(jù),以進行進一步檢測;還有一種情況就是所屬的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)還未處理,這時就必須直接到第五步進行處理,即檢測是否有錯誤親緣關(guān)系環(huán)。
[0012]第四步,如果沒有關(guān)聯(lián)數(shù)據(jù)則得出檢測結(jié)果是棧頂分支沒有檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果有關(guān)聯(lián)數(shù)據(jù),第一個關(guān)聯(lián)數(shù)據(jù)作為棧頂分支的延續(xù)繼續(xù)使用棧頂分支的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等資源,如果有兩個或以上關(guān)聯(lián)數(shù)據(jù),則另外分別為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧同時復(fù)制一個相同的資源備份為本分支所有,以后所有操作中各個分支均為操作本分支所有的關(guān)系人集合和親緣關(guān)系數(shù)據(jù)集合,然后分別將各個關(guān)聯(lián)數(shù)據(jù)放入本分支所有的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù),同時將該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為未處理;第三步是試圖發(fā)現(xiàn)關(guān)聯(lián)數(shù)據(jù),第四步則根據(jù)關(guān)聯(lián)數(shù)據(jù)發(fā)現(xiàn)的情況作一些準備工作,主要就是發(fā)現(xiàn)有新的分支時(超過一個關(guān)聯(lián)數(shù)據(jù))要為該分支準備相應(yīng)的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記。沒有關(guān)聯(lián)數(shù)據(jù),則該分支到此為止以沒有檢測出錯誤結(jié)論因而要從棧中刪除。
[0013]第五步,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人,如果本分支所有的關(guān)系人集合中不存在該關(guān)系人則將其放入該集合并將關(guān)系長度計數(shù)器加I但連續(xù)第二個及以上的平行方向關(guān)聯(lián)情況的關(guān)系長度計數(shù)器不再增力口,如果本分支關(guān)系長度計數(shù)器已達關(guān)系長度最高允許值,則得出檢測結(jié)果是棧頂分支未檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果關(guān)系人集合中已存在該關(guān)系人則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在棧頂分支所有的親緣關(guān)系數(shù)據(jù)集合中,然后將棧頂分支出棧;否則將當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,然后回到第三步。本步在第四步的基礎(chǔ)上對所涉及的所有分支(原分支及新產(chǎn)生的分支)進行判斷處理,計數(shù)器相應(yīng)增加,及數(shù)據(jù)放入相應(yīng)集合,在未檢測到環(huán)時關(guān)系人也放入相應(yīng)棧。但在計數(shù)器增加時考慮一種特殊情況,即平行方向的關(guān)系人如同胞兄弟姐妹關(guān)系人,無論多少個均算一個,計數(shù)器只增加一次,所以連續(xù)的同胞兄弟姐妹關(guān)系人從第二個開始計數(shù)器不再增加。不連續(xù)的同胞兄弟姐妹關(guān)系人互不影響。處理完畢再回到第三步開始對棧頂分支進行處理,由于每次都是處理棧頂分支,所以整個過程實際上是一個深度優(yōu)先的遍歷過程;上述出棧動作均可包含釋放棧頂分支相應(yīng)的資源,如相應(yīng)的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等。
【權(quán)利要求】
1.一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測方法,其特征在于包括以下步驟: 第一步,進行初始化,創(chuàng)建一個檢測分支棧并將第一個分支入棧成為棧頂分支,設(shè)置一個關(guān)系長度最高允許值,為棧頂?shù)谝粋€分支創(chuàng)建相應(yīng)的關(guān)系長度計數(shù)器并置為零及創(chuàng)建一個為空的關(guān)系人集合、一個空的親緣關(guān)系數(shù)據(jù)集合及一個該親緣關(guān)系數(shù)據(jù)數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記; 第二步,將開始檢測的第一個親緣關(guān)系數(shù)據(jù)放入棧頂?shù)谝粋€分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù),然后提取數(shù)據(jù)中參與親緣關(guān)系的兩個關(guān)系人,如果不相同則均放入棧頂?shù)谝粋€分支相應(yīng)的關(guān)系人集合并將第一個分支相應(yīng)的關(guān)系長度計數(shù)器加I,然后將相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理;如果相同則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在上述親緣關(guān)系數(shù)據(jù)集合中,檢測過程結(jié)束; 第三步,如果棧為空則檢測過程結(jié)束;如果不為空對于且棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,則按照確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取棧頂分支下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),否則直接執(zhí)行第五步; 第四步,如果沒有關(guān)聯(lián)數(shù)據(jù)則得出檢測結(jié)果是棧頂分支沒有檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果有關(guān)聯(lián)數(shù)據(jù),第一個關(guān)聯(lián)數(shù)據(jù)作為棧頂分支的延續(xù)繼續(xù)使用棧頂分支的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等資源,如果有兩個或以上關(guān)聯(lián)數(shù)據(jù),則另外分別為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧同時復(fù)制一個相同的資源備份為本分支所有,以后所有操作中各個分支均為操作本分支所有的關(guān)系人集合和親緣關(guān)系數(shù)據(jù)集合,然后分別將各個關(guān)聯(lián)數(shù)據(jù)放入本分支所有的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù),同時將該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為未處理; 第五步,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人,如果本分支所有的關(guān)系人集合中不存在該關(guān)系人則將其放入該集合并將關(guān)系長度計數(shù)器加I但連續(xù)第二個及以上的平行方向關(guān)聯(lián)情況的關(guān)系長度計數(shù)器不再增加,如果本分支關(guān)系長度計數(shù)器已達關(guān)系長度最高允許值,則得出檢測結(jié)果是棧頂分支未檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果關(guān)系人集合中已存在該關(guān)系人則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在棧頂分支所有的親緣關(guān)系數(shù)據(jù)集合中,然后將棧頂分支出棧;否則將當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,然后回到第三步。
2.一種錯誤親緣關(guān)系環(huán)深度優(yōu)先檢測裝置,其特征在于,該裝置具備: 至少一個處理器;及 至少一個存儲器,含有計算機程序代碼,所述至少一個存儲器和計算機程序代碼被配置為利用所述至少一個處理器使得所述裝置 第一步,進行初始化,創(chuàng)建一個檢測分支棧并將第一個分支入棧成為棧頂分支,設(shè)置一個關(guān)系長度最高允許值,為棧頂?shù)谝粋€分支創(chuàng)建相應(yīng)的關(guān)系長度計數(shù)器并置為零及創(chuàng)建一個為空的關(guān)系人集合、一個空的親緣關(guān)系數(shù)據(jù)集合及一個該親緣關(guān)系數(shù)據(jù)數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記;第二步,將開始檢測的第一個親緣關(guān)系數(shù)據(jù)放入棧頂?shù)谝粋€分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù),然后提取數(shù)據(jù)中參與親緣關(guān)系的兩個關(guān)系人,如果不相同則均放入棧頂?shù)谝粋€分支相應(yīng)的關(guān)系人集合并將第一個分支相應(yīng)的關(guān)系長度計數(shù)器加I,然后將相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理;如果相同則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在上述親緣關(guān)系數(shù)據(jù)集合中,檢測過程結(jié)束; 第三步,如果棧為空則檢測過程結(jié)束;如果不為空對于且棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,則按照確定的親緣關(guān)系方向往上或往下(均可包括平行方向)取棧頂分支下一個關(guān)聯(lián)的同種類親緣關(guān)系數(shù)據(jù),否則直接執(zhí)行第五步; 第四步,如果沒有關(guān)聯(lián)數(shù)據(jù)則得出檢測結(jié)果是棧頂分支沒有檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果有關(guān)聯(lián)數(shù)據(jù),第一個關(guān)聯(lián)數(shù)據(jù)作為棧頂分支的延續(xù)繼續(xù)使用棧頂分支的計數(shù)器、兩個集合及當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記等資源,如果有兩個或以上關(guān)聯(lián)數(shù)據(jù),則另外分別為第二個及以上的關(guān)聯(lián)數(shù)據(jù)創(chuàng)建一個分支并入棧同時復(fù)制一個相同的資源備份為本分支所有,以后所有操作中各個分支均為操作本分支所有的關(guān)系人集合和親緣關(guān)系數(shù)據(jù)集合,然后分別將各個關(guān)聯(lián)數(shù)據(jù)放入本分支所有的親緣關(guān)系數(shù)據(jù)集合,并標記為該集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù),同時將該集合當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為未處理; 第五步,提取棧頂分支相應(yīng)的親緣關(guān)系數(shù)據(jù)集合的當(dāng)前關(guān)聯(lián)數(shù)據(jù)中參與親緣關(guān)系的另一個關(guān)系人,如果本分支所有的關(guān)系人集合中不存在該關(guān)系人則將其放入該集合并將關(guān)系長度計數(shù)器加I但連續(xù)第二個及以上的平行方向關(guān)聯(lián)情況的關(guān)系長度計數(shù)器不再增加,如果本分支關(guān)系長度計數(shù) 器已達關(guān)系長度最高允許值,則得出檢測結(jié)果是棧頂分支未檢測出錯誤親緣關(guān)系環(huán),然后將棧頂分支出棧;如果關(guān)系人集合中已存在該關(guān)系人則得出檢測結(jié)果是檢測出錯誤親緣關(guān)系環(huán)且出錯的數(shù)據(jù)集合在棧頂分支所有的親緣關(guān)系數(shù)據(jù)集合中,然后將棧頂分支出棧;否則將當(dāng)前關(guān)聯(lián)數(shù)據(jù)是否已處理的狀態(tài)標記設(shè)置為已處理,然后回到第二步。
【文檔編號】G06F19/00GK103632042SQ201310582087
【公開日】2014年3月12日 申請日期:2013年11月20日 優(yōu)先權(quán)日:2013年11月20日
【發(fā)明者】倪龍 申請人:寧波保稅區(qū)攀峒信息科技有限公司