Βέλτιστη Binary Search Trees

ψήφοι
2

Έχω μια εργασία για τη βέλτιστη δυαδικά δέντρα αναζήτησης και μερικές ερωτήσεις ήρθε, ενώ το κάνει. Έχω βρεθεί πολλές από τις συνδέσεις στο διαδίκτυο εξυπηρετικό (μόνο από μια αναζήτηση στο Google), αλλά αναρωτιόμουν ...

Γιατί πρέπει τα κλειδιά πρέπει να διαχωρίζονται αρχικά;

Αν πάρω ένα χαμηλότερο κόστος (για τη βέλτιστη BST) όταν τα πλήκτρα δεν είναι ταξινομημένο, αυτό σημαίνει ότι πρέπει να υπάρχει ένα λάθος στον κώδικα μου;

Πρέπει η βέλτιστη BST είναι πλήρης / τέλειος; (Χρησιμοποιώντας τους ορισμούς Wikipedia πλήρους και τέλεια)

Ένα τέλειο δυαδικό δέντρο είναι ένα πλήρες δυαδικό δένδρο στο οποίο όλα τα φύλλα βρίσκονται στο ίδιο βάθος ή ίδιο επίπεδο. [1] (Αυτό διφορούμενα ονομάζεται επίσης ένα πλήρες δυαδικό δένδρο.)

Ένα πλήρες δυαδικό δένδρο είναι ένα δυαδικό δένδρο στο οποίο κάθε επίπεδο, με εξαίρεση ίσως την τελευταία, είναι εντελώς γεμάτο, και όλοι οι κόμβοι είναι εντελώς αριστερά όσο το δυνατόν. [2]

Για την τελευταία ερώτηση, θα ήθελα να υποθέσουμε ότι η βέλτιστη δέντρο πρέπει να είναι πλήρης / τέλειο, αλλά μερικά από τα μικροεφαρμογές σε απευθείας σύνδεση με κάνουν να πιστεύω το αντίθετο. Δεν μπορώ λόγος για τον οποίο όμως ...

Δημοσιεύθηκε 01/10/2011 στις 00:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Γιατί πρέπει να ταξινομηθούν αρχικά τα κλειδιά;

Δεν το κάνουν. Στην πραγματικότητα, εκτός εάν χρησιμοποιείτε μια αυτο-εξισορρόπησης δέντρο, είναι καλύτερα αν προσθέσετε τα κλειδιά στο δέντρο με τυχαία σειρά, γιατί το δέντρο θα καταλήξει πιο ισορροπημένη.

Αν πάρω ένα χαμηλότερο κόστος (για τη βέλτιστη BST) όταν τα πλήκτρα δεν είναι ταξινομημένο, αυτό σημαίνει ότι πρέπει να υπάρχει ένα λάθος στον κώδικα μου;

Όχι αν δεν είστε κωδικοποίησης μια αυτο-εξισορρόπησης δέντρο (αυτο-εξισορρόπησης αλγόριθμος δεν λειτουργεί).

πρέπει βέλτιστη BST είναι πλήρης / τέλειος;

Ναί. Για να πάρετε την ταχύτερη δυνατή αναζήτηση για ένα συγκεκριμένο δέντρο, το σύνολο των κόμβων του δέντρου πρέπει να κατανέμεται εξίσου? δηλαδή το δέντρο πρέπει να είναι όσο το δυνατόν συντομότερη.

Απαντήθηκε 01/10/2011 στις 00:11
πηγή χρήστη

ψήφοι
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;
                         }
          }
}
Απαντήθηκε 14/12/2015 στις 02:38
πηγή χρήστη

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