Вы можете выбрать скорость или потребление памяти. Если память не важна, вы можете создать список позиций, в которых хранятся значения. Таким образом, у вас все еще есть ваш массив m * n, но, кроме того, массив «списков позиций». Вы должны будете создать методы "setter", которые записывают позицию в списках каждый раз, когда значение добавляется или изменяется. Так что идея не в том, чтобы улучшить поиск, а в том, чтобы его избежать.
Пример:
У вас есть массив 2 * 2.
{{0,0}
{0,0}}
И вы хотите добавить 4 в. Поэтому вы должны вызвать свой метод write, который вызывается с параметрами X, Y и Value. Этот метод изменит ваш массив на
{{4,0},
{0,0}}
но также создать список
List4=>{(0,0)}
с положением четверок. Если вы добавите вторую 4 это будет выглядеть как
{{4,0}
{4,0}}
List4=>{(0,0),(1,0)}
Так что, если вы хотите найти все 4 в вашей матрице, вам просто нужно перейти на все позиции в вашем List4. Конечно, вам придется создать список для каждого значения в вашем массиве. Таким образом, вы можете иметь максимум m * n списков с позициями, если матрица содержит каждое значение только один раз.