Использование хэша в C # - PullRequest
       6

Использование хэша в C #

0 голосов
/ 08 января 2011

У меня много объектов. Я должен оценить одного из своих членов. Они один за другим. Первый оценивает их один за другим --------> псевдокод

while (anyObjectExists)
{
      Class1 obj = getObject();
      double evalNum = eval(obj.member1);
}

но eval - это трудоемкий метод. и многие объекты имеют одинаковый member1. member1 - это массив типа sbyte. Поэтому я попытался найти другой путь. Это был мой путь: -------> псевдокод

HashTable evaluatedObject = new HashTable();
while(anyObjectExists)
{
      Class1 obj = getObject();
      if (evaluatedObjects.Contain(obj))
      {
            double evalNum = evaluatedObjects[obj];
      }
      else
      {
            double evalNum = eval(obj.member1);
            evaluatedObjects.Add(obj, evalNum);
      }
}

Я знал, что должен переопределить метод getHashCode и Equals для sbyte. Как видите, метод eval использует только member1 из Class1. Таким образом, я добавил методы в свой Class1 следующим образом

    public override int GetHashCode()
    {
        return 1;
    } 
    public override bool Equals(Object compareState)
    {
        if (!this.member1.SequenceEqual(((Class1)compareState).member1))
            return false;
        return true;
    }

Ok. Я думал, что это сделано. Но когда я запускаю свою программу ... это чертовски медленная программа. Это намного медленнее, чем первая программа. Я проверял это. Он может найти добавленные объекты. В этом нет ничего плохого. Но это очень, очень медленно. Я хоть хеш могу извлечь данные в 1 или 2 кадра. Что я не прав?

Любая помощь будет приветствоваться.

Ответы [ 3 ]

2 голосов
/ 08 января 2011

Не устанавливайте HashCode в 1, потому что это сделает необходимым для структур данных, использующих хеширование, для обработки множества коллизий. В этом случае не будет никакой разницы между использованием хеш-таблицы или связанного списка. При поиске объекта (например, путем вызова метода Cointains) необходимо будет оценить каждый объект в вашей коллекции, сложность O (N), а не обращаться к объекту по его хэш-коду, сложность O (1).

2 голосов
/ 08 января 2011

Вы должны вернуть действительный хеш-код, например, this.member1.Count().GetHashCode(), а не 1, в вашем случае он всегда сравнивает их по их хешу, а поскольку они одинаковые, сравнивают их по их равенству, и ваша функция работает медленнее.*

Редактировать: Также я думаю, что ваша функция eval быстрее, чем ваша работа над последовательностью равна.на самом деле ваш (Class1)compareState занимает много времени, а также сравнение последовательностей также занимает много времени.

1 голос
/ 08 января 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...