标签:
核心数学式:
实现思路:考虑对于元素数量为n的集合的执行结果,如何用数量为n-1、n/2或者n-k的集合的执行结果来表示
实现方法:迭代和递归都可以
/* * 减治法 * 主要思路: * 基于减治法f(n) = f(n-1)...的思路,可以想象, * 对于长度为n的序列,它的所有子集,是它前面n-1元素所构成子集 * 都加最后一个元素 * 例子: * "abcd"全部子集是"abc"全部子集中的元素都加一个‘d‘ */ list<string> jianzhi(const string &str, int cursor) { if (0 == cursor) { list<string> subs; subs.add(""): return subs; } list<string> all_subs = jianzhi(str, cursor - 1); for(list<string>::iterator iter = all_subs.begin(); iter != all_subs.end(); iter++) { *iter += str[cursor]; } return all_subs; }
/* * 第k大/小的问题 */ // 减治法,每次迭代缩小需要查找的范围 int findKmost(array[0, n], k) { pivot = getPivot(array[0,n]); index = surePivotPos(array[0, n], pivot); if (index == k-1) return pivot else if (index > k-1) return findKmost(array[0, index], k) else return findKmost(array[index, n], k-index) }
标签:
原文地址:http://www.cnblogs.com/johnchow/p/4681973.html