Этот вопрос, вероятно, слишком широк для stackoverflow. - Для этого не существует универсального решения "один размер подходит всем", и результаты во многом зависят от используемого языка (и стандартной библиотеки).
В этом вопросе есть несколько проблем. Прежде всего, давайте рассмотрим массив 2d, мы говорим, что это просто уже часть языка и что такой массив динамически увеличивается при доступе. Если это не так, вопрос становится действительно зависимым от языка.
Теперь часто при выделении памяти язык автоматически инициализирует пятна (опять же, язык зависит от того, как это происходит и какой метод лучше, посмотрите в RAII). Хотя я могу предвидеть, что фактическое вычисление конкретной ячейки может быть дорогостоящим (по сравнению с распределением). В этом случае может быть интересна так называемая «двухэтапная конструкция». Массив должен быть заполнен кортежами/объектами. Конструкция объекта по умолчанию устанавливает бит/логическое значение в false, что указывает на то, что значение не готово. Затем при доступе (т.е. метод get()
или operator()
- зависит от языка), если этот бит равен false, он создает, иначе он просто читает.
Другой метод — использовать карту словарь/ключ-значение. Где ключ будет координатами, а значение значением. Это имеет то преимущество, что проблема построения при доступе наследуется от структуры данных (хотя опять же зависит от языка). Однако недостатком использования карт является то, что скорость поиска значения изменяется с O(1) до O(logn). (Фактическое время сильно отличается в зависимости от языка).
Наконец, я надеюсь, вы понимаете, что то, как это сделать, зависит от более конкретных требований, используемого вами языка и других библиотек. В конце концов, в каждом языке есть только одна структура данных: длинная последовательность нераспределенных значений. Все, что более продвинуто, зависит от языка.
person
paul23
schedule
23.08.2013