Что Bas Swinckels предложил один из способов хранения наборов эффективной. Поскольку каждый из ваших кортежей содержит два элемента, я бы использовал матрицу с тремя ограничениями:
- В каждой строке первый элемент меньше второго. Сортировка, если это необходимо. Таким образом, топор (i, j) и (j, i) получает одно и то же представление.
- Убедившись, что строки должны быть уникальными, чтобы каждый элемент присутствовал только один раз.
- Чтобы иметь уникальное представление для наборов, отсортируйте строки.
Для любого входа, можно обеспечить три свойства, используя этот код:
>> M=[1,2;2,1;3,2;1,3;3,1]
M =
1 2
2 1
3 2
1 3
3 1
>> sortrows(unique(sort(M,2),'rows'))
ans =
1 2
1 3
2 3
(sortrows
избыточно для большинства версий MatLab, потому что unique
alreads сорта)
Альтернатива матрицы представления a cell:
{[1,2],[1,3],[2,3]}
это может быть менее результативно , но вы можете расширить его до кортежей разного размера. Последняя альтернатива, представляющая множества, использующие битмаски, в этом случае не кажется эффективной.
Вы можете использовать отсортированные массивы длины 2. Всегда сохраняя их сортировку, вы можете легко сравнить их, и вы сохраните оба [2,1] и [1,2] таким же образом. –
@BasSwinckels Большое спасибо – guanglei
@BasSwinckels, но проблема в том, хочу ли я запросить, если [2,1] находится в неупорядоченном наборе или нет, что мне делать? – guanglei