Я предположил, что вопрос, как указано в моем комментарии к вопросу.
Код
def disregarding_order_any_dups?(arr)
arr.map do |a|
a.each_with_object(Hash.new(0)) do |k,h|
h[k] += 1
end
end.uniq.size < arr.size
end
Примеры
disregarding_order_any_dups? [%w[white xl], %w[red xl]]
#=> false
disregarding_order_any_dups? [%w[blue xl],
%w[xl blue cotton]]
#=> false
disregarding_order_any_dups? [%w[blue xl], %w[xl blue]]
#=> true
disregarding_order_any_dups? [%w[xl green], %w[red xl],
%w[green xl]]
#=> true
disregarding_order_any_dups? [[1,2,3,2], [3,1,3,2],
[2,3,1,2]]
#=> true
Сложность
Если n = arr.size
и m = arr.map(&:size).max
, вычислительная сложность O (n*m
).Один оператор в блоке map
можно заменить на a.sort
, но это увеличит вычислительную сложность до O (n*m*log(m)
).
Объяснение
Для последнего примера выполняются следующие шаги:
arr = [[1,2,3,2], [3,1,3,2], [2,3,1,2]]
b = arr.map do |a|
a.each_with_object(Hash.new(0)) do |k,h|
h[k] += 1
end
end
#=> [{1=>1, 2=>2, 3=>1}, {3=>2, 1=>1, 2=>1},
# {2=>2, 3=>1, 1=>1}]
c = b.uniq
#=> [{1=>1, 2=>2, 3=>1}, {3=>2, 1=>1, 2=>1}]
d = c.size
#=> 2
e = arr.size
#=> 3
d < e
#=> true
Выражение
h = Hash.new(0)
создает счетный хэш .Ruby расширяет h[k] += 1
до
h[k] = h[k] + 1
Методы экземпляра хэша: :[]=
слева, :[]
справа.Если h
не имеет ключа k
, h[k]
справа заменяется на h
значение по умолчанию , которое было определено равным нулю, в результате чего:
h[k] = 0 + 1
Если h
имеет ключ k
, h[k]
справа, значение k
не заменяется значением по умолчанию h
.См. Версию Hash :: new , в которой аргумент равен значению по умолчанию для хеша.