精华内容
下载资源
问答
  • 2019-11-10 21:47:38

    算法是对特定问题求解步骤的一种描述,通俗一点来说,算法就是一种方案,根据现有的特定的问题提出的一种解决方案。程序=数据结构+算法+程序设计语言,首先根据程序要处理的数据设计数据结构,再设计相应的算法来实现程序想实现的功能,最后选择一门程序设计语言来编写代码。接下来介绍几种常见的算法思想。
    1.递推算法
    递推算法指的是通过已知条件,利用特定关系得出中间结论,逐步递推直到得到最终结果为止。
    1.1算法思路
    递推法可分为顺推法与逆推法两种。所谓顺推法是利用已知条件逐步推算出要解决问题的方法。逆推法是从已知结果出发,用迭代表达式逐步推算出问题开始的条件。

    2.枚举(穷举)算法
    枚举法也称穷举法,是编程中常用算法之一,在解决某些问题时,可能没办法按照一定规律从众多候选答案中找到正确的答案。这时,可从众多候选答案中逐一取出候选答案,并验证该候选答案是否为正确解。将所有候选答案验证后即可找出正确的解。
    2.1算法思路
    枚举法的本质就是从所有候选答案中选出正确的解,使用该算法需要满足两个条件:
    (1)可预先确定候选答案的数量
    (2)候选答案的范围在求解之前必须有一个确定的集合

    3.递归算法
    3.1算法思路
    递归算法是一种直接或者间接调用自身的算法。
    递归算法的具体实现过程一般通过函数来完成,在函数内部,编写代码直接或者间接调用自己,即可完成递归过程。
    编程经验 把求解问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或子过程)来表示问题的解,通过多次递归调用,最终可求出最小问题的解,然后通过这个最小问题的解返回上层调用,再求出次小问题的解,再返回上层调用,不断重复,最终得到整个问题的解,完成递归操作。
    从递归算法的实质可以看出,递归算法是一种循环,只是这种循环不是通过程序设计语言的循环语句实现的,而是通过循环调用函数自身实现的。要实现这种递归循环,一般有三种要求:
    每循环调用一次,问题的规模要有所缩小;
    相邻的循环要有紧密的联系,通常上次的输出作为下次的输入;
    递归调用要有结束条件,无条件调用要陷入死循环而不能正常结束;

    更多相关内容
  • 算法思想有很多,业界公认的常用算法思想有8种,分别是枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟。当然8种只是一个大概的划分,是一个“仁者见仁、智者见智”的问题。 1.1 枚举算法思想 知识点讲解...

    https://www.toutiao.com/a6653981171921191432/

     

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟。当然8种只是一个大概的划分,是一个“仁者见仁、智者见智”的问题。

    1.1 枚举算法思想

    知识点讲解:光盘:视频讲解第2章枚举算法思想.avi

    枚举算法思想的最大特点是,在面对任何问题时它会去尝试每一种解决方法。在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这个结论是可靠的,这种归纳方法叫作枚举法。

    1.1.1 枚举算法基础

    枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while循环实现。使用枚举算法解题的基本思路如下。

    ① 确定枚举对象、枚举范围和判定条件。

    ② 逐一列举可能的解,验证每个解是否是问题的解。

    枚举算法一般按照如下3个步骤进行。

    ① 题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。

    ② 判断是否是真正解的方法。

    ③ 使可能解的范围降至最小,以便提高解决问题的效率。

    枚举算法的主要流程如图1-1所示。

     

    算法工程师必须要知道的8种常用算法思想

    1-1枚举算法流程图

     

    1.2 递推算法思想

    知识点讲解:光盘:视频讲解第2章递推算法思想.avi

    与枚举算法思想相比,递推算法能够通过已知的某个条件,利用特定的关系得出中间推论,然后逐步递推,直到得到结果为止。由此可见,递推算法要比枚举算法聪明,它不会尝试每种可能的方案。

    1.2.1 递推算法基础

    递推算法可以不断利用已有的信息推导出新的东西,在日常应用中有如下两种递推 算法。

    ① 顺推法:从已知条件出发,逐步推算出要解决问题的方法。例如斐波那契数列就可以通过顺推法不断递推算出新的数据。

    ② 逆推法:从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。

    1.3 递归算法思想

    知识点讲解:光盘:视频讲解第2章递归算法思想.avi

    因为递归算法思想往往用函数的形式来体现,所以递归算法需要预先编写功能函数。这些函数是独立的功能,能够实现解决某个问题的具体功能,当需要时直接调用这个函数即可。在本节的内容中,将详细讲解递归算法思想的基本知识。

    1.3.1 递归算法基础

    在计算机编程应用中,递归算法对解决大多数问题是十分有效的,它能够使算法的描述变得简洁而且易于理解。递归算法有如下3个特点。

    ① 递归过程一般通过函数或子过程来实现。

    ② 递归算法在函数或子过程的内部,直接或者间接地调用自己的算法。

    ③ 递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解。

    在使用递归算法时,读者应该注意如下4点。

    ① 递归是在过程或函数中调用自身的过程。

    ② 在使用递归策略时,必须有一个明确的递归结束条件,这称为递归出口。

    ③ 递归算法通常显得很简洁,但是运行效率较低,所以一般不提倡用递归算法设计程序。

    ④ 在递归调用过程中,系统用栈来存储每一层的返回点和局部量。如果递归次数过多,则容易造成栈溢出,所以一般不提倡用递归算法设计程序。

    1.4 分治算法思想

    知识点讲解:光盘:视频讲解第2章分治算法思想.avi

    在本节将要讲解的分治算法也采取了各个击破的方法,将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。

    1.4.1 分治算法基础

    在编程过程中,经常遇到处理数据相当多、求解过程比较复杂、直接求解法会比较耗时的问题。在求解这类问题时,可以采用各个击破的方法。具体做法是:先把这个问题分解成几个较小的子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个大问题的解。如果这些子问题还是比较大,还可以继续再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治算法的基本思想。

    使用分治算法解题的一般步骤如下。

    ① 分解,将要解决的问题划分成若干个规模较小的同类问题。

    ② 求解,当子问题划分得足够小时,用较简单的方法解决。

    ③ 合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

    1.5 贪心算法思想

    知识点讲解:光盘:视频讲解第2章贪心算法思想.avi

    本节所要讲解的贪心算法也被称为贪婪算法,它在求解问题时总想用在当前看来是最好方法来实现。这种算法思想不从整体最优上考虑问题,仅仅是在某种意义上的局部最优求解。虽然贪心算法并不能得到所有问题的整体最优解,但是面对范围相当广泛的许多问题时,能产生整体最优解或者是整体最优解的近似解。由此可见,贪心算法只是追求某个范围内的最优,可以称之为“温柔的贪婪”。

    1.5.1 贪心算法基础

    贪心算法从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。当达到算法中的某一步不能再继续前进时,就停止算法,给出一个近似解。由贪心算法的特点和思路可看出,贪心算法存在以下3个问题。

    ① 不能保证最后的解是最优的。

    ② 不能用来求最大或最小解问题。

    ③ 只能求满足某些约束条件的可行解的范围。

    贪心算法的基本思路如下。

    ① 建立数学模型来描述问题。

    ② 把求解的问题分成若干个子问题。

    ③ 对每一子问题求解,得到子问题的局部最优解。

    ④ 把子问题的局部最优解合并成原来解问题的一个解。

    实现该算法的基本过程如下。

    (1)从问题的某一初始解出发。

    (2)while能向给定总目标前进一步。

    (3)求出可行解的一个解元素。

    (4)由所有解元素组合成问题的一个可行解。

    1.6 试探法算法思想

    试探法也叫回溯法,试探法的处事方式比较委婉,它先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一进行枚举和检验。当发现当前候选解不可能是正确的解时,就选择下一个候选解。如果当前候选解除了不满足问题规模要求外能够满足所有其他要求时,则继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,并继续试探的过程称为向前试探。

    1.6.1 试探法算法基础

    使用试探算法解题的基本步骤如下所示。

    ① 针对所给问题,定义问题的解空间。

    ② 确定易于搜索的解空间结构。

    ③ 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

    试探法为了求得问题的正确解,会先委婉地试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,立即会自觉地退回一步重新选择,然后继续向前试探,如此这般反复进行,直至得到解或证明无解时才死心。

    假设存在一个可以用试探法求解的问题P,该问题表达为:对于已知的由n元组(y1,y2,…,yn)组成的一个状态空间E={(y1,y2,…,yn)∣yiSii=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中,Si是分量yi的定义域,且|Si|有限,i=1,2,…,nE中满足D的全部约束条件的任一n元组为问题P的一个解。

    解问题P的最简单方法是使用枚举法,即对E中的所有n元组逐一检测其是否满足D的全部约束,如果满足,则为问题P的一个解。但是这种方法的计算量非常大。

    对于现实中的许多问题,所给定的约束集D具有完备性,即i元组(y1,y2,…,yi)满足D中仅涉及y1,y2,…,yj的所有约束,这意味着jj<i)元组(y1,y2,…,yj)一定也满足D中仅涉及y1,y2,…,yj的所有约束,i=1,2,…,n。换句话说,只要存在0<=j<=n−1,使得(y 1,y 2,…,yj)违反D中仅涉及y1,y2,…,yj的约束之一,则以(y1,y2,…,yj)为前缀的任何n元组(y1,y2,…,yjyj+1,…,yn)一定也违反D中仅涉及y 1,y 2,…,yi的一个约束,n>=i>;j。因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(y1,y2,…,yj)违反D中仅涉及y1,y2,…,yj的一个约束,就可以肯定,以(y1,y2,…,yj)为前缀的任何n元组(y1,y2,…,yjyj+1,…,yn)都不会是问题P的解,因而就不必去搜索它们、检测它们。试探法是针对这类问题而推出的,比枚举算法的效率更高。

    1.7 迭代算法

    迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,在解决问题时总是重复利用一种方法。与迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法,功能都比较类似。

    1.7.1 迭代算法基础

    迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

    在使用迭代算法解决问题时,需要做好如下3个方面的工作。

    (1)确定迭代变量

    在可以使用迭代算法解决的问题中,至少存在一个迭代变量,即直接或间接地不断由旧值递推出新值的变量。

    (2)建立迭代关系式

    迭代关系式是指如何从变量的前一个值推出其下一个值的公式或关系。通常可以使用递推或倒推的方法来建立迭代关系式,迭代关系式的建立是解决迭代问题的关键。

    (3)对迭代过程进行控制

    在编写迭代程序时,必须确定在什么时候结束迭代过程,不能让迭代过程无休止地重复执行下去。通常可分为如下两种情况来控制迭代过程:

    ① 所需的迭代次数是个确定的值,可以计算出来,可以构建一个固定次数的循环来实现对迭代过程的控制;

    ② 所需的迭代次数无法确定,需要进一步分析出用来结束迭代过程的条件。

    1.8 模拟算法思想

    模拟是对真实事物或者过程的虚拟。在编程时为了实现某个功能,可以用语言来模拟那个功能,模拟成功也就相应地表示编程成功。

    1.8.1 模拟算法的思路

    模拟算法是一种基本的算法思想,可用于考查程序员的基本编程能力,其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟。在解决模拟类问题时,需要注意字符串处理、特殊情况处理和对题目意思的理解。在C语言中,通常使用函数srand()和rand()来生成随机数。其中,函数srand()用于初始化随机数发生器,然后使用函数rand()来生成随机数。如果要使用上述两个函数,则需要在源程序头部包含time.h文件。在程序设计过程中,可使用随机函数来模拟自然界中发生的不可预测情况。在解题时,需要仔细分析题目给出的规则,要尽可能地做到全面考虑所有可能出现的情况,这是解模拟类问题的关键点之一。

    展开全文
  • YOLO算法思想

    千次阅读 2022-04-08 11:02:31
    YOLO算法的朴素思想:特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标。 YOLO算法处理步骤: 第一步,输入图像 第二步,YOLO将图像划分为SxS的网格 第...

    YOLO算法的朴素思想:特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标。

    YOLO算法处理步骤:

    第一步,输入图像

    第二步,YOLO将图像划分为SxS的网格

    第三步,对每个网格应用图像分类和定位处理,获得预测对象的Bounding box及其对应的类概率

     

     

    展开全文
  • 五种基本算法思想

    万次阅读 多人点赞 2017-12-25 16:31:57
    1.穷举算法思想 穷 举 算 法 (ExhaustiveA ttack method)是 最 简 单 的 一 种 算 法 ,其依赖于计算机的强大计算能力来 穷 尽 每 一 种 可 能 的 情 况 ,从 而 达 到 求 解 问 题 的 目 的 。穷 举 算 法 效 ...

    1.穷举算法思想

    穷 举 算 法 (ExhaustiveA ttack method)是 最 简 单 的 一 种 算 法 ,其依赖于计算机的强大计算能力来 穷 尽 每 一 种 可 能 的 情 况 ,从 而 达 到 求 解 问 题 的 目 的 。穷 举 算 法 效 率 并 不 高 ,但是适应于一 些没有明 显 规 律 可 循 的 场 合。

    基本算法思想
    穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下:
    (1)对于一种可能的情况,计算其结果。
    (2) 判断结果是否满足要求,如果不满足则执行第(1 ) 步来搜索下一个可能的情况;如果满足要求,则表示寻找到一个正确的答案。

    【注意】在使用穷举算法时,需要明确问题的答案的范围,这样才可以在指定范围内搜索答案。指定范围之后,就可以使用循环语句和条件判断语句逐步验证候选答案的正确性,从而得到需要的正确答案。

    经典例子
    《孙子算经》【鸡兔同笼问题】
    今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?
    (在一个笼子里关着若干只鸡和若干只兔,从上面数共有35个头;从下面数共有94只脚。问笼中鸡和兔的数量各是多少?)

    int chickenRabbit(int head,int foot,int *c,int *r){
    int i,j;
    int tag=0;//标志是否有解
    for(i=0;i<=head;i++){//鸡的个数穷举
        j=head-i;//兔子的个数
        if(i*2+j*4==foot){//判断是否满足条件
            tag=1;
            *c=i;
            *r=j;
        }
    }
    return tag;
    }
    int main()
    {
       int c,r;
        if(chickenRabbit(35,94,&c,&r)==1){//如果有解输出
            printf("chickens=%d,rabbits=%d\n",c,r);
        }else{//如果无解
        printf("无解\n");
        }
        return 0;
    }
    

    这里写图片描述

    2.递推算法思想

    递推算法是非常常用的算法思想,在数学计算等场合有着广泛的应用。递推算法适合有明显公式规律的场合。

    基本算法思想
    递推算法是一种理性思维模式的代表,根据已有的数据和关系,逐步推导而得到结果。递推算法的执行过程如下:
    (1) 根据已知结果和关系,求解中间结果。
    (2)判定是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果。如果满足要求,则表示寻找到一个正确的答案。

    【注意】递推算法需要用户知道答案和问题之间的逻辑关系。在许多数学问题中,都有明确的计算公式可以遵循,因此可以采用递推算法来实现。

    经典例子
    斐波那契《算盘书》【兔子产仔问题】
    如果一对两个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生小兔子。也就是说,1 月份出生,3 月份才可产仔。那么假定一年内没有产生兔子死亡事件,那 么 1年后共有多少对兔子呢?

    【规律分析】
    第一个月:a(1)=1对兔子;
    第二个月:a(2)=1对兔子;
    第三个月:a(3)=1+1=2 对兔子;
    第四个月:a(4)=1+2=3 对兔子;
    第五个月:a(5)=2+3=5 对兔子;
    ……
    第n个月:a(n)=a(n-1)+a(n-2)对兔子;

    int Fibonacci(int n)
    {
    int tl,t2;
    if (n==1||n==2)//第1、2个月都只有1对兔子
    {
    return 1;
    }else{//采用递归
    tl=Fibonacci(n-1);
    t2=Fibonacci(n-2);
    return tl+t2;//计算第n个月的兔子对数
    }
    }
    int main()
    {
       int n=12;
       printf("%d个月后兔子对数:%d\n",n,Fibonacci(n));
        return 0;
    }
    

    这里写图片描述

    3.递归算法思想

    递归算法是非常常用的算法思想。使用递归算法,往往可以简化代码编写,提高程序的可读性。但是,不合适的递归会导致程序的执行效率变低。

    基本算法思想
    递归算法就是在程序中不断反复调用自身来达到求解问题的方法。这里的重点是调用自身,这就要求待求解的问题能够分解为相同问题的一个子问题。这样 ,通过多次递归调用,便可以完成求解。
    递归调用是一个函数在它的函数体内调用它自身的函数调用方式,这种函数也称为“递归函数”。在递归函数中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
    函数的递归调用分两种情况:直接递归和间接递归。
    • 直接递归:即在函数中调用函数本身。
    • 间接递归:即间接地调用一个函数,如出如func_a调 用 func_b, func_b 又调用func_a。间接递归用得不多。

    【注意】编写递归函数时,必须使用if语句强制函数在未执行递归调用前返回。否则,在调用函数后,它永远不会返回,这是一个很容易犯的错误。

    经典例子
    【阶乘】

    n!=n*(n-1)*(n-2)*……*2*1
    long fact(int n){
    if(n<=1)return 1;
    else
        return n*fact(n-1);
    }
    int main()
    {
       int n=11;
       printf("%d的阶乘是%d\n",n,fact(n));
        return 0;
    }
    

    这里写图片描述

    4.分治算法思想

    分治算法是一种化繁为简的算法思想。分治算法往往应用于计算步骤比较复杂的问题,通过将问题简化而逐步得到结果。

    基本算法思想
    分治算法的基本思想是将一个计算复杂的问题分为规模较小,计算简单的小问题求解,然后综合各个小问题,得到最终问题的答案。分治算法的执行过程如下:
    (1)对于一个规模为N 的问题,若该问题可以容易地解决(比如说规模>^较小),则直接解决,否则执行下面的步骤。
    (2)将该问题分解为” 个规模较小的子问题,这些子问题互相独立,并且原问题形式相同。
    (3)递归地解子问题。
    (4)然后,将各子问题的解合并得到原问题的解。

    【注意】使用分治算法需要待求解问题能够化简为若干个小规模的相同问题,通过逐步划分,达到一个易于求解的阶段而直接进行求解。然后,程序中可以使用递归算法来进行求解。

    经典例子
    【寻找假币问题】
    一个袋子里有30个硬币,其中一枚是假币,并且假币和真币一模- 样,肉眼很难分辨,目前只知道假币比真币重量轻一点。请问如何区分出假币?

    int falseCoin(int coin[],int low,int high){
    int i,sum1,sum2,sum3;
    int re;
    sum1=sum2=sum3=0;
    //若只有两个硬币
    if(low+1==high){
        if(coin[low]<coin[high]){//第一个硬币是假币
        re=low+1;
        return re;
    }else{//第二个硬币是假币
    re=high+1;
    return re;
    }
    }
    //硬币个数大于2
    if((high-low+1)%2==0){//偶数个硬币
        for(i=low;i<=low+(high-low)/2;i++){//前半段重量
            sum1=sum1+coin[i];
        }
        for(i=low+(high-low)/2+1;i<=high;i++){//后半段重量
          sum2=sum2+coin[i];
        }
        if(sum1>sum2){//后半段轻,假币在后半段
            re=falseCoin(coin,low+(high-low)/2+1,high);
        return re;
        }else if(sum1<sum2){//前半段轻,假币在前半段
         re=falseCoin(coin,low,low+(high-low)/2);
        return re;
        }
    }else{//奇数个硬币
    for(i=low;i<=low+(high-low)/2-1;i++){//前半段重量
            sum1=sum1+coin[i];
        }
        for(i=low+(high-low)/2+1;i<=high;i++){//后半段重量
          sum2=sum2+coin[i];
        }
        sum3=coin[low+(high-low)/2];
        if(sum1>sum2){//后半段轻,假币在后半段
            re=falseCoin(coin,low+(high-low)/2+1,high);
        return re;
        }else if(sum1<sum2){//前半段轻,假币在前半段
         re=falseCoin(coin,low,low+(high-low)/2-1);
        return re;
        }
        if(sum1+sum3==sum2+sum3){//前半段+中间硬币和后半段+中间硬币重量相等,说明中间硬币是假币
            re=low+(high-low)/2+1;
            return  re;
        }
    
    }
    }
    int main()
    {
       int n=11,i;
       int a[n];
       for(i=0;i<n;i++){
        a[i]=2;
       }
       a[7]=1;//设置第八个为假币
      printf("假币是第%d个\n", falseCoin(a,0,n-1));
        return 0;
    }
    

    这里写图片描述

    5.概率算法思想

    概率算法依照概率统计的思路来求解问题,往往不能得到问题的精确解,但却在数值计算领域得到了广泛的应用。因为很多数学问题,往往没有或者很难计算解析解,这时便需要通过数值计算来求解近似值。

    基本算法思想
    概率算法执行的基本过程如下:
    (1)将问题转化为相应的几何图形S, S 的面积是容易计算的,问题的结果往往对应几何图形中某一部分S1 的面积。
    (2)然后,向几何图形中随机撒点。
    (3)统计几何图形S 和 S1 中的点数。根 据 S 的面积和S1 面积的关系以及各图形中的点数来计算得到结果。
    (4) 判断上述结果是否在需要的精度之内,如果未达到精度则执行步骤(2)。如果达到精度,则输出近似结果。
    概率算法大致分为如下4 种形式。

    • 数值概率算法。
    • 蒙 特 卡 罗 (MonteCarlo)算法。
    • 拉 斯 维 加 斯 (Las Vegas)算法。
    • 舍 伍 德 (Sherwood)算法。

    经典例子
    【蒙特卡罗PI概率算法问题】
    在边长为1的正方形内,以1为半径画一个1/4圆。落入院内的概率为PI/4?
    算法思想:在某面积范围内撒点足够多,落在固定区域的点的概率就会将近结果。
    关键:均匀撒点、区域判断

    double MontePI(int n){
    double PI;
    double x,y;
    int i,sum;
    sum=0;
    srand(time(NULL));
    for(i=1;i<n;i++){
        x=(double)rand()/RAND_MAX;//在0-1之间产生一个随机数x
         y=(double)rand()/RAND_MAX;//在0-1之间产生一个随机数y
        if((x*x+y*y)<=1){//判断点是否在圆内
            sum++;//计数
        }
    }
        PI=4.0*sum/n;//计算PI
        return PI;
    }
    
    int main()
    {
       int n=500000;
       double PI;
    
      printf("蒙特卡罗概率PI=%f\n", MontePI(n));
        return 0;
    }
    

    这里写图片描述

    展开全文
  • 常见的算法思想(整理)

    千次阅读 2018-04-29 00:09:23
    1、算法特征 算法的英文名称是Algorithm,这个词在1957年之前在Webster’s New World Dictionary(《韦氏新世界词典》)中还未出现,只能找到带有它的古代涵义的较老形式的“Algorism”(算术),是指用阿拉伯数字进行...
  • Floyd 算法思想

    千次阅读 2018-11-09 21:05:50
    今天总结的是图的最短路径的另外一种算法---弗洛伊德算法。与前面迪杰斯特拉算法不同的是,弗洛伊德算法求的是图中任意一对顶点之间的最短路径,当然,仍然针对有向带权图。  我们就先直接进入算法的演算过程吧~...
  • 贪心算法思想

    千次阅读 2018-08-19 14:40:56
    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对...
  • 基本算法思想

    千次阅读 2017-11-26 22:43:52
    一、什么是算法 1、算法是用于计算的方法,通过这种方法可以达到预期的计算结果。 2、算法是模型分析的一组可行的、确定的和有穷的规则。 3、算法的5个特征 (1)有穷性:算法的指令和步骤的执行次数是有限的,...
  • 简单理解prim算法思想

    千次阅读 2019-11-30 11:24:35
    prim算法是用来求解一个无向图的一个最小生成树(最小生成树的权值是唯一的但是树形可能不唯一) 我个人感觉代码一点也不重要 理解了自己试着敲 该有什么自己一点一点加上 最后自己实现的和网上那些老师讲的也就...
  • 模拟退火算法思想简述

    千次阅读 2019-02-19 19:09:09
    什么是退火: 退火是指先将固体加热到足够高的温度,使分子呈随机...模拟退火算法思想:模仿自然界退火现象而得,利用了物理中固体物质的退火过程与一般优化问题的相似性从某一初始温度开始,伴随温度的不断下降...
  • k-means算法思想

    千次阅读 2020-01-06 11:22:10
    k-means算法思想 https://blog.csdn.net/Dhane/article/details/86661208 算法思想 k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤: 随机选取k个点,作为聚类中心; 计算每个点...
  • 简单详细叙述FpGrowth算法思想(附python源码实现)

    千次阅读 多人点赞 2020-05-11 00:48:31
    关联规则--FpGrowth算法思想及编程实现构建FpTree 本文为博主原创文章,转载请注明出处,并附上原文链接。 原文链接: FpGrowth算法,全称:Frequent Pattern Growth—-频繁模式增长,该算法是Apriori算法的改进版本...
  • KMP算法思想介绍

    千次阅读 2019-01-03 21:49:15
    KMP算法思想介绍 KMP算法是解决字符串匹配问题的很高效的一种算法,它的总的设计思想是当在某一个位置出现不匹配的字符时,应尽量向右移动尽可能大的距离,避免重复比较。 暴力算法: 从主串和模式串(带匹配字符...
  • 决策树算法思想及实现介绍

    千次阅读 2018-10-15 11:19:48
    二、决策树算法思想 决策树学习算法通常是递归地选择最优特征( 注,从所有可能的决策树模型中选择最优决策树是NP完全问题,通常我们得到的决策树是次最优的,即不一定是全局最优,而是在一个节点处做到最优,决策...
  • Floyd算法思想

    千次阅读 2016-03-20 19:34:05
    本来代码量如此小的算法不用出模板了,但是的确思想还是很好的。 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短...
  • 动态规划算法思想解决找零钱问题

    万次阅读 2017-10-16 14:20:54
    使用动态规划算法思想解决的问题一般具有最优子结构性质和重叠子问题这两个因素。 <1> 最优子结构  一个问题的最优解包含其子问题的最优解,这个性质被称为最优子结构性质  <2> 重叠子问题  递归...
  • PCA算法思想及matlab代码

    热门讨论 2009-07-22 10:22:53
    介绍了主成分分析PCA算法思想,简单易懂,附有代码
  • 常见算法思想——穷举法

    千次阅读 热门讨论 2021-01-24 17:30:50
    这篇文章介绍了穷举算法
  • 插入排序算法思想

    千次阅读 2018-07-15 16:27:16
    插入排序的基本思想是:将整个数组a分为有序和无序的两个部分。前者在左边,后者在右边。开始有序的部分只有a[0] , 其余都属于无序的部分。每次取出无序部分的第一个(最左边)元素,把它加入有序部分。假设插入合适...
  • 编程必备的最基本5种算法思想

    万次阅读 多人点赞 2017-11-16 20:53:21
    常用算法思想     1、 穷举算法思想 是最简单的算法之一,依赖计算机的算法能力,来穷尽每一种可能,来求解答案。 执行步骤:  1)、对于一种可能的情况,计算其结果  2)、判断结果是否满足需求,如果不...
  • 参考下述代码即可:
  • 选择排序算法思想

    万次阅读 多人点赞 2018-07-15 15:50:50
    选择排序的基本思想是:如果有N个元素需要排序,那么首先从N个元素中找到最小的那个元素与第0位置上的元素交换(说明一点,如果没有比原本在第0位置上的元素小的就不用交换了,后面的同样是),然后再从剩下的N-1个...
  • 算法通过按照与起始节点的接近程度来确定该访问哪个节点 来解决该问题,该节点根据沿最短可能路径的弧的数量来测量。 通过计算弧来测量距离时,每个弧构成一跳( hop )。 因此,广度优先搜索的本质是首先访问起始...
  • spark mllib算法思想总结

    千次阅读 2019-02-15 09:27:07
    Spark MLlib全部算法总结(2.1.0版) 说明:总结算法为Spark2.1.0中Mllib中源码算法,参照网络链接及书籍整理而成。 算法按计算过程分两大类:监督学习(Supervised Learning)和无监督学习(Unsupervised ...
  • KNN算法思想及算法描述和优缺点

    千次阅读 2020-07-13 10:36:01
    KNN适用于分类的,不需要训练,该算法所选的邻居都是已经正确分类的对象。...KNN算法思想: 在训练集的数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练与之最
  • 几种常用算法思想

    千次阅读 2019-02-10 19:56:25
    today,一起探讨下日常用到的几种算法思想。 穷举算法思想 这个。。。 穷举,穷举,穷举。。。无话可说 递推算法思想 理性思维模式的代表,注重逐步推导。 案例:斐波那契数列(又称:兔子产仔问题) 此...
  • 五大算法思想 动态规划 矩阵连乘问题、走金字塔问题、最长公共子序列问题、最长递增子序列问题、0-1背包问题、完全背包问题
  • 动态规划有两种基本思路,一种是自顶而下的备忘录算法,一种思路是自底向上的动态规划算法
  • C4.5决策树算法思想

    万次阅读 2017-02-26 22:02:19
    前几天有小伙伴问到这个算法,于是想总结一下好了,毕竟是一个如此著名的算法,这里就重在思想啦~建议配合实际例子学习。 参考:1)周志华:《机器学习 》 ; 2) http://www.cnblogs.com/zhangchaoyang 作者:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 702,399
精华内容 280,959
关键字:

算法思想

友情链接: henlao.zip