Задать вопрос
Ответы пользователя по тегу Графы
  • Как в целом пишут представление (структуры данных) деревьев в коде? и в чём суть Деревьев?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Для дерева чаще всего удобен список смежностей. Или, если явно задано паренты и чилды, у каждого узла есть массив (или список) чилдов, иногда можно хранить ссылку на родительский узел, в зависимости от задачи. Матрица смежностей бесполезна и даже вредна, поскольку она требует O(N^2) памяти и времени работы при N узлах, а у дерева всего N-1 ребер. Для чего может понадобиться список/матрица ребер в случае деревьев, тоже не совсем понятно.

    Отдельный часто используемый вид деревьев - двоичное дерево, когда есть не просто равноправные "чилды", а "правый" и "левый" чилд, т.е. вместо списка будут две явно заданные ссылки.

    Двоичное дерево из пункта Д2 можно разместить в массиве, потому что оно удачно заполнено (см. описание в ответе Wataru). Зачем нужно? Супер-экономное использование памяти - хранятся только значения узлов, но не нужно хранить ссылки и вообще создавать узлы. Если узел лежит в ячейке arr[i], то его левый чилд - в ячейке arr[2i + 1], правый - в arr[2i + 2], а парент - в arr[floor((i - 1) / 2)]. То есть мгновенный доступ к чилдам и паренту. Подробнее здесь и здесь

    Разные древовидные структуры позволяют быстрее и легче получать доступ к данным

    зависит от ситуации, от алгоритма. Где-то хорош список, где-то массив, где-то дерево - надо выбирать инструмент под задачу. Идеальной для всех случаев структуры данных нет.
    Ответ написан
    Комментировать
  • А как предков вывести?

    Alexandroppolus
    @Alexandroppolus
    кодир
    здесь никакой bfs не нужен.

    Стартовое число в итоге будет повернуто на 0, 1, 2 или 3 вправо (это разница поворотов вправо и влево). То есть возможны 4 стратегии. Тебе надо сравнить 4 различных сдвигов исходного числа, посчитав для каждого сдвига суммарную стоимость преобразований.

    например,
    A = 2573
    B = 4164

    нулевой сдвиг дает стоимость действий 1 и 2: (4-2) + (5-1) + (7-6) + (4-3) = 2 + 4 + 1 + 1 = 8, плюс ещё надо здесь прикинуть оптимальную стратегию разворотов и посчитать, сколько их будет.

    сдвиг на 1 вправо (стартовое число 3257) по действиям 1 и 2 выходит (4-3) + (2-1) + (6-5) + (7-4) = 6, и снова надо прикинуть развороты.

    определив таким образом оптимальную - самую дешевую - стратегию (т.е. определив, насколько в итоге будет повернуто исходное число), выстраиваешь цепочку переходов.
    Ответ написан
  • Как правильно пропарсить лабиринт в граф?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Похоже, тут обычный поиск в ширину. Сначала находишь первую вершину (просмотреть первую строку, потом вторую и т.д., первая попавшаяся звездочка будет поворотом или тупиком). Ну а далее все соседние звездочки - это соседние вершины, либо пути в соседние вершины (то есть в каждую сторону идешь прямо, пока встречаются "транзитные" звездочки, а именно ограниченные решетками или краями карты с двух противоположных сторон, и подсчитываешь длину пути).
    Если в лабиринте только одно пространство, то обойдешь всё. Иначе надо после завершения обхода в ширину снова искать неотмеченные вершины.
    Ответ написан
    Комментировать
  • Как узнать расстояние между вершинами в дереве?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Для такого дела BFS удобнее.
    Складывая узлы в очередь, просто добавляй туда же расстояние (если у текущего обрабатываемого узла расстояние равно N, то попавшие в очередь чилды получают N+1)
    Ответ написан
    Комментировать
  • Как построить граф по матрице?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Зачем строить граф? У каждой ячейки есть только соседи сверху-снизу-слева-справа.
    А главное, какой может быть вес у ребер? Если соединены только смежные по стороне ячейки, то все ребра одинакового веса.
    https://ru.wikipedia.org/wiki/A* - посмотри вот такую штуку
    Ответ написан
    Комментировать