• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

竹千代

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

减治法

核心数学式:

  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)
}

 

posted on 2015-07-28 09:59  竹千代  阅读(907)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3