2016-03-18 21 views
-4

给定一个有向图的字典,表示嵌套组及其成员,将扁平化结构并返回给定组的所有用户。给定组(iOS)的扁平结构和返回用户

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

你有没有做过任何你可以展示的尝试?看起来您需要编写一个接受字典和组名的函数,并返回一个包含该组成员和嵌套组(以及嵌套组中的嵌套组等)的数组。虽然你不必使用递归,但它可能是一个合理的方法。也看看NSMutableSet作为一种简单的方法来避免重复 – Paulw11

+0

我试图但我不知道哪里开始诚实。 –

+0

那么,首先实现一个接受字典和字符串并返回数组的函数。在那个函数中需要创建一个包含组成员的新数组。然后,您需要查看该组是否有任何嵌套组。如果是这样,那么得到*那个*组的成员 - 提示你可以使用'flattenGroup'来做到这一点 - 并将这些成员添加到数组中。 – Paulw11

回答

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'] 

所以我们从这个问题有什么样的信息:

  • “鉴于有向图的字典” - 你有向图中,我们假定它是一个DAG,表示为字典
  • “代表嵌套组及其成员” &样本数据 - 字典中的每个节点/条目本身是包含两个项目的词典:成员的列表(阵列)和嵌套组的列表
  • “扁平结构并返回给定组的所有用户”&“def flattenGroup(members_by_groups, group_name): - 生成一个算法flattenGroup,它给出了dat a和组名将返回该组中所有成员及其嵌套组。
  • 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,NSArrayNSSet以及各自的NSMutableX版本在Objective-C中提供。

请阅读文档并编写您的算法代码。如果您遇到问题,请提出一个新问题,包括您的算法,您编写的代码以及您遇到的问题。有人可能会帮助你。

HTH