У меня есть список целых чисел, например 1,2,2,3,4,1
.Мне нужно иметь возможность проверять эквивалентность (==) между различными списками.
Однако я не имею в виду простое сравнение по числам.Каждый из этих списков фактически обозначает установленный раздел, где позиция в списке обозначает индекс элемента, а число обозначает индекс группы.Например, в первом элемент 0 и элемент 5 находятся в одной группе, элементы 1 и 2 находятся в одной группе, а элементы 3 и 4 находятся в своих отдельных группах. Фактический индекс группы не важен, только группировка.
Мне нужно иметь возможность проверить эквивалентность в этом смысле, поэтому, например, предыдущий список будет эквивалентен 5,3,3,2,9,5,
поскольку они имеют одинаковую группировку.
То, как я это делал, сводит массив к нормальной форме.Я нахожу все числа, имеющие то же значение, что и первое число, и устанавливаю их все на 0. Затем я продолжаю в списке, пока не найду новое число, не найду все числа с таким же значением и установлю их все на 1. Япродолжайте в том же духе.
В моем примере оба числа будут уменьшены до уменьшенных до 0,1,1,2,3,0
, и, конечно, тогда я могу просто использовать простое сравнение, чтобы увидеть, эквивалентны ли они.
Однако это довольно медленно, так как я должен сделать несколько линейных проходов по списку.Итак, чтобы перейти к погоне, есть ли более эффективный способ уменьшить эти числа до этой нормальной формы?
Как бы вообще, могу ли я избежать этого сокращения все вместе исравнивать массивы другим и, возможно, более эффективным способом ?
Подробности реализации
- Эти массивы фактически реализованы как наборы битов для экономии места, поэтому яна самом деле приходится каждый раз перебирать весь список, так как хэширование rb_tree esque не происходит.
- Большое количество этих массивов будет храниться в stl unordered_set, следовательно, требование к хешу должно быть учтенорассмотрение