Optimale binäre Suchbäume

stimmen
2

Ich habe einen Auftrag auf einem optimalen binären Suchbäumen und einige Fragen kamen, während es zu tun. Ich habe viele der Links Online nützlich (gerade von einer Google-Suche) gefunden, aber ich frage mich, ...

Warum müssen müssen die Schlüssel zunächst sortiert werden?

Wenn ich ein niedriger Kosten (für eine optimale BST) erhalten, wenn die Schlüssel nicht sortierten, bedeutet, dass es muss ein Fehler sein, in meinem Code?

Muss eine optimale BST komplett / perfekt sein? (Unter Verwendung der Wikipedia-Definitionen von vollständig und perfekt)

Eine perfekte Binärbaum ist eine vollständige Binärbaum in dem alle Blätter in der gleichen Tiefe oder gleiches Niveau sind. [1] (Dieser zweideutig ist auch ein vollständiger binärer Baum genannt.)

Ein vollständiger binärer Baum ist ein binärer Baum, in dem jede Ebene, mit Ausnahme vielleicht die letzten, vollständig gefüllt ist und alle Knoten sind so weit wie möglich nach links. [2]

Für die letzte Frage, würde ich davon ausgehen, dass ein optimaler Baum komplett / muss perfekt sein, aber einige der Applets Online führen mich sonst zu glauben. Ich kann nicht, warum, obwohl die Vernunft ...

Veröffentlicht am 01/10/2011 um 00:06
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Warum müssen die Schlüssel zunächst sortiert?

Tun sie nicht. In der Tat, wenn Sie einen selbstausgleich Baum verwenden, ist es besser, wenn Sie die Schlüssel zu dem Baum in zufälliger Reihenfolge hinzufügen, weil der Baum ausgeglichener enden.

Wenn ich ein niedriger Kosten (für eine optimale BST) erhalten, wenn die Schlüssel nicht sortierten, bedeutet, dass es muss ein Fehler sein, in meinem Code?

Nicht, wenn Sie Codierung eines selbstausgleich Baum (Ihr Selbst-Balancing-Algorithmus funktioniert nicht).

muss eine optimale BST komplett / perfekt sein?

Ja. Um die schnellstmögliche Suche nach einem bestimmten Baum zu bekommen, alle Knoten des Baumes gleichmäßig verteilt werden muß; dh der Baum muss so kurz wie möglich sein.

Beantwortet am 01/10/2011 um 00:11
quelle vom benutzer

stimmen
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;
                         }
          }
}
Beantwortet am 14/12/2015 um 02:38
quelle vom benutzer

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