给定一个有向图的字典,表示嵌套组及其成员,展平结构并返回给定组的所有用户。
MEMBERS_BY_GROUPS = {
'Group0': {
'NestedGroups': ['Group3'],
'Members': ['User0', 'User1']
},
'Group1': {
'NestedGroups': ['Group3'],
'Members': ['User2', 'User3', 'User4']
},
'Group2': {
'NestedGroups': ['Group3', 'Group5'],
'Members': ['User4', 'User5']
},
'Group3': {
'NestedGroups': ['Group4'],
'Members': ['User6', 'User7']
},
'Group4': {
'NestedGroups': [],
'Members': ['User8', 'User9']
},
'Group5': {
'NestedGroups': [],
'Members': ['User10', 'User11']
}
}
def flattenGroup(members_by_groups, group_name): // (MEMBERS_BY_GROUPS, 'Group2') -> ['User4', 'User5', 'User6', 'User7', 'User8', 'User9',, 'User10', 'User11']
我被赋予了这项任务,我不知道如何回答。我该怎么做?
答案 0 :(得分:2)
我被赋予了这项任务,我不知道如何回答。我该怎么做?
您首先设计算法来解决问题,然后将该算法实现为编程语言 - 在您的情况下为Objective-C。
首先看看问题:
给定一个有向图的字典,表示嵌套组及其成员,展平结构并返回给定组的所有用户。
鉴于您已将此作为一项任务,我假设您知道词典和有向图是什么。示例数据似乎也使用数组 - 方括号中的项目列表([
,]
)。
问题涉及表示有向图的数据,样本数据恰好代表有向无环图(DAG)。如果您的数据中可能存在循环,则需要在算法中处理它们,如果不这样做,您的算法可能永远不会在圆圈周围结束...暂时让我们假设您实际上只有DAG - 没有周期。
问题还包括:
def flattenGroup(members_by_groups, group_name):
以及示例数据和示例查询:
flattenGroup(MEMBERS_BY_GROUPS, 'Group2') -> ['User4', 'User5', 'User6', 'User7', 'User8', 'User9',, 'User10', 'User11']
那么我们从这个问题得到了什么信息:
def flattenGroup(members_by_groups, group_name):
” - 生成一个算法flattenGroup
,该算法给出数据和组名称,返回该组中的所有成员及其嵌套组。flattenGroup(MEMBERS_BY_GROUPS, 'Group2') -> ['User4', 'User5', 'User6', 'User7', 'User8', 'User9',, 'User10', 'User11']
” - 查询应该返回一个列表(数组)([
& ]
),不包含任何重复内容(例如User4
仅发生一次 - 检查样本数据,在跟踪DAG时发现两次),并且被排序(可能只是巧合); 鉴于我们可以读取算法(伪代码):
def flattenGroup(members_by_groups, group_name):
{ members of group_name } // the set of all members of group_name
∪ // union
{ members of first nested group } // the set of all members of the first nested group
∪ // union
...
∪ // union
{ members of last nested group }
注意:我写过使用集合,因为以这种方式描述算法是有意义的,因为集合不包含重复项。是否使用集合或列表实现它是一个实现细节。
算法对你有意义吗? 在此之前不要继续。
现在让我们详细说明算法。第一个子表达式是:
{ members of group_name } // the set of all members of group_name
这非常简单,每个节点都包含一个成员列表,无需进一步详细说明。第二个及后续子表达式的格式为:
{ members of first nested group } // the set of all members of the first nested group
这当然更复杂,因为嵌套组的成员又包含其嵌套组,所以这可以用于详细说明,但是要做什么?那么这个子表达式的任务与我们正在编写的算法完全相同,除了一个不同的组,所以该行只是:
flattenGroup(members_by_groups, first nested group)
现在整个算法都是:
def flattenGroup(members_by_groups, group_name):
{ members of group_name }
∪
flattenGroup(members_by_groups, first nested group)
∪
...
∪
flattenGroup(members_by_groups, last nested group)
你知道为什么这个算法会在有周期时失败吗? 除非你这样做,否则不要继续!
现在你有一个算法,有时间写一些代码......
你的工作是什么!我们使用了字典,数组和集合,这些是由Cocoa的NSDictionary
,NSArray
和NSSet
以及每个NSMutableX
版本在Objective-C中提供的。
阅读文档并编写算法代码。如果您遇到困难,请提出一个新问题,包括您的算法,您编写的代码以及您遇到的问题。有人可能会帮助你。
HTH