用連連看的方法比較XML文件

2021-08-23 13:53:39 字數 1127 閱讀 2306

比較兩個xml文件在語義上相等,比想的要難一點。例如,下面的兩個xml文件

1.xml

bb

2.xml

bb

排列有些不同,但內容還是一樣的.

如果用dom比較的話,演算法基本上就是,

1 解析第乙個文件,構成乙個結點樹

2 遍歷第二個文件結點,搜尋第乙個文件樹,找到對應的結點,比較。

但問題是怎麼找到對應的結點,首先是結點位置的層次問題,其次怎麼確定對應關係。

對於層次問題,我們可以標記,在同一級的兄弟結點上比較。

但就算我們縮小了範圍,對於沒有特殊標記的結點,比如這樣的標籤,還是很難確定對應關係,就算是想排序都沒有關鍵字。

雖然我也知道,基於樹都可以做遞迴,去簡化設計,但真沒想出來:<

最後還是連連看的靈感。打碎再比較.

基本的思路,

把結點分成兩類,有body的和沒有body的.

比如上面的xml檔案,

就可以分成有body的bb;沒有body的, , ,這幾個結點.最終的目標就是比較這些打碎的tag.

同時流式解析兩個xml檔案,,並為每乙個檔案生成相應的乙個tag棧.

把乙個tag壓進棧,要分兩次進行,第一次,壓進,如果有body的話,把body也壓進去.第二次,壓入.

這樣我們還需要乙個指標棧,標記未完全壓入棧的tag.

同時把完全壓入棧的元素,放到乙個比較佇列裡.,每完全壓入乙個元素,就比較兩個棧的比較佇列.如果相同,就刪除這個tag.如果兩個xml檔案,基本相似的話,比較佇列的size都會保持比較小的值.節省很多的遍歷開支.

完成xml的解析後,只要比較兩個棧中比較佇列的大小,如果都為空,那麼這兩個xml就是內容相等的.

但這個的演算法,忽略了結點的位置資訊.

比如,和

也會被等同.

這裡做了乙個簡單的擴充套件.為每乙個tag加乙個id屬性,

第乙個壓入未完全壓入棧的tag的id值為該tag的和body字串的hashcode值.

以後入棧的tag的id值是未完全壓入棧棧頂元素id值+該tag的和body的hashcode值.比較時,先比較乙個id然後再比較內容.

目前只完成了乙個很簡單的實現.還不能比較不同排列的屬性,但對於我的需求來說,已經足夠了.

《連連看》的演算法

連連看所要求的是 1 兩個目標是相同的 2 兩個目標之間連線線的折點不超過兩個。連線線由x軸和y軸的平行線組成 那麼分析一下連線的情況可以看到,一般分三種情況 1 直線相連 2 乙個折點 3 兩個折點 如圖 可以發現,如果有折點,每個折點必定有且至少有乙個座標 x或者y 是和其中乙個目標點是相同的,...

連連看演算法的實現

圖 0,0,0,0,0,0,0,0,0,0 0,8,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0 0,0,0,0,...

連連看演算法的實現

連連看演算法的實現 收藏 圖 0,0,0,0,0,0,0,0 0,0 0,8,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0...