2011-12-19 70 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