WedX - журнал о программировании и компьютерных науках

Временная сложность операций TreeMap — subMap, headMap, tailMap

Кто-нибудь знает временную сложность операций типа TreeMap - subMap, headMap. хвостКарта.

Временная сложность операций типа get, put составляет O(logn). Но в javadoc мало говорится о сложности вышеуказанных операций.

Сложность наихудшего случая, которую я могу представить, равна O(n), поскольку она будет проходить по всему списку, если набор включает последний элемент. Можем ли мы это подтвердить?

12.01.2013

  • В любом случае, простой взгляд на источник TreeMap покажет, что это операции O(1). Документация даже намекает на это, заявляя, что подкарта использует исходную карту. 12.01.2013

Ответы:


1

Для этих вопросов очень полезно иметь под рукой исходный код, так как при достаточной поддержке IDE вы можете просто просмотреть реализацию. При просмотре исходного кода TreeMap видно, что все три метода создают новую карту, используя конструктор AscendingSubMap:

public NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
                                K toKey,   boolean toInclusive) {
    return new AscendingSubMap(this,
                               false, fromKey, fromInclusive,
                               false, toKey,   toInclusive);
}

Что не делает ничего, кроме передачи параметров с помощью суперконструктора в класс NavigableSubMap:

super(m, fromStart, lo, loInclusive, toEnd, hi, hiInclusive);

Итак, все три метода основаны на следующем конструкторе:

NavigableSubMap(TreeMap<K,V> m,
                boolean fromStart, K lo, boolean loInclusive,
                boolean toEnd,     K hi, boolean hiInclusive) {
    if (!fromStart && !toEnd) {
        if (m.compare(lo, hi) > 0)
            throw new IllegalArgumentException("fromKey > toKey");
    } else {
        if (!fromStart) // type check
            m.compare(lo, lo);
        if (!toEnd)
            m.compare(hi, hi);
    }

    this.m = m;
    this.fromStart = fromStart;
    this.lo = lo;
    this.loInclusive = loInclusive;
    this.toEnd = toEnd;
    this.hi = hi;
    this.hiInclusive = hiInclusive;
}

Все, что я вижу здесь, это вызовы compare для проверки типов и утверждений. Следовательно, это должно быть в значительной степени O(1).

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

12.01.2013
  • Получение их - O (1), для их повторения потребуется больше. Итератор вызывает Successor() N раз, где N — количество элементов между диапазоном. Я бы сказал О(Н). 02.01.2016

  • 2

    Мне удалось просмотреть исходный код TreeMap, чтобы получить подробную реализацию.

    Если вы подробно расскажете об исходном коде о том, как они на самом деле получают подкарту, это что-то вроде этого...

    Если вы видите метод размера NavigableSubMap

      public int size() {
            return (fromStart && toEnd) ? m.size() : entrySet().size();
        }
    

    Реализация entrySet() при множественных вызовах final вызывает функцию getCeilingEntry()

    final Entry<K,V> getCeilingEntry(K key) {
        Entry<K,V> p = root;
        while (p != null) {
            int cmp = compare(key, p.key);
            if (cmp < 0) {
                if (p.left != null)
                    p = p.left;
                else
                    return p;
            } else if (cmp > 0) {
                if (p.right != null) {
                    p = p.right;
                } else {
                    Entry<K,V> parent = p.parent;
                    Entry<K,V> ch = p;
                    while (parent != null && ch == parent.right) {
                        ch = parent;
                        parent = parent.parent;
                    }
                    return parent;
                }
            } else
                return p;
        }
        return null;
    }
    

    ТАК я думаю, чтобы получить реальную карту из созданной подкарты; временная сложность больше O(1).

    12.01.2013
  • Где методы subMap, headMap, tailMap вызывают NavigableSubMap.size()? 12.01.2013
  • Да, они не вызывают, но они вызывают getceilingentry() в последующих вызовах, таких как метод size(). Я просто использовал size() в качестве примера. 12.01.2013
  • Все три метода вызывают только конструкторы, ведущие к NavigableSubMap. Где они вызывают GetCeilingEntry()? См. строку 826, которая ведет к строке 1677, которая, наконец, приводит к строке 1235. 12.01.2013
  • Хорошо, позвольте мне объяснить это так. Когда вы делаете это treesetobj.subMap(args), он создает объект navigableSubMap (скажем, navobj). Но когда вы делаете navobj.keySet(), он вызывает функцию getCeilingEntry(). Так что это похоже на то, что он не создает фактическую подкарту при вызове конструктора. Только когда вызываются такие операции, как keySet() и size(), он фактически пытается получить подкарту. 12.01.2013
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]