アルゴリズムについて話す - テキストの第三は、徹底的なアルゴリズムを公表

個々の公共の番号でこの記事の発信元:TechFlow

我々は、特に国境問題で、二分法を精緻化前の記事では、コードを書いて、私たちの時間を議論しました。ポータル:

アルゴリズムについて話す - 誰もが非常に多くの人々が二分法を書いていない知っています

この記事では、我々はアルゴリズムの面で引き続き今日は、二分法を話しません。Laijiangjiangは、高度なバージョンを二分法- 三分ののルールを

はい、あなたはその権利を読んで、これは名前から私のわがままではありませんが、本当のアルゴリズムがあります。しかし、あなたが検索で検索エンジンに行けば、検索が撮影サーズの高い確率となり、三分の一の検索アルゴリズムを見つけるのは困難です。

主な理由は、その二分法であるとはるかに小さい少数派、三分ののルールを導入していない、ほとんどすべてのアルゴリズムの本に比べて。これは、これらのアルゴリズムの中でACM-ICPCの競争の中で、より存在するが、少数派に便利に十分な限り、問題ではありません。三分ののルールの原理は非常に簡単で、かつほとんど同じ二分法が、我々は間隔が3に2が、分割に分割されていない区間を分離しました。その後、我々はまた、値が区間法を減らすことによって決定される見つけたいです。

:ここを参照してください、私はあなたが算術演算の原理を理解することができるはずですが、確かに聞いて疑問があるだろうと信じて、なぜ私たちは3分割されなければならないの2つに分割しても問題が解決されますので、?

この質問に答える前に、別の問題での外観をしましょう。数学的には、二分法は、実際に問題を解決しますか?

前提の二分法は、それを使用覚えていますか?問題を解決するため、実際には二分法は、単調関数を解決しているように、アレイは、注文する必要があります。限り配列としては、配列の配列添字の値にマッピング関数とみなすことができる関数の定義に従って順序付けられます。明らかに、これは単調関数です。私たちは、実際には、本質は見つけることです、によってエレメントv二分法を見つけるのF V(X)=
この機能に対する解決策を。

したがって、二分法シーンの使用は線形関数で単調関数です。私は実現可能な二分法と二次関数の最小値を検索したい場合は?

明らかに現実的ではない、私たちは完成半ばを取得した後、期間中に発生する可能性がありますかについての答えを知らないので。
今回は演奏三分ののルールを必要としています。

三分法会将区间分成三份,这个我们都已经知道了。分成三份,自然需要两个端点。这两个端点各有一个值,我们分别叫做m1和m2。我们要求的是函数的最小值,所以我们要想极值逼近。

但是我们有两个中间点,该怎么逼近呢?

我们直接根据函数图像来分析,根据上图我们可以看出来,m1和m2的函数值和它们距离极值点的远近是有关系的。离极值点越近,函数值越小(也有可能越大,视函数而定)。在上图当中,

,所以m2离极值点更近。我们要缩小区间范围,逼近极值点,所以我们应该让l=m1

这里有一点小问题,我们怎么确定极值点在m2和m1中间呢?万一在m2的右侧该怎么办呢?

我们画出图像来看,这种情况其实并没有区别,我们只会抛弃区间[l, m1]
,并不会影响极值点。

会不会极值点在m1左侧呢?这是不可能的,因为如果极值点在m1左侧,那么m2距离极值点一定比m1远,这种情况下m2处的函数值是不可能小于m1的。

也就是说,三分法的精髓在于,每次通过比较两个值的大小,缩小三分之一的区间。直到最后区间的范围小于我们设定的阈值为止。算法并不难理解,但是当我们真正碰到二次函数的极值问题的时候,如果没有事先接触过三分法,很难一下想到算法。

三分法本身并不难,我们理解了算法之后,写出伪代码来就很容易了:

def trichotomy():
    l, r = start, end
    epsilon = 1e-6
    # 我们自定义的终止条件是区间长度小于1d-6
    while l + epsilon < r:
        margin = (r - l) / 3.0
        m1 = l + margin
        m2 = m1 + margin
        if f(m1) <= f(m2):
            r = m2
        else:
            l = m1
    return l

最后, 我们看一道三分法相关的算法题,来实际演练一下三分法吧。

这是一道POJ3737,链接如下:http://poj.org/problem?id=3737

我来简单介绍一下题意。题意很简单,当下我们拥有一块布,我们知道布的大小,要将布做成一个圆锥形。要使得圆锥形的体积最大,假设布在加工的过程当中没有损耗,请问这个圆锥的体积、底面半径和高分别是多少?

我这里先不放答案,大家不妨自己想一下,实在做不出来,在公众号内回复三分法答案,获取题解。

如果觉得文章有所帮助,请扫码给个关注吧:

おすすめ

転載: www.cnblogs.com/techflow/p/12131376.html