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

コード内でデータをどのように構造化するかについての詳細が必要です。相互に接続するオブジェクトとしてコード内に表現されたままにしたいものがあれば、そのオブジェクトを永続化して高速化することが可能です。しかし、あなたが働いていることをもっと知らなくても、本当に助けてくれるのは難しいです。また、あなたが "高速"で何を意味するかによっては、DBへの永続性が十分に速くない可能性があり、メモリ内にキャッシュされた要素が必要になることがあります。 – cdeszaq

+0

ありがとうございます。編集を参照してください。 – cs0815

+0

モデルの平等性はどのように考えていますか? 'Network.Weight'は等しいか、ツリー全体が等しいか? – Firo

答えて

2

、このような複雑な平等の原則のために、この文字列をハッシュするために、文字列またはバイト配列にオブジェクトのグラフを変換するためのアルゴリズムを使用することができ、最速の方法暗号化ハッシュ関数(たとえばSHA1)を使用してバイト配列を作成し、ハッシュをツリーのルートと一緒に格納します。

特定のツリーがすでにデータベースに存在するかどうかを確認する必要がある場合は、ツリーにアルゴリズムを再適用し、取得したハッシュがデータベースに既に存在するかどうかを確認します。

困難は次のとおりです。

  • 2論理的に等しい木が常に同じバイト配列を生成する必要があります。これは、RBFとGaussianエンティティの順序を決定し、常に同じ順序でシリアル化する必要があることを意味します。
  • 倍を比較することは、通常、簡単な作業ではありません。非常に近い2つの値が等しいとみなされるように丸めなければならないでしょう
  • ツリーを構成するエンティティのいずれかに変更が加えられるたびに、ハッシュを再計算する必要があります。つまり、すべての変更を1つの場所にカプセル化し、常にツリーのルートを通過させる必要があります。
+0

私がやろうとしていることは、ほぼ不可能です(canonicalising trees)。このアルゴリズムは、(sqrt(2)+ sqrt(7-3 * sqrt(5)))/ sqrt(3 - sqrt(5))が実際にsqrt(5) )。私はあなたの答えを受け入れるだろう。 – cs0815

関連する問題