У меня есть массив пар имен, таких как:
[
['alison', 'jason'],
['alison', 'chris'],
['john', 'bill'],
['bill', 'alex'],
['alex', 'jack']
]
, и я пытаюсь написать метод, который может принять это и вернуть
[
['alison', 'jason', 'chris'],
['john', 'bill', 'alex', 'jack']
]
лучше, чемO (N ^ 2) время.Моя попытка была такой:
def teams(arr)
pair_hash = {}
arr.each do |pair|
if pair_hash[pair[0]].nil?
pair_hash[pair[0]] = [pair[1]]
else
pair_hash[pair[0]].push(pair[1])
end
end
teams = []
pair_hash.map do |leader, team|
teams.push(find_teammates(pair_hash, leader, team))
end
teams
end
def find_teammates(hash, leader, team)
result = [leader]
team.each do |member|
if hash[member].nil?
result += [member]
else
result += find_teammates(hash, member, hash[member])
end
end
result
end
, но у этого решения есть дополнительные команды в результате, и каждое решение, которое я могу придумать, включает в себя очень низкую сложность времени.Если у вас есть идеи, как решить эту проблему, не прибегая к грубому форсированию всех пар, я хотел бы знать.