比較兩個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...