इष्टतम द्विआधारी खोज पेड़

वोट
2

मैं इष्टतम द्विआधारी खोज के पेड़ पर एक काम है और कुछ सवाल आया ऐसा करते हुए। मैं लिंक ऑनलाइन सहायक (बस एक गूगल खोज से), लेकिन मैं सोच रहा था के कई पाया है ...

क्यों कुंजी शुरू में हल कर किया जाना चाहिए चाहिए?

अगर मैं एक कम लागत (एक इष्टतम BST के लिए) जब कुंजी पृथक नहीं किया जा मिलता है, इसका मतलब यह है मेरी कोड में कोई त्रुटि होना चाहिए?

एक इष्टतम BST पूरा / सही होना चाहिए? (पूर्ण और सही के विकिपीडिया परिभाषाओं का उपयोग)

एक परिपूर्ण द्विआधारी पेड़ एक पूर्ण द्विआधारी पेड़ जिसमें सभी पत्ते उसी गहराई या एक ही स्तर पर हो रहा है। [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