Nano Hash - криптовалюты, майнинг, программирование

Какова временная и пространственная сложность этого алгоритма?

Какова временная и пространственная сложность этого алгоритма?

Я рассчитываю временную сложность WC следующим образом:

  1. все инициации должны быть O(1) каждый

  2. для цикла будет O (n), потому что

    • outer for loop to run max of n times,
    • инициации будут стоить 1 каждое,
    • внутренний цикл for выполняется максимум 17 раз, и
    • операторы if и присваивания будут стоить 1 каждый.
    • Я вычисляю O((n+1+1)*(17+1+1+1+1+1+1+1+1+1+1+1+1+1), а затем игнорирую константу O(n).
  3. временная сложность второй части алгоритма будет следующей:

    • Initiation of List to be of cost 1
    • чтобы цикл был 17
    • Инициация встречи будет стоить 1
    • если оператор будет стоить 1
    • инициирование indexOfEndTime равным 1
    • чтобы цикл был 16
    • если оператор должен быть 1
    • задание по 1 каждому
    • O(1+(17+1+1+1+1+1+1)*(16+1+1+1+1)+1), что является просто постоянным значением, скажем, c.
  4. T(n) = Шаг 1 + Шаг 2 + Шаг 3 = O(1+n+c), что означает, что моя временная сложность в наихудшем случае равна O(n).

Это правильно? Не могли бы вы подтвердить, все ли мои расчеты были правильными? В этом случае наилучшая временная сложность будет O(1)? Имеет ли смысл рассматривать средний случай, и если да, то как это выяснить?

Наконец, я вычисляю лучшую/среднюю/худшую пространственную сложность как O(n).

    public static List<Meeting> mergeRanges(List<Meeting> meetings) {
        byte available = 0;
        byte reservedBlockStart = 1;
        byte reservedBlockMiddle = 2;
        byte reservedBlockEnd = 3;
        byte[] slots = new byte[17];

        for(Meeting meeting : meetings) {
            byte startTime = (byte) meeting.getStartTime();
            byte endTime = (byte) meeting.getEndTime();
            for(byte i = startTime; i <= endTime; i++) {
                if(slots[i] == available) {
                    if(i == startTime) {
                        slots[i] = reservedBlockStart;
                    } else if(i == endTime) {
                        slots[i] = reservedBlockEnd;
                    } else {
                        slots[i] = reservedBlockMiddle;
                    }
                } else if(slots[i] == reservedBlockStart) {
                    if(i != startTime) {
                        slots[i] = reservedBlockMiddle;
                    }
                } else if(slots[i] == reservedBlockEnd) {
                    if(i != endTime) {
                        slots[i] = reservedBlockMiddle;
                    }
                }
            }
        }

        List<Meeting> condRange = new ArrayList<Meeting>();
        for(byte i = 0; i < slots.length; i++) {
            Meeting meet = new Meeting(0,0);
            if(slots[i] == reservedBlockStart) {
                byte indexOfEndTime = i;
                meet.setStartTime(i);
                for(byte j = (byte)(i + 1); j < slots.length; j++) {
                    if(slots[j] == reservedBlockEnd) {
                        meet.setEndTime(j);
                        indexOfEndTime = j;
                        j = (byte)(slots.length - 2);
                    } 
                }
                condRange.add(meet);
                i = (byte)(indexOfEndTime - 1);
            }
        }
        return condRange;
    }

  • Я бы просто сказал, что это O (n * 17) = O (n). Поскольку первый цикл превышает n, то второй цикл содержит более 17 элементов, и вы говорите, что он постоянен. Вы проходите через оба эти 2 раза, но O (2 * n) совпадает с O (n)... 17.01.2020
  • › Имеет ли смысл рассматривать средний случай, и если да, то как это выяснить? Средняя среда выполнения кейса требует, чтобы вы знали/определяли распределение входных данных, которые вы ожидаете увидеть (как функция n, я полагаю). Затем вы можете взять среднее время выполнения по вашему распределению входных данных при заданном n. 17.01.2020
  • @KevinWang в этом случае мы можем сказать, что и лучший, и худший случай - это O(n), поэтому средний случай тоже должен быть O(n), независимо от распределения усредняется. 17.01.2020

Ответы:


1

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

Ваш анализ наилучшего случая неверен; вы сказали, что в лучшем случае это занимает O(1) времени, но ваш цикл по списку meetings всегда завершает n итераций, так что этот случай также занимает O(n) времени . Возможно, вы сделали ошибку, предположив, что длина списка равна 1 или даже 0 в лучшем случае; это не считается "случай", потому что вам нужно рассмотреть семейство входных данных, параметризованных размером n, чтобы асимптотический анализ имел смысл вообще.

Ваш анализ пространственной сложности также неверен. Ваш алгоритм создает две структуры данных: массив slots имеет постоянный размер, а список condRange также имеет постоянный размер, потому что он добавляется только из третьего цикла, который, как мы установили, выполняет O(1) операций, поэтому количество add операций в этом списке также равно O(1). Даже если этот список получился бы размером O(n), это результат работы алгоритма, поэтому любому правильному алгоритму пришлось бы создать список такого размера. ; обычно более полезно измерять «вспомогательную» пространственную сложность, то есть пространство, используемое временными структурами данных, которые существуют только для внутренней работы алгоритма.

Есть одно предположение, которое было бы полезно указать явно, а именно то, что встречи startTime и endTime всегда ограничены диапазоном от 0 до 16 (включительно), так что имеет смысл использовать их в качестве индекса в slots. Кстати, имя константе c придумывать не нужно, можно просто написать там O(1).

16.01.2020
  • Спасибо за объяснение! Да, я неправильно рассмотрел случай, если длина списка равна 1 или 0 в лучшем случае. Ваше объяснение космической сложности также очень ясно. Я ценю ваш вклад! 17.01.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..