Лучшая структура данных для хранения и управления моими данными? - PullRequest
1 голос
/ 24 января 2012

Я пишу простую Java-программу, которая будет вводить текстовый файл, в котором будет несколько чисел, представляющих (nxn) -матрицу, где числа разделены пробелами.Например:

1 2 3 4
5 6 7 8
9 1 2 3
4 5 6 7

Затем я хочу сохранить эти числа в структуре данных, которую я затем буду использовать для манипулирования данными (которая будет включать сравнение чисел приличия, а также удаление определенных чисел на основе определенных правил.Если число удалено, все остальные числа над ним уменьшаются на количество пробелов.В приведенном выше примере, скажем, я удаляю 8 и 9, результат будет:

() 2 3 ()
1  6 7 4
5  1 2 3
4  5 6 7

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

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

Ответы [ 5 ]

1 голос
/ 24 января 2012

Вы можете использовать одномерный массив размером n*n.

int []myMatrix = new myMatrix[n * n];

Для доступа к элементу с координатами (i,j) используйте myMatrix[i + j * n].Для падения элементов используйте System.arraycopy для перемещения линий.

Используйте специальное значение (например, Integer.MIN_VALUE) в качестве метки для отверстия ().

Я ожидаю, что оно будет самым быстрым и наиболееэффективное решение для памяти.

1 голос
/ 24 января 2012

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

Все это говорит, что если вам не нужна абсолютная лучшая скорость, есть и другие варианты.

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

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

enter image description here

1 голос
/ 24 января 2012

По моему мнению, вы знаете длину вашего массива при запуске, вам лучше использовать массив.Простой dataType будет легче ориентироваться (прямой доступ).Опять же, используя LinkedLists, вы сможете удалить среднее значение без необходимости переупорядочивать данные внутри вашей матрицы.Это оставит вам «верхнее» значение как ноль.в вашем примере:

null 2 3 null
1    6 7 4
5    1 2 3
4    5 6 7

Надеюсь, это поможет.

0 голосов
/ 24 января 2012

Если вы хотите, чтобы числа автоматически падали, я предлагаю вам использовать список для столбцов.

0 голосов
/ 24 января 2012

Попробуйте массив из LinkedList с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...