this.joinersNeedTiles=joinersNeedTiles;
    public GreedierPartitioner(SIRStream str,WorkEstimate work,int numTiles) {	this.str=str;	this.work=work;	this.numTiles=numTiles;	pairs=new TreeMap(new Comparator() {		public int compare(Object o1,Object o2) {		    if(o1==o2)			return 0;		    int work1=((Pair)o1).work;		    int work2=((Pair)o2).work;		    if(work1==work2) {			/*if(o1.hashCode()<o2.hashCode())			  return -1;			  else			  return 1;*/			return o1.hashCode()-o2.hashCode();			/*System.out.println("BLAH: "+((Pair)o1).n1+" "+((Pair)o1).n2+" "+((Pair)o2).n1+" "+((Pair)o2).n2);			  SIRContainer parent1=((Pair)o1).n1.filter.getParent();			  SIRContainer parent2=((Pair)o2).n1.filter.getParent();			  double half=((double)(parent1.size()-1))/2;			  double half2=((double)(parent2.size()-1))/2;			  double dist1=Math.abs(half-parent1.indexOf(((Pair)o1).n1.filter));			  double dist2=Math.abs(half2-parent2.indexOf(((Pair)o2).n1.filter));			  if(dist1==dist2)			  if(o1.hashCode()<o2.hashCode())			  return -1;			  else			  return 1;			  else if(dist1>dist2)			  return -1;			  else			  return 1;*/		    } else			return work1-work2;		    /*else if(work1<work2)		      return -1;		      else		      return 1;*/		}	    });	nodes=new TreeMap(new Comparator() {		public int compare(Object o1,Object o2) {		   if(o1==o2)		       return 0;		   int work1=((Node)o1).work;		   int work2=((Node)o2).work;		   if(work1==work2)		       if(o1.hashCode()<o2.hashCode())			   return -1;		       else			   return 1;		   else if(work1<work2)		       return -1;		   else		       return 1;		}	    });	buildNodesList();    }