double closestpair(ArrayList<Point> Px,ArrayList<Point> Py)
{
  if (Px.size()<=12){
    double closest=Double.MAX_VALUE;
    for(int i=0;i<Px.size();i++){
      for(int j=i+1;j<Px.size();j++){
        closest=Math.min(distance(Px.get(i), Px.get(j)),closest);
      }
    }
    return closest;
  }
  double x=Px.get(Px.size()/2).x;
  ArrayList<Point> Lx=new ArrayList<Point>();
  ArrayList<Point> Ly=new ArrayList<Point>();
  ArrayList<Point> Rx=new ArrayList<Point>();
  ArrayList<Point> Ry=new ArrayList<Point>();
  for(Point p: Px){
    if (p.x<x)
      Lx.add(p);
    else
      Rx.add(p);
  }
  for(Point p: Py){
    if (p.x<x)
      Ly.add(p);
    else
      Ry.add(p);
  }
  double d1=closestpair(Lx,Ly);
  double d2=closestpair(Rx,Ry);
  double delta=Math.min(d1,d2);
  double split=closestsplitpair(Px,Py,delta,x);
  return Math.min(delta, split);
}
示例#2
0
struct PointPair closestpair(struct Point p[],int n)
{
	if(n<=3)
		return brute(p,n);
	int mid=n/2;
	struct Point midp=p[mid];
	struct PointPair dl = closestpair(p,mid);
	struct PointPair dr = closestpair(p+mid,n-mid);
	struct PointPair d = minpp(dl,dr);
	struct Point strip[n];
    int i=0,j = 0;
    for (i = 0; i < n; i++)
        if (abs(p[i].x - midp.x) < d.dist)
            strip[j] = p[i], j++;
	return minpp(d,stripClosest(strip,j,d));
}
void main()
{
  printf("Enter positions (max 10) : ");
  int a[10]={0,0},i;
  for(i=0;i<10;i++)
    scanf("%d",&a[i]);
  Quicksort(a,0,9);
  closestpair(a,10);
}
示例#4
0
int main()
{
	int n,i;
	scanf("%d",&n);
	struct Point parr[n];
	for(i=0;i<n;i++)
	{
		parr[i].x=inp();
		parr[i].y=inp();
		parr[i].in=i;
	}
	qsort(parr,n,sizeof(struct Point),comX);
	struct PointPair mp=closestpair(parr,n);
	if(mp.in1>mp.in2){i=mp.in1;mp.in1=mp.in2;mp.in2=i;}
	printf("%Lf\n",mp.dist);
	return 0;
}
示例#5
0
void main() {
    int *v, n, i;

    printf("Digite o tamanho do vetor\n");
    scanf("%d", &n);
    /*
        alocando espaco para vetor
     */
    v = calloc(n, sizeof (int));

    for (i = 0; i < n; i++) {
        printf("Digite o %d valor do vetor\n", i);
        scanf("%d", &v[i]);
    }

    quicksort(v, 0, n - 1);

    char stropc[] = "\n\n0 - Sair\n1 - Exibir o vetor ordenado\n2 - Closest Pair\n3 - Element uniqueness\n4 - Frequency distribution\n";
    printf("%s", stropc);
/*
    menu para o usuario escolher comando a ser executado
*/
    int opc;
    scanf("%d", &opc);
    while (opc > 0) {
        switch (opc) {
            case 1:
            {
                imprimevetor(v, n);
                break;

            }
            case 2:
            {
                closestpair(v, n);
                break;
            }
            case 3:
            {
                elementuniqueness(v, n);
                break;
            }
            case 4:
            {
                frequencydistribution(v, n);
                break;
            }
            default:{
                printf("\nOpcao invalida\n");
                break;
            }
        }

        printf("%s", stropc);
        scanf("%d", &opc);
        
    }

    /*
        desalocando memoria
     */
    free(v);
    v = NULL;
    return;
}