霍纳法则----快速入门,贼好理解

别问我,为什么写这个,我可能一辈子都在开发中用不到,纯粹应付八股。


公式我不知道咋打,就网上复制了个图片。

 这是什么?是一个含x的多项式,他有很多次方。假设让你写代码,x的输入项,求值。

public Double getRsByX(Integer x){
    Double rs;
    //todo 遍历所有的项,按照符号切分(注意优先级)
    for(){
        .....
        //todo 计算每一项的内容
        for(){
            .....
            }
        //todo 将每一项的结果进行整合进总结果中
        ......
    }
    return rs;

}

ok,这有2个for循环吧,简单评估一下,一般2个for循环,一个循环为n次,2个时间复杂度为n^2

霍纳法则就是优化多次方多项式的计算,让他运行更快。

核心-记住:就是把【多次方】多项式,转换为【1次方】多项式。

转换后

 用小学的提取公因式,一直提,直到...为1次方多项式

public Double getRsByX(Integer x){
    Double rs;
    //todo 按括号切分,优先级先算括号里的
    for(){
     //todo 先算括号中的每个,算的时候就能计算到总和中
    }
    return rs;

}

一个for循环,结束了,时间复杂度n

完!


接下来说一下,计算机系统结构中的霍纳法则(感觉和真正的霍纳解决的问题一点关系都没有,这我得吐槽一下天朝的教育,是学以不用)

经常会碰到给你一个表达式,然后要求你画树形图的情况。

1.要明确记住,在霍纳法则中,树形图只能是二叉树

2.转换为多处理机的表达式方法

展开表达式,两两提公因式,跟着感觉看一下,左边和右边这样加大括号好像相等,就加大括号,画个图如果左右子树很平均,就说明成功了。

比如:

a(b+cd+cef)+g 这样一看,它的树就很比均匀,右边只有一个g,左边一连串,接下来走我们的方法。

1.展开表达式,这里画完图发现少了一个,那就不是二叉树

ab+acd+acef+g

2.提取公因式,然后刚好是22一对了,加括号

[a(b+cd)]+[acef+g]

3.画图,从上往下画先画中间的+号,然后在左边中间的符号,多表达式的,放左边(放表达式中间符号),因为左边可以一直延伸(二叉树优先延伸最左和最右),然后右边在补一个单的(单个靠里)。

我在processon画了一个图


ok,现在展示一下我的功底,随便给我一个表达式,我给你画出来树形图

 a ( b + c ( d + e ( f + g h ) ) )比如这个

1.展开

a(b+c(d+ef+egh))=ab+acd+acef+acegh

2.两两提公因式

a(b+cd)+ace(f+gh)

3.画括号

[a(b+cd)]+[ace(f+gh)]

4.画图

之前写错了,右边写成e,左边的图不想截了,右边的图已经改正

先画中间的+号,然后在画2个表达式的中间,他们都是x

 先画左边,小的是a放到里面,长的是b+cd放外面,并且他的中间是+号,所以最左边用+号

剩下b+cd,b是短的放里面,cd是长的表达式,中间是x号,所以放外边

就剩下c,d。一样长,随便放

接下来画右边,2边一样长,随便放,直接画完了。中间processOn出bug了,2个标签一直放不到里面。

答案检测-和答案一摸一样,只是说,答案是把右边画到左边了。(以答案为准,开头应该先把字母多的放左边)我这样也是对的,正常是不扣分的。就怕有些学生改的,他不懂。给你打个八叉。

ok,我后面又发现了一个更牛逼的。如何减少树高。

a+b(c+def+g)+h,他怎么设定最小树高。

按咱们的套路来,展开,22相提取

a+bc+bdef+bg+h,然后现在开始分了。怎么提取公因数

咱们提取出来有2个。

第一种a+h+b(c+def)+bg

第二种a+h+b(g+c)+bdef

尽可能减少树高,树高其实就是你最长的符号表达式

第一种最长的是b(c+def),第二种最长的是bdef。

第一种的符号有4个,第二种的符号有3个。所以第二种很明显树更低。

最后算出来就选第二种,画出来后第一种是5层,第二种是4层。

另外一个新的,T1单机的计算,就是化简到最简,数运算符号。


参考:

霍纳法则 - 知乎

猜你喜欢

转载自blog.csdn.net/qq_38403590/article/details/131767911