2011-12-19 67 views
1

我有一個算法,從可行模型的空間中抽取模型。一個模型基本上是一個公式,所以有一些等級對象結構如果數據庫中的每個模型尚未保留,我想將其保留。當我查詢數據庫時,我有什麼選擇可以快速找到模型?我明白我可以使用Criteria和示例模型來確定模型是否已經在數據庫中。有更快的方法嗎?這是我的模型結構的第一次嘗試:獨特的分層對象結構的持久性

public class Network 
{ 
    public virtual double Bias { get; set; } 
    public virtual IList<RBF> RBFs { get; set; } 
} 

public class RBF 
{ 
    public virtual double Weight { get; set; } 
    public virtual ISet<Gaussian> Gaussians { get; set; } 
} 

public class Gaussian 
{ 
    public virtual int FeatureIndex { get; set; } 
    public virtual double Mean { get; set; } 
    public virtual double StandardDeviation { get; set; } 
} 
+0

我們需要你如何在代碼結構化數據的詳細信息。一旦你有任何你想堅持代表作爲對象相互連接的對象,堅持它,並做到這一點更有可能。但是,如果不知道更多關於您正在使用的內容,很難真正幫助。另外,根據「快速」的含義,堅持數據庫的速度可能不夠快,並且可能需要緩存的內存中元素。 – cdeszaq 2011-12-19 15:15:19

+0

謝謝。請參閱編輯。 – cs0815 2011-12-19 15:31:01

+0

你認爲模型的平等嗎? 「Network.Weight」等於還是等於整個樹? – Firo 2011-12-20 17:06:58

回答

2

最快的方式,對於這樣一個複雜的平等規則,可以使用一種算法對象的圖形變換成一個字符串或字節數組,散列這個字符串或使用密碼散列函數(例如SHA1)的字節數組,並將散列與樹的根一起存儲。

當你不得不檢查,如果給定的樹在數據庫中已經存在,重新上樹的算法,並檢查所獲得的散列在數據庫中已存在。

的困難如下:

  • 兩個邏輯上等於樹木必須始終生成相同的字節數組。這意味着您必須決定您的RBF和高斯實體的訂單,並始終以相同的順序將它們序列化。
  • 比較雙打通常不是一件容易的事。您可能必須對它們進行四捨五入以確保兩個非常接近的值被認爲是相等的
  • 每次對組成該樹的任何實體進行修改時,您都必須重新計算散列值。這意味着所有的更改應該封裝在一個地方,並且始終通過樹的根。
+0

我現在認識到,我試圖做的事情或多或少是不可能的(規範化樹)。該算法必須確定(sqrt(2)+ sqrt(7-3 * sqrt(5)))/ sqrt(3-sqrt(5))實際上與sqrt(5)相同(僅僅是一個相關示例)。雖然我會接受你的回答。 – cs0815 2011-12-21 11:23:30