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

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

Массив также будет иметь отрицательные индексы, но я могу преодолеть это, используя 4 массива (по одному на каждый квадрант около 0,0).


person DanRedux    schedule 18.08.2013    source источник
comment
На каком языке - Game Maker (GML) или python? Ваши теги немного противоречат друг другу в этом отношении.   -  person paul23    schedule 22.08.2013
comment
Любой язык, это скорее общий вопрос.   -  person DanRedux    schedule 23.08.2013
comment
вы не можете использовать отрицательные индексы в GameMaker   -  person gnysek    schedule 05.09.2013
comment
Поэтому я сказал, что могу преодолеть это, используя 4 массива: один для x, y, один для -x, y, один для x, -y и один для -x, -y.   -  person DanRedux    schedule 22.09.2013


Ответы (2)


Вы можете создать класс Matrix, основанный на кортежах и словаре, со следующим поведением:

from collections import namedtuple
2DMatrixEntry = namedtuple("2DMatrixEntry", "x", "y", "value")
matrix = new dict()
defaultValue = 0

# add entry at 0;1
matrix[2DMatrixEntry(0,1)] = 10.0

# get value at 0;1
key = 2DMatrixEntry(0,1)
value = {defaultValue,matrix[key]}[key in matrix]

Ваше здоровье

person David    schedule 20.08.2013

Этот вопрос, вероятно, слишком широк для stackoverflow. - Для этого не существует универсального решения "один размер подходит всем", и результаты во многом зависят от используемого языка (и стандартной библиотеки).

В этом вопросе есть несколько проблем. Прежде всего, давайте рассмотрим массив 2d, мы говорим, что это просто уже часть языка и что такой массив динамически увеличивается при доступе. Если это не так, вопрос становится действительно зависимым от языка.

Теперь часто при выделении памяти язык автоматически инициализирует пятна (опять же, язык зависит от того, как это происходит и какой метод лучше, посмотрите в RAII). Хотя я могу предвидеть, что фактическое вычисление конкретной ячейки может быть дорогостоящим (по сравнению с распределением). В этом случае может быть интересна так называемая «двухэтапная конструкция». Массив должен быть заполнен кортежами/объектами. Конструкция объекта по умолчанию устанавливает бит/логическое значение в false, что указывает на то, что значение не готово. Затем при доступе (т.е. метод get() или operator() - зависит от языка), если этот бит равен false, он создает, иначе он просто читает.


Другой метод — использовать карту словарь/ключ-значение. Где ключ будет координатами, а значение значением. Это имеет то преимущество, что проблема построения при доступе наследуется от структуры данных (хотя опять же зависит от языка). Однако недостатком использования карт является то, что скорость поиска значения изменяется с O(1) до O(logn). (Фактическое время сильно отличается в зависимости от языка).


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

person paul23    schedule 23.08.2013