有散列給定圖的子圖(由節點和邊組成)的算法嗎?同樣,我所說的特定圖形是一個分子網絡,散列網絡子圖的目的是查看是否給定了不同的網絡,有一個特定的子圖與先前的散列子圖相匹配。哈希子圖的高效算法?
我不關心查找所有子圖本身的運行時間。我擔心給定一個特定的散列子圖和另一個子圖,我是否可以發現該子圖是否是我在O(1)時間之前見過的。
有散列給定圖的子圖(由節點和邊組成)的算法嗎?同樣,我所說的特定圖形是一個分子網絡,散列網絡子圖的目的是查看是否給定了不同的網絡,有一個特定的子圖與先前的散列子圖相匹配。哈希子圖的高效算法?
我不關心查找所有子圖本身的運行時間。我擔心給定一個特定的散列子圖和另一個子圖,我是否可以發現該子圖是否是我在O(1)時間之前見過的。
如果你的圖是非循環的(具有可變分裂級的樹), 你可以在圖的每個頂點(節點)保留一些值,即 ,它是「這個子樹的哈希」。
計算哈希樹容易BT遞歸算法,如:
// Initial value ~0 meaning "need to compute"
uint32_t subtree_hash(node *p) {
for(int attempts = 0; p->hash == ~0; attempts++) {
p->hash = compute_hash(p->value) + attempts;
foreach node *child in (p->children) {
p->hash = ((p->hash >> 7) | (p->hash << (32 - 7))) + subtree_hash(child);
}
return p->hash; // never ~0
}
假設頂點具有整數ID,我也只是湊邊的列表中子,在某些定義的順序(如詞典) ,使用通常用來散列整數對數組的散列算法。這個列表中的邊被表示爲具有固有順序的頂點對,所以如果要表示的圖實際上具有無向邊,則還需要按照某個順序對每個邊內的頂點對進行排序(例如,從最小到最大)。
你如何定義一個子?節點是相同的(身份),還是具有相同的值? – Murph
已編輯。子圖由節點以及任何邊緣(有向或無向)組成。 –
哈希子圖將如何工作?我懷疑這可能會起作用。如果你的哈希方案工作,你可以簡單地解決圖形同構問題。 IIRC,圖同構很難。 –