Для чего нужна циклическая структура данных?

Я пробовал svg.text("") и, похоже, работает. Очищает весь внутренний текст, сохраняет атрибуты.

14
задан tshepang 30 October 2013 в 19:55
поделиться

12 ответов

Много вещей. Кольцевой буфер, например: у Вас есть некоторый набор данных с передней стороной и спиной, но произвольное число узлов и "следующий" объект от последнего должны забрать Вас к первому.

структуры Графика являются часто циклическими; ацикличность является особым случаем. Рассмотрите, например, график, содержащий все города и дороги в проблеме коммивояжера.

<час>

Хорошо, вот конкретный пример для Вас. Я настроил набор городов здесь в Колорадо:

V=["Boulder", "Denver", "Colorado Springs", "Pueblo", "Limon"]

я затем настроил пар городов, где существует дорога, соединяющая их.

E=[["Boulder", "Denver"],
   ["Denver", "Colorado Springs"],
   ["Colorado Springs", "Pueblo"],
   ["Denver", "Limon"],
   ["Colorado Springs", "Limon"]]

Это имеет набор циклов. Например, можно управлять из Колорадо-Спрингса, в Лимон, в Денвер, и назад в Колорадо-Спрингс.

, Если Вы создаете структуру данных, которая содержит все города в V и все дороги в E, это график структура данных. Этот график имел бы циклы.

18
ответ дан Jiaaro 31 October 2013 в 06:55
поделиться

Вложенная структура могла использоваться в тестовом сценарии для сборщика "мусора".

1
ответ дан Andomar 31 October 2013 в 06:55
поделиться
  • 1
    @nategoose: ИЛИ struct stack_type my_type; вместо struct stack_type * my_type; – Fabricio 4 June 2012 в 03:18

Одним примером был бы связанный список, где последний объект указывает на первое. Это позволило бы Вам создавать постоянное число объектов, но всегда мочь получить следующий объект.

0
ответ дан Beau Simensen 31 October 2013 в 06:55
поделиться

Я недавно создал циклическую структуру данных для представления восьми кардинальных и порядковых направлений. Его полезное для каждого направления для знания его соседей. Например, Направление. Север знает то Направление. NorthEast и Направление. NorthWest являются его соседями.

Это циклически, потому что каждый neighor знает своих соседей, пока он не распространяется вокруг, полное колебание ("->" представляет по часовой стрелке):

Север-> NorthEast-> Восток-> SouthEast-> Юг-> SouthWest-> Запад-> NorthWest-> Север->...

Уведомление мы возвратились на Север.

