我試圖找出一個有效的算法,它需要兩個QAbstractItemModels(樹)(A,B)並計算它們之間的差異,以便獲得A中不存在的項的列表(但在B - 添加),或已被修改/刪除的項目。比較兩個QAbstractItemModels
我能想到的唯一的當前方式是對B中的每個項目項進行A的廣度搜索,但這看起來效率不高。任何想法都歡迎。
我試圖找出一個有效的算法,它需要兩個QAbstractItemModels(樹)(A,B)並計算它們之間的差異,以便獲得A中不存在的項的列表(但在B - 添加),或已被修改/刪除的項目。比較兩個QAbstractItemModels
我能想到的唯一的當前方式是對B中的每個項目項進行A的廣度搜索,但這看起來效率不高。任何想法都歡迎。
你試過使用魔法嗎?
儘管如此,這是一個非常廣泛的問題,特別是如果我們考慮它是QAbstractItemModels
而不是QAbstractListModel
。對於一個列表來說它會簡單得多,但是一個抽象的項目模型實現了一個樹結構,所以有很多變量。
您需要進行所有這些考慮並提出一個有效的解決方案。不要指望它會像「書本算法」一樣簡單。好消息是,因爲你正在處理孤立的項目,所以比爲文本做這件事要容易得多,而對於後者,你不可能希望得到與孤立項目一樣簡潔的任何地方。我已經得到了一些荒謬的愚蠢的github diff結果。
而且,如果這是您的實際目標,通過跟蹤派生數據集的歷史記錄要比做盲目比較要容易得多。如果要確定添加內容,刪除內容,移動內容和修改內容,則跟蹤歷史記錄要容易得多。因爲它會考慮實際的事件流,而不僅僅是最終的結果比較。特別是如果你沒有實施任何持久性ID方案。有沒有辦法判斷項目X是否已被刪除或移動到新的級別/索引和修改過的東西。
另外,只有在經驗性地確定了性能問題後才擔心效率問題。一些算法可能看起來過於複雜,但現代機器過於快速,除非你在緊密循環中運行,否則你不應該擔心。最終,它不會歸結爲它的複雜程度,它歸結爲它是否足夠快。
你應該澄清你的問題。我不清楚你的意思是「差異」。可能有2種差異:樹結構的差異和節點值的差異。目前還不清楚,您想如何比較節點(應該將哪些數據用作關鍵字)? –
你可以建立兩個'std :: vector',然後對它們進行排序並使用自定義比較器(從相應模型中獲取數據),然後使用'std :: set_difference'(也有類似的比較器)來獲取區別。這應該是O(n log(n))而不是O(n^2)。或者如果您從空樹開始 - 您可以在每次插入/刪除模型時保持不同。但正如@Saz所說,需要更多細節。 –
Rostislav
@Rostislav - 這可能適用於原始值,但我非常懷疑它可用於功能數據樹。 – dtech