【发布时间】:2018-10-31 11:00:38
【问题描述】:
我有一组名称对,例如:
[
['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
但是这个解决方案的结果是有额外的团队,而且我能想到的每个解决方案都涉及非常糟糕的时间复杂度。如果您知道如何解决这个问题,而无需暴力破解所有配对,我很想知道。
【问题讨论】:
-
看起来您正在尝试将图形拆分为连接的组件。我相信我在ruby graph library 中看到了你需要的东西
-
不相交集数据结构将在近线性时间内解决您的问题:https://en.wikipedia.org/wiki/Disjoint-set_data_structure。我看到很多 Ruby gem 都实现了它。
标签: arrays ruby algorithm time-complexity