Как мне изменить функцию вставки и удаления Min Heap, чтобы она принимала второе сравнение, если первичное сравнение оказывается равным? - PullRequest
0 голосов
/ 19 июля 2010

ниже У меня есть стандартная функция вставки и удаления для Min Heap, что мне нужно сделать, это добавить особый случай к обеим функциям, когда сравнение T.num окажется равным, затем мне нужно сравнить T .Letter, где сначала выводится нижнее значение Ascii. Без комментариев это стандартная вставка и удаление, добавление закомментированного раздела было бы моей попыткой добавить новую функцию, которая, на мой взгляд, не понимаю, почему она не будет работать.

void MinHeap<T>::insert(T& e)
{
  int CurrNode = ++HeapSize;
  while(CurrNode != 1 && heap[CurrNode/2].num >= e.num)
    { 
      /*
      if(heap[CurrNode/2].num == e.num)
        if(heap[CurrNode/2].letter <= e.letter)
          break;
      */
      heap[CurrNode] = heap[CurrNode/2];
      CurrNode /= 2;
    }
  heap[CurrNode] = e;
}

void MinHeap<T>::delet()
{  
      T LastNode = heap[HeapSize--];  
      int CurrNode = 1;
      int child = 2;
      while(child <= HeapSize)
        {
          if(child < HeapSize && heap[child].num >= heap[child+1].num)
           {
             /*
             if(heap[child].num == heap[child+1].num)
               if(heap[child].letter <= heap[child+1].letter)
                child--;
             */
             child++;
           }

          if(LastNode.num <= heap[child].num) 
          {
            /*
            if (LastNode.num == heap[child].num)
            {
              if (LastNode.letter <= heap[child].letter)
                break;
            }
            else
            */
            break;
          }    
          heap[CurrNode] = heap[child];
          CurrNode = child;
          child *= 2;
        }
      heap[CurrNode] = LastNode;
}

1 Ответ

1 голос
/ 19 июля 2010

Вы можете просто перегрузить оператор сравнения для типа T, например:

bool operator >(const T &left, const T &right) {
  return left.num > right.num ||
         left.num == right.num && left.letter <= right.letter;
}

А затем заменить heap[CurrNode/2].num >= e.num на heap[CurrNode/2] > e.

Лучше избегать кода, подобного тому, что есть в ваших закомментированных разделах, потому что он может быстро запутаться, чтобы следовать и отлаживать.

...