Допустим, у нас есть список элементов:Как эффективно хранить большой набор перестановок?
[{dog,1},{dog,2},{cat,1},{cat,2},{bird,1},{bird,2},...]
Я хотел бы хранить все возможные permutations этот список в памяти.
Поскольку список может быть довольно длинным (10 элементов и более), для его хранения требуется много места (факторный N).
Например, если у меня есть список, который потребляет около 70 байт пространства и имеет 12 элементов, тогда мне нужно 12! * 70 ~ 31 GB
. Если я добавлю только один элемент в список, то может оказаться невозможным сохранить перестановки в ОЗУ.
Есть ли более эффективное представление для хранения всех перестановок в памяти, чем следующее представление Erlang?
[{dog,1},{dog,2},{cat,1},{cat,2},{bird,1},{bird,2},...]
(я знаю, что атом dog
хранится только один раз в таблице атомов, но так как она повторяется в каждой перестановке, она занимает N память).
Возможно, эти перестановки могут храниться в виде байтов? (Извините, я новичок в байтах и двоичных файлах).
В конце концов, это все те же элементы, но перегруппированы по-разному.
Адам, не могли бы вы предоставить подробную информацию о вашем ответе? С моими ограниченными знаниями я понимаю только, что у меня должна быть таблица (DB? Matrix?), Которая имеет все уникальные элементы списка в строках и все перестановки в столбцах. Соответствующие ячейки должны хранить точный индекс (номер места) конкретного элемента в конкретном списке (перестановка). Я считаю, что ваш ответ предполагает гораздо более элегантное решение. – skanatek
Просмотреть обновленный пост. Дело в том, чтобы никогда полностью не создавать все перестановки сразу. –
Извините за то, что я такой новичок, но я не понимаю, как я должен использовать структуру записи, которую вы предоставили. Что следует хранить в list_a и list_b? Являются ли index_a и index_b типа данных списка Erlang или что-то еще? – skanatek