Hashing a Tree Structure

后端 未结 11 2016
渐次进展
渐次进展 2020-11-28 04:00

I\'ve just come across a scenario in my project where it I need to compare different tree objects for equality with already known instances, and have considered that some so

11条回答
  •  醉话见心
    2020-11-28 04:11

    class TreeNode
    {
      public static QualityAgainstPerformance = 3; // tune this for your needs
      public static PositionMarkConstan = 23498735; // just anything
      public object TargetObject; // this is a subject of this TreeNode, which has to add it's hashcode;
    
      IEnumerable GetChildParticipiants()
      {
       yield return this;
    
       foreach(var child in Children)
       {
        yield return child;
    
        foreach(var grandchild in child.GetParticipiants() )
         yield return grandchild;
      }
      IEnumerable GetParentParticipiants()
      {
       TreeNode parent = Parent;
       do
        yield return parent;
       while( ( parent = parent.Parent ) != null );
      }
      public override int GetHashcode()
      {
       int computed = 0;
       var nodesToCombine =
        (Parent != null ? Parent : this).GetChildParticipiants()
         .Take(QualityAgainstPerformance/2)
        .Concat(GetParentParticipiants().Take(QualityAgainstPerformance/2));
    
       foreach(var node in nodesToCombine)
       {
        if ( node.ReferenceEquals(this) )
          computed = AddToMix(computed, PositionMarkConstant );
        computed = AddToMix(computed, node.GetPositionInParent());
        computed = AddToMix(computed, node.TargetObject.GetHashCode());
       }
       return computed;
      }
    }
    

    AddToTheMix is a function, which combines the two hashcodes, so the sequence matters. I don't know what it is, but you can figure out. Some bit shifting, rounding, you know...

    The idea is that you have to analyse some environment of the node, depending on the quality you want to achieve.

提交回复
热议问题