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

Нахождение временной сложности рекурсивной функции

Я пытаюсь найти общую временную сложность этой функции, используя нотацию Big-Oh. Функция checkElements () вызывается рекурсивно, которая находится внутри percolates (). Любая помощь здесь очень ценится

public static boolean percolates(boolean[][] open) {
    size = open.length;
    uf = new WeightedQuickUnionUF((size * size) + 2);
    for (int i = 0; i < open.length; i++) {//connect all top row elements to virtual top node.
        uf.union(0, i);
    }

    for (int j = 0; j < open.length; j++) {//connect all bottom row elements to bottom virtual node
        uf.union((size * size) + 1, (size * size) - j);

    }
    int row = 0; // current row of grid
    int column = 0;// current column of grid
    int ufid = 1; // current id of union find array
    checkElements(column, row, open, ufid);
    boolean systemPerculates = uf.connected(0, (size * size) + 1);
    System.out.println("Does the system percoloates :" + systemPerculates);
    return systemPerculates;
}

//search elements in the grid
public static void checkElements(int column, int row, boolean open[][], int ufid) {
    if (open[row][column]) {
        if (column - 1 >= 0 && open[row][column - 1]) { //check adjacent left
            uf.union(ufid, ufid - 1);

        }
        if (column + 1 < size && open[row][column + 1]) {//check adjacent right
            uf.union(ufid, ufid + 1);

        }
        if (row - 1 >= 0 && open[row - 1][column]) {//check adjacent top
            uf.union(ufid, ufid - size);

        }
        if (row + 1 < size && open[row + 1][column]) {//check adjacent bottom
            uf.union(ufid, ufid + size);

        }
    }
    if (column + 1 < size) {      //go to next column
        ufid++;
        column++;
        checkElements(column, row, open, ufid);
    } else if (column + 1 == size && row + 1 < open.length) {  //go to next row 
        ufid++;
        row++;
        column = 0;
        checkElements(column, row, open, ufid);
    } else {
        return;
    }

}
22.04.2016

  • Где рекурсия? 22.04.2016
  • метод checkElements () 22.04.2016

Ответы:


1

Это может быть проще, если вы измените рекурсивные вызовы на

if (column + 1 < size) {      //go to next column
    checkElements(column + 1, row, open, ufid + 1);
} else if (column + 1 == size && row + 1 < open.length) {  //go to next row 
    checkElements(0, row + 1, open, ufid + 1);
} else {
    return;
}

Вы выполняете только до одного рекурсивного вызова в checkElements, и каждый вызов, кажется, уменьшает рассматриваемый ввод на единицу, и вы выполняете только постоянный объем обработки на каждом шаге, поэтому время выполнения должно быть просто O (n).

Хотя кажется, что это легко вычислить, глубина линейной рекурсии обычно не является хорошей идеей (кроме языков, которые распознают и поддерживают хвостовую рекурсию), потому что размер стека обычно намного более ограничен, чем пространство кучи - вы можете легко столкнуться со стеком исключение переполнения.

Так что обычно бывает только два вложенных цикла (для строк и столбцов), если я не пропущу что-то важное. обработка, происходящая в вашем коде.

22.04.2016
  • также как я могу найти нижнюю границу или большую тэту для того же кода? 28.04.2016
  • Я думаю, что это одно и то же ограничение - похоже, нет какого-либо специального ввода, который сократил бы время выполнения - все ячейки кажутся пройденными в любом случае. 28.04.2016
  • Новые материалы

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

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

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

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

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

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

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