别问我,为什么写这个,我可能一辈子都在开发中用不到,纯粹应付八股。
公式我不知道咋打,就网上复制了个图片。
这是什么?是一个含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单机的计算,就是化简到最简,数运算符号。
参考: