Я пытаюсь проверить, совпадают ли два узла, что означает, что у них одинаковое количество дочерних элементов, и что эти дочерние элементы приводят к одинаковым состояниям.Поэтому я эффективно пытаюсь сравнить поддеревья на двух узлах.Мне интересно, могу ли я использовать хеширование для проверки равенства.
Нет, хеширование не должно использоваться для проверки равенства.Это не его цель.Это может в конечном итоге помочь вам выяснить, не равны ли объекты, но ничего не скажет вам, если они равны.
Одни и те же объекты будут генерировать одинаковое значение хеш-функции, но два разных объекта, которые не равны, могут генерироватьтот же хэш тоже.Другими словами, если значения хеша разные, вы точно знаете, что объекты разные.Вот и все.
Если вы хотите проверить равенство, вам нужно реализовать равно.В вашем случае существует опасность, что ваш метод станет рекурсивным и вызовет переполнение стека.Что если ваш объект содержит ссылку на себя?
Если вы хотите сгенерировать хеш, вы можете принять во внимание размер массива (и тот факт, что он равен нулю или нет), но я бы не сталпопробуйте использовать значение хеш-функции объектов в массиве из-за потенциальных бесконечных циклов.Он не идеален, но достаточно хорош.
Существует еще один радикальный метод, который также может обеспечить хороший результат.Вместо динамического вычисления хеш-значений, установите случайное значение int для каждого экземпляра объекта Node (я имею в виду один раз для всех при создании и всегда возвращаю это значение).В вашем случае вы не рискуете бесконечными циклами, принимая значение хэша экземпляров объекта в вашем массиве.
Если хэши равны, то вам нужно начать сравнивать экземпляры объекта массива.
REM: Если узлы содержат другие атрибуты, то вычислите хэш для этих других атрибутов и забудьте о массиве.Начните исследовать содержимое / размер массива, если и только если хэш идентичен между двумя объектами.
REM2: В комментариях упоминается график DAG, что означает, что мы не столкнемся с проблемами рекурсивности.Однако этого условия недостаточно, чтобы гарантировать успешное выполнение deepHashCode ().Более того, это было бы слишком.Существует более эффективный способ решения этой проблемы.
Если хеш-метод, используемый Node only , использует массив для вычисления значения хеш-функции, то deepHashCode () может работать.Но это не будет эффективным.Если в хэш-методе используются другие атрибуты узла, эти атрибуты также должны быть равными.
Существует более быстрый способ сравнения узлов на равенство.Пометьте каждый экземпляр узла уникальным номером.Затем, чтобы сравнить два узла, сначала сравните их размер массива.Если он равен, то сравните узлы из каждого массива, используя их уникальный номер.Если один массив не «имеет» другой узел, то мы не имеем дело с равными узлами.Это решение намного быстрее, чем рекурсивное.