Рубрики
Без рубрики

Дешевое представление разреженной матрицы в Python (или на любом другом языке)

Как эффективно представлять разреженную матрицу? Tagged с помощью Python, Datastructure, алгоритмов.

Рассмотрим поля Gameboard 8×8. Как бы вы это представляли? А как насчет самого обычного и памяти, которое когда -либо голодного решения когда -либо? Массив массивов, верно? Или список списков в Python.

gameboard = [8 * ["*"] for _ in range(8)]
gameboard
[['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*']]

Теперь мы можем добавить два игрока P1 и P2, чтобы повеселиться, верно?

gameboard[0][5] = "P1"
gameboard[7][3] = "P2"
gameboard
[['*', '*', '*', '*', '*', 'P1', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', '*', '*', '*', '*', '*'],
 ['*', '*', '*', 'P2', '*', '*', '*', '*']]

Вы бы угадали, что здесь не так?

Например, представьте, что вы хотели бы создать двухмерный обширный мир, где игроки могут бродить бесплатно.

Вы не хотите в конечном итоге выделять 1 млн * 1 мс сетку только для двух игроков. Это довольно глупо, не так ли? Можем ли мы сделать лучше, хотя?

Да, мы, конечно, можем.

players = {
    (1,5): "P1",
    (7,1): "P2"
}

Вот и все! Вам не нужно больше. Всего две записи для хранения координат и атрибутов игрока. В этом конкретном случае я просто (AB) использовал DictionAry, потому что мне было лень делать особый класс.

Вы можете отобрать свою доску за один раз:

def render_board(players, width=8, height=8, empty_field=" * "):
    for x in range(height):
        for y in range(width):
            character = players.get((x,y), empty_field)
            print(character, end="")
        print()
render_board(players=players)
 *  *  *  *  *  *  *  * 
 *  *  *  *  * P1 *  * 
 *  *  *  *  *  *  *  * 
 *  *  *  *  *  *  *  * 
 *  *  *  *  *  *  *  * 
 *  *  *  *  *  *  *  * 
 *  *  *  *  *  *  *  * 
 * P2 *  *  *  *  *  * 

Вы даже можете обрезать свой вид. Смотрите, Игрок2 здесь нет.

render_board(players, 7,7)
 *  *  *  *  *  *  * 
 *  *  *  *  * P1 * 
 *  *  *  *  *  *  * 
 *  *  *  *  *  *  * 
 *  *  *  *  *  *  * 
 *  *  *  *  *  *  * 
 *  *  *  *  *  *  * 

А теперь для чего -то более массивного. Или, возможно, не так массово, так как я не собираюсь делать ваш экран разъединяться для слишком большого количества страниц.

render_board(players, 60,20,".")
............................................................
.....P1......................................................
............................................................
............................................................
............................................................
............................................................
............................................................
.P2..........................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................
............................................................

К настоящему времени вы должны получить идею. Если вы были заинтригованы, вы можете немного поиграть, инкапсулируя Gameboard в отдельный класс, с некоторым графическим интерфейсом, чтобы получить больше удовольствия.

  • Почему я позаботился о понимании списка в начале простого?
[["*"] * 8 ] * 8
  • Для координат в моем дикте я использовал кортеж , не список Анкет Почему?
  • Что означает print (“*”,) ? Почему мне пришлось использовать его вместо простой печати (“*”)
  • Я написал это Статья в jupyterlab? Что это такое?
  • О чем мы говорим в редкой матрице?

Напишите свои ответы в разделе комментариев.

Надеюсь, вам понравилась эта статья. Если вы жаждете чего -то совершенно другого, вы можете прочитать мой онлайн -роман Суверенный

Оригинал: “https://dev.to/hanpari/cheap-representation-of-sparse-matrix-in-python-or-any-other-language-2i7e”