分治法的常见问题

计算x的n次幂

朴素算法:xxx......

分治算法:

n为偶数:x的n/2次幂*x的n/2次幂

n为奇数:x的(n-1)/2次幂*x的(n-1)/2次幂

#include<bits/stdc++.h>
using namespace std;
//朴素算法
int simple(int x,int n)
{
    int num=1;
    for(int i=0;i<n;i++)
    {
        num*=x;
    }
    return num;
}
//分治算法----快速幂
int devided(int x,int n)
{
    int num=1;
    while(n)
    {
        if(n%2==1)
        {
            num*=x;
            n--;
        }
        x*=x;
        n/=2;
    }
    return num;
}

找出数组出现次数超过一半的数字

本质上就是求中位数,比较简单的方法是全部排序,然后取中间值,或者统计所有数字及其出现频率。优化的方法就是利用快算排序中的分治思想:

#include <stdio.h>

int partion(int a[], int n)
{
    if( a == NULL || n <= 0 )
        return -1;

    int i, candidate;
    int times = 0;
    for( i=0; i<n; i++ )
    {
        if( times == 0 )
        {
            candidate = a[i];
            times = 1;
        }
        else if( a[i] == candidate )
            ++times;
        else
            --times;
    }
    return candidate;
}

int main(void)
{
    int a[] = {1,2,3,2,2,2,5,4,2};

    int result = partion(a, 9);
    if( result != -1 )
        printf("%d\n", result);
    else
        printf("Error.\n");

    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 将原问题分解为一组子问题,每个子问题都与原问题类型相同,但是比原问题的规模小 递归求解这些子问题 将子问题的求解结...
    芥丶未央阅读 5,359评论 2 1
  • 判断链表是否有环 先搞清楚有环是什么意思?链表的结构是一环扣一环,每一环都有一个next指针,指向下一个节点,从头...
    宇宙区长李小无阅读 4,429评论 0 1
  • 来自《漫画算法》一书,记录下有用东西供自己查阅。 1.如何判断单链表有环 设置两个指针,初始时都在链表开头,一个指...
    zZzun阅读 3,325评论 0 0
  • 一.实验目的 (1)掌握分治法思想。 (2)学会最近点对问题求解方法。 二.实验步骤与结果 实验总体思路: 本实验...
    预眸丶阅读 4,253评论 0 0
  • 算法思想 分治,分而治之,将原问题划分成 n 个规模较小而结构与原问题相似的子问题,这些规模小的问题与原问题是同质...
    hellomyshadow阅读 2,972评论 0 1

友情链接更多精彩内容