Вы можете (1) использовать хэш-карту, которая отображает точки в состояния кнопок и имеет максимальное количество строк и столбцов, хранящихся в отдельных переменных;в качестве альтернативы, вы можете (2) использовать дерево и иметь один узел для каждой строки и добавлять узлы к соответствующим узлам строки для представления элементов матрицы.
Вы также можете (3) использовать упорядоченный динамический список (список массивов, связанный список и т. д.) целых чисел, где первые n биты каждого целого числа могут хранить строку, следующие n биты столбца и остальные битылюбые данные, относящиеся к состоянию кнопки.Размер n , однако, зависит от того, каковы ваши максимальные границы для числа строк и столбцов.Используйте побитовые операторы для извлечения соответствующих данных при извлечении элемента из списка.
Объем выделенной памяти будет наименьшим для (3), если используется список массивов, но в противном случае каждая запись будет иметь некоторые дополнительныеДанные, связанные с ним при добавлении дополнительных элементов, обусловлены природой структуры данных.Поиск будет быстрее всего с (1);оба (2) и (3) должны показывать O (log (n)) времени поиска, но я подозреваю, что (3) будет значительно быстрее из-за локальности данных.Из подходов (1) и (2) добавление и удаление элементов было бы быстрее всего с (1);время, необходимое для подхода (3) для добавления или удаления элемента, зависит от реализации списка.
Я уверен, что есть много других структур, которые вы могли бы использовать, но я не перечислил их здесь,но вы можете заметить, что если вы можете гарантировать, что количество строк и столбцов останется в разумных пределах, то использование статической структуры данных действительно может ускорить процесс.