Optimale Binære søketrær

stemmer
2

Jeg har et oppdrag på optimale binære søketrær og noen spørsmål kom opp mens du gjør det. Jeg har funnet mange av linkene online nyttige (bare fra et Google-søk), men jeg lurte på ...

Hvorfor må nøklene først må sorteres?

Hvis jeg får en lavere kostnad (for en optimal BST) når tastene ikke er sortert, betyr det at det må være en feil i koden min?

Må en optimal BST være komplett / perfekt? (Ved hjelp av Wikipedia definisjoner av komplett og perfekt)

En perfekt binært tre er et komplett binært tre hvor alle bladene er på samme dybde eller samme nivå. [1] (Dette er tvetydig også kalt en fullstendig binært tre).

En komplett binært tre er et binært tre der alle nivå, bortsett fra muligens den siste, er helt fylt, og alle nodene er så langt til venstre som mulig. [2]

For det siste spørsmålet, vil jeg anta at en optimal treet må være komplett / perfekt, men noen av de applets online føre meg til å tro noe annet. Jeg kan ikke resonnere hvorfor men ...

Publisert på 30/09/2011 klokken 23:06
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hvorfor må nøklene i utgangspunktet sorteres?

De gjør ikke det. Faktisk, med mindre du bruker en selvbalanserende treet, er det bedre hvis du legger nøklene til treet i tilfeldig rekkefølge, fordi treet vil ende opp mer balansert.

Hvis jeg får en lavere kostnad (for en optimal BST) når tastene ikke er sortert, betyr det at det må være en feil i koden min?

Ikke med mindre du koder opp en selvbalanserende treet (din selvbalanserende algoritme fungerer ikke).

må en optimal BST være komplett / perfekt?

Ja. For å få raskest mulig etter en gitt treet, må alle treets noder være jevnt fordelt; dvs. treet må være så kort som mulig.

Svarte 30/09/2011 kl. 23:11
kilden bruker

stemmer
0
void OptimalBinsearchtree_output(float R[21][20],int i, int j, int r1, char  *dir)
{
          int t;
          if (i <= j)
          {
                         t =(int)R[i][j];
                         fprintf(wp,"%s is %s child of %s\n", name[t], dir, name[r1]);
                         OptimalBinsearchtree_output(R,i, t - 1, t, "left");
                         OptimalBinsearchtree_output(R,t + 1, j, t, "right");
          }
}

void OptimalBinarySearchTree(int n, const float p[],float *minavg)
{
          int i, j, k, diagonal,l,pos;
          float R[21][20];
          float min = 0;
          float A[21][20],sum=0;
          printf("\n");
          for (i = 1; i <=n; i++) 
          {
                         A[i][i - 1] = 0;
                         R[i][i - 1] = 0;
                         A[i][i] = p[i];
                         R[i][i] = i;
                         fprintf(wp,"A[%d][%d]=%4f\tA[%d][%d]=%4f\t",i,i-1,A[i][i-1],i,i,A[i][i]);
                         fprintf(wp,"R[%d][%d]=%4f\tR[%d][%d]=%4f\n", i, i - 1, R[i][i - 1], i, i, R[i][i]);
          }

          A[n+1][n] = 0;
          R[n+1][n] = 0;
          for (diagonal = 1; diagonal <= n - 1; diagonal++)
          {
                         for (i = 1; i <= n - diagonal; i++)
                         {
                                       min = 0;
                                       sum = 0;
                                       j = i + diagonal;
                                       for (l = i; l <=j; l++)
                                       {
                                                      sum = sum + p[l];
                                       }
                                       A[i][j] = sum;
                                       for (k = i; k <= j; k++)
                                       {
                                                      sum = A[i][k - 1] + A[k + 1][j];
                                                      if (min == 0)
                                                      {
                                                                    min = sum;
                                                                    pos = k;
                                                      }
                                                      else if (sum<min)
                                                      {
                                                                    min = sum;
                                                                    pos = k;
                                                      }
                                       }
                                       A[i][j] += min;
                                       R[i][j] = pos;
                         }
          }

          *minavg = A[1][n];
          printf("\n");
          for (i = 1; i <= n; i++)
          {
                         for (j = 0; j <= n; j++)
                         {
                                       printf("%0.3f ", R[i][j]);
                         }
                         printf("\n");
          }
          for (i = 1; i <= n; i++)
          {
                         for (j = 0; j <= n; j++)
                         {
                                       printf("%0.3f ", A[i][j]);
                         }
                         printf("\n");
          }
          fprintf(wp,"\n\n");
          fprintf(wp,"%s is the root of the tree\n",name[(int)R[1][n]]);
          int r1 = (int)R[1][n];
          OptimalBinsearchtree_output(R,1, r1 - 1, r1, "left");
          OptimalBinsearchtree_output(R,r1 + 1, n, r1, "right");

}


void removeall()
{
          nodeptr node,temp;
          node = head;
          while (node->next != NULL)
          {
                         temp = node;
                         node = node->next;
          }
          if (node == node->next)
          {
                         node->next = NULL;                     
                         temp->next = NULL;
                         free(node);
                         return;
          }
          node->next = NULL;
          temp->next = NULL;
          free(node);
}

void print()
{
          nodeptr curr = NULL, temp = NULL;
          curr = head;
          gl_index = 1;
          while (curr != NULL)
          {

                         curr->index = gl_index;
                         gl_p[gl_index] = curr->val;
                         strcpy(name[gl_index], curr->str);
                         gl_index++;
                         wp=fopen("Output.txt","w+");
                         fprintf(wp,"%s\t%f\t%d\n", curr->str, curr->val, curr->index);
                         curr = curr->next;
          }
}


void generatenode()
{


          int i, j;
          nodeptr temp = NULL;
          char a[20];

          while (!feof(fp))
          {
                         nodeptr curr = NULL, prev = NULL;
                         temp = (struct node*)malloc(sizeof(struct node));
                         fscanf(fp, "%s", &temp->str);
                         fgets(a, 20, fp);
                         temp->index = gl_index;
                         b = atof(a);
                         int flag = 0;
                         temp->val = b;
                         gl_p[gl_index] = temp->val;
                         gl_index++;
                         temp->next = NULL;
                         if (head == NULL)
                         {
                                       head = temp;
                                       curr = head;
                         }
                         else
                         {
                                       curr = head;
                                       while (!(strcmp(temp->str, curr->str) < 0))
                                       {
                                                      if(curr->next==NULL)
                                                      {
                                                                    curr->next = temp;
                                                                    curr = curr->next;
                                                                    temp->next = NULL;
                                                                    flag = 0;
                                                                    break;
                                                      }
                                                      else
                                                      {
                                                                    flag = 1;
                                                                    prev = curr;
                                                                    curr = curr->next;
                                                      }
                                       }
                                       if (curr == head)
                                       {
                                                      temp->next = curr;
                                                      head = temp;
                                       }
                                       else
                                       {
                                                      if (flag == 1)
                                                      {
                                                      prev->next = temp;
                                                      temp->next = curr;
                                                      }
                                       }
                                       flag = 0;
                         }
          }
}
Svarte 14/12/2015 kl. 02:38
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more