Оцените дерево в C++

Нам нужен ADT, имеющий функции разряда и поиск. Таким образом, в дополнение к интерфейсу карты STL требуется функциональный 'интервал get_rank (ключ)'.

Стандартная реализация такой функции требует поддержки и обновления дополнительного целочисленного поля в каждом узле самосбалансированного дерева поиска (например, в черно-красном дереве, используемом в карте/наборе STL). Но это кажется, карта/набор STL не делают этого.

Мы ищем решение на основе стандартных контейнеров (STL, Повышение) наличие самой лучшей Временной сложности: находят/добавляют/стирают, что элемент берет O (зарегистрируйте n) (как в карте/наборе STL), вычисление разряда ключом берет также O (зарегистрируйте n).

Разрядом элемента мы имеем в виду положение элемента в отсортированной последовательности всех элементов карты/набора.

Пример. набор = {0, 4, 6, 7, 8} разряд (0) =1, разряд (4) =2, разряд (6) =3, разряд (7) =4, разряд (8) =5.

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

Спасибо.

8
задан Joel 3 November 2013 в 19:30
поделиться

2 ответа

Предполагается, что вы ссылаетесь на goog.dom.DomHelper - это, похоже, обеспечивает эффективное решение для работы с DOM в разных браузерах.

-121--3383498-

Не делайте этого .

Это означает, что вы должны иметь возможность сделать это, сделав свое окно ребенком другого.

-121--3586937-

Ранг данного ключа K - это число ключей, которое меньше или равно K.

Например, пусть набор = {1, 3, 4, 6, 9}. Затем ранг (1) = 1, ранг (4) = 3, ранг (9) = 5.

Расстояние функции STL () может использоваться для вычисления ранга элемента x, появляющегося в наборе s.

rank = distance (s.begin (), s.find (x));

Проблема заключается в том, что его временная сложность составляет O (n).

Обратите внимание, что предлагаемые две карты (или наборы), индексированные по ключу и рангу, не являются правильным решением. Проблема в том, что смена одного элемента влияет на ряды многих других. Например, добавление элемента 0 в набор s выше изменяет ранги всех существующих элементов: s «» = {0, 1, 3, 4, 6, 9}. ранг (1) = 2, ранг (4) = 4, ранг (9) = 6.

Спасибо.

5
ответ дан 5 December 2019 в 20:16
поделиться

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

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

namespace detail
{
  template <class Comparator>
  class CounterComparator: Comparator
  {
  public:
    CounterComparator(size_t& counter):
        Comparator(), mCounter(&counter) {}
    CounterComparator(Comparator comp, size_t& counter):
        Comparator(comp), mCounter(&counter) {}

    template <class T, class U>
    bool operator()(T& lhs, U& rhs) const
    { 
      ++(*mCounter);
      return this->Comparator::operator()(lhs,rhs);
    }
  private:
    size_t* mCounter;
  };
} // namespace detail

template <
  class Key, 
  class Value, 
  class Cmp = std::less<Key>, 
  class Allocator = std::allocator< std::pair<const Key,Value> >
>
class SuperMap
{
  typedef detail::CounterComparator<Cmp> Comparator;
public:
  SuperMap(): mCounter(0), mData(Comparator(mCounter)) {}

  Value& operator[](const Key& key) { return mData[key]; }

  size_t rank(const Key& key) const
  { 
    mCounter = 0; mData.find(key); return mCounter;
  }

private:
  typedef std::map<Key,Value, Comparator, Allocator> data_type;

  mutable size_t mCounter;
  data_type mData;
}; // class SuperMap

int main(int argc, char* argv[])
{
  SuperMap<int,int> superMap;
  superMap[1] = 42;
  std::cout << superMap.rank(1) << std::endl;
}

// outputs
// 2

Он считает количество тестов, но поскольку std::map прекращает тестирование, как только получает правильный ключ... все должно быть в порядке :) Хотя, возможно, там есть какое-то смещение для вывода (1 или 2), чтобы получить ранг вместо этого.

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

0
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: