码迷,mamicode.com
首页 > 其他好文 > 详细

减治法

时间:2015-07-28 10:37:27      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

核心数学式:

  1. f(n) = f(n-1) + F;   应用:插入排序;生成排序/子集
  2. f(n) = f(n/2) + F;      应用:假币问题;俄式乘法
  3. f(n) = f(n-k) + F;   应用:查找第k大/小的元素

实现思路:考虑对于元素数量为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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!