, Который позволяет мне делать материал как это (в C#):

public class Direction
{
    ...
    public IEnumerable<Direction> WithTwoNeighbors
    {
        get {
           yield return this;
           yield return this.CounterClockwise;
           yield return this.Clockwise;
        }
    }
}
...
public void TryToMove (Direction dir)
{
    dir = dir.WithTwoNeighbors.Where (d => CanMove (d)).First ()
    Move (dir);
}

Это оказалось довольно удобным и сделало много вещей намного менее сложным.

6
ответ дан Mark A. Nicolosi 31 October 2013 в 06:55
поделиться
  • 1
    @nategoose - st->my_type->push(st, thing2); вместо st->my_type.push(st, thing2); – Fabricio 3 June 2012 в 23:48

при выполнении моделирований решетки часто используются циклические/тороидальные граничные условия. обычно простое lattice[i%L] было бы достаточно, но я предполагаю, что можно было создать решетку, чтобы быть циклическим.

0
ответ дан Autoplectic 31 October 2013 в 06:55
поделиться

Предположим, что Вы ограничили устройство хранения данных, и данные постоянно накапливаются. Во многих реальных случаях Вы не возражаете избавляться от старых данных, но Вы не хотите перемещать данные. Можно использовать циклический вектор; реализованное использование вектора v размера N с двумя специальными индексами: начните и закончитесь, которые инициируют по телефону 0.

, Вставка "новых" данных теперь идет как это:

v[end] = a;
end = (end+1) % N;
if (begin == end)
  begin = (begin+1) % N;

можно вставить "старые" данные и стереть "старые" или "новые" данные похожим способом. Сканирование вектора идет как это

for (i=begin; i != end; i = (i+1) % N) {
 // do stuff
}
0
ответ дан David Lehavi 31 October 2013 в 06:55
поделиться

Структуры данных, повторяемые детерминированными конечными автоматами , часто бывают циклическими.

1
ответ дан 1 December 2019 в 09:34
поделиться

L просто содержит ссылку на себя как на один из своих элементов. Ничего особенного в этом нет.

Есть несколько очевидных вариантов использования циклических структур, когда последний элемент знает о первом элементе. Но эта функциональность уже включена в обычные списки Python.

Вы можете получить последний элемент L , используя [- 1] . Вы можете использовать списки Python в качестве очередей с append () и pop () . Вы можете разделить списки Python. Каковы обычные виды использования циклической структуры данных.

>>> L = ['foo', 'bar']
>>> L.append(L)
>>> L
['foo', 'bar', [...]]
>>> L[0]
'foo'
>>> L[1]
'bar'
>>> L[2]
['foo', 'bar', [...]]
>>> L[2].append('baz')
>>> L
['foo', 'bar', [...], 'baz']
>>> L[2]
['foo', 'bar', [...], 'baz']
>>> L[2].pop()
'baz'
>>> L
['foo', 'bar', [...]]
>>> L[2]
['foo', 'bar', [...]]
1
ответ дан 1 December 2019 в 09:34
поделиться

Любая иерархия объектов, при которой родители знают о своих детях, а дети знают о своих родителях. Мне всегда приходится иметь дело с этим в ORM, потому что я хочу, чтобы базы данных знали свои таблицы и таблицы, чтобы знать, частью какой базы данных они являются, и так далее.

0
ответ дан 1 December 2019 в 09:34
поделиться

Циклические структуры данных обычно используются для представления циклических отношений. Звучит очевидно, но случается чаще, чем вы думаете. Я не могу вспомнить ни одного случая, когда я использовал ужасно сложные циклические структуры данных, но двунаправленные отношения довольно распространены. Например, предположим, что я хочу создать IM-клиент. Я мог бы сделать что-то вроде этого:

class Client(object):
    def set_remote(self, remote_client):
        self.remote_client = remote_client

    def send(self, msg):
        self.remote_client.receive(msg)

    def receive(self, msg):
        print msg

Jill = Client()
Bob = Client()
Bob.set_remote(Jill)    
Jill.set_remote(Bob)

Затем, если бы Боб хотел отправить сообщение Джилл, вы могли бы просто сделать это:

Bob.send("Hi, Jill!")

Конечно, Джилл может захотеть отправить сообщение обратно, чтобы она могла сделать это:

Jill.send("Hi, Bob!")

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

0
ответ дан 1 December 2019 в 09:34
поделиться

Давайте рассмотрим единственный практический пример.

Допустим, мы программируем навигацию по меню для игры. Мы хотим сохранить для каждого пункта меню

  1. Имя записи
  2. Другое меню, в которое мы войдем после его нажатия.
  3. Действие, которое будет выполнено при нажатии на меню.

Когда меню- элемент, мы активируем действие пункта меню, а затем перейдем к следующему меню. Итак, наше меню будет представлять собой простой список словарей, например:

options,start_menu,about = [],[],[]

def do_nothing(): pass

about += [
    {'name':"copyright by...",'action':None,'menu':about},
    {'name':"back",'action':do_nothing,'menu':start_menu}
    ]
options += [
    {'name':"volume up",'action':volumeUp,'menu':options},
    {'name':"save",'action':save,'menu':start_menu},
    {'name':"back without save",'action':do_nothing,'menu':start_menu}
    ]
start_menu += [
    {'name':"Exit",'action':f,'menu':None}, # no next menu since we quite
    {'name':"Options",'action':do_nothing,'menu':options},
    {'name':"About",'action':do_nothing,'menu':about}
    ]

Посмотрите, как о является циклическим:

>>> print about
[{'action': None, 'menu': [...], 'name': 'copyright by...'},#etc.
# see the ellipsis (...)

При нажатии на пункт меню мы запускаем следующую функцию щелчка:

def menu_item_pressed(item):
    log("menu item '%s' pressed" % item['name'])
    item['action']()
    set_next_menu(item['menu'])

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

Если циклические структуры данных были бы невозможны, нам придется реализовать это самостоятельно, например, пункт меню будет следующим:

class SelfReferenceMarkerClass: pass
#singleton global marker for self reference
SelfReferenceMarker = SelfReferenceMarkerClass()
about += [
    {'name':"copyright by...",'action':None,'menu':srm},
    {'name':"back",'action':do_nothing,'menu':start_menu}
    ]

, функция menu_item_pressed будет:

def menu_item_pressed(item):
    item['action']()
    if (item['menu'] == SelfReferenceMarker):
        set_next_menu(get_previous_menu())
    else:
        set_next_menu(item['menu'])

Первая пример немного приятнее, но да, отсутствие поддержки ссылок на себя не такая уж большая проблема ИМХО, это ограничение легко преодолеть.

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

class SelfReferenceMarkerClass: pass
#singleton global marker for self reference
SelfReferenceMarker = SelfReferenceMarkerClass()
about += [
    {'name':"copyright by...",'action':None,'menu':srm},
    {'name':"back",'action':do_nothing,'menu':start_menu}
    ]

функция menu_item_pressed будет выглядеть так:

def menu_item_pressed(item):
    item['action']()
    if (item['menu'] == SelfReferenceMarker):
        set_next_menu(get_previous_menu())
    else:
        set_next_menu(item['menu'])

Первый пример немного лучше, но да, отсутствие поддержки ссылок на себя - не такая уж большая проблема, ИМХО, это ограничение легко преодолеть.

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

class SelfReferenceMarkerClass: pass
#singleton global marker for self reference
SelfReferenceMarker = SelfReferenceMarkerClass()
about += [
    {'name':"copyright by...",'action':None,'menu':srm},
    {'name':"back",'action':do_nothing,'menu':start_menu}
    ]

функция menu_item_pressed будет выглядеть так:

def menu_item_pressed(item):
    item['action']()
    if (item['menu'] == SelfReferenceMarker):
        set_next_menu(get_previous_menu())
    else:
        set_next_menu(item['menu'])

Первый пример немного лучше, но да, отсутствие поддержки ссылок на себя не такая уж большая проблема, ИМХО, это ограничение легко преодолеть.

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

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

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

0
ответ дан 1 December 2019 в 09:34
поделиться

Это немного сбивает с толку, так как это список, который содержит сам себя, но я понял, что это не L как список, а узел, а не вещи в списке вы думаете об этом как о других узлах, доступных этому узлу.

Чтобы привести более реальный пример, представьте их как пути полета из города.

Итак, chicago = [denver, los angeles, new york city, chicago] (на самом деле, вы не стали бы перечислять сам по себе Чикаго, но для примера вы можете добраться до Чикаго из Чикаго)

Затем у вас есть denver = [phoenix, philedelphia] и так далее.

phoenix = [чикаго, нью-йорк]

Теперь у вас есть циклические данные как из

чикаго -> чикаго

, так и из

чикаго -> денвер -> феникс -> чикаго

Теперь у вас есть:

chicago[0] == denver
chicago[0][0] == phoenix
chicago[0][0][0] == chicago
1
ответ дан 1 December 2019 в 09:34
поделиться
Другие вопросы по тегам:

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