уникальная стойкость иерархической структуры объекта - PullRequest
1 голос
/ 19 декабря 2011

У меня есть алгоритм, который выбирает модели из пространства возможных моделей.Модель - это, по сути, формула, поэтому некоторая иерархическая структура объекта.Я хотел бы сохранить каждую модель в базе данных, если она еще не сохранена.Каковы мои варианты, чтобы найти модель очень быстро, когда я запрашиваю базу данных?Я понимаю, что могу использовать критерии и пример модели, чтобы определить, есть ли модель уже в базе данных.Есть ли более быстрый способ?Это моя первая попытка структуры модели:

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; }
}

1 Ответ

2 голосов
/ 21 декабря 2011

Самый быстрый способ для такого сложного правила равенства - использовать алгоритм для преобразования графа объектов в массив строк или байтов, для хеширования этой строки или байтового массива с помощью криптографической хеш-функции (например, SHA1)и хранить хэш вместе с корнем дерева.

Когда вам нужно проверить, существует ли данное дерево в базе данных, повторно применить алгоритм к дереву и проверить, существует ли полученный хеш уже в базе данных.

Трудности заключаются в следующем:

  • два логически равных дерева всегда должны генерировать один и тот же байтовый массив.Это означает, что вы должны выбрать порядок для ваших RBF и гауссовых сущностей и всегда сериализовать их в одном и том же порядке
  • . Сравнение двойных чисел обычно не простая задача.Возможно, вам придется округлить их, чтобы убедиться, что два очень близких значения считаются равными
  • . Вы должны пересчитывать хэш каждый раз, когда вносится изменение в любую из сущностей, составляющих дерево.Это означает, что все изменения должны быть заключены в одном месте и всегда проходить через корень дерева.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...