【发布时间】:2016-05-10 15:27:13
【问题描述】:
我遇到了寻找集合子集的问题,我想知道我的算法是否正确。我正在使用递归方法和哈希表来存储已经计算的子集并说输入字符串是“ABCD”:
1) 我的方法是将单个字符添加为哈希键,并将键的子集作为值计算。例如,在我的哈希表中,给定输入字符串的“B”条目看起来像“B”、“BC”、“BD”、“BCD”。调用堆栈的函数然后将使用这些子字符串来形成进一步的子集。例如“AB”、“ABC”、“ABD”、“ABCD”。
2) 我使用 for 循环遍历剩余的字符并检查给定字符的子集是否在哈希表中,如果不是,我递归并形成子集并存储它们。
这个算法的想法是我不必重新计算已经看到的子集,然后截断后续的函数调用。例如 A->C、A->D,因为 C 和 D 的所有子集都是在执行“B”中的 for 循环时计算的。
我的记忆算法正确吗? 即使在我记忆之后,运行时间也会是 O(2^n) 吗?预先感谢您的回复。如果我在任何地方犯了错误,请原谅我,您的 cmets 一定会帮助我改进。再次感谢!
【问题讨论】:
-
运行时间不能小于 O(2^n),因为有 2^n 个子集。
-
没有什么可以“找到” IMO,它已经知道所有子集是什么。您可以决定枚举它们(就像您所做的那样),但这相当于从 0 计数到 (2^n)-1。
标签: algorithm dynamic-programming memoization