搜索算法
1.地图寻路问题(A,A*,IDA*)
2.博弈问题(Alpha-Beta剪枝,SSS*,MemSSS*)
职能算法
1.遗传算法
2.模拟退火
3.禁忌搜索
4.人工神经网络
汇编优化:
能用整数,则尽量不用浮点数;
循环展开技术(比如100次降到50次):由于现代CPU具有分支预测技术,循环展开增加了代码量,更多占用CPU内部一级代码高速缓存的空间,循环展开远远不如原来有效。
局部变量在堆栈中,这样可以重复使用内存,当一块内存被反复读写,其数据就会存在CPU的内部一级缓存中,访问速度非常快。而零散的静态变量则没有这个优势。内存同CPU内部缓存的数据交换,往往成为程序的速度瓶颈。
除2的整数幂可以被优化成移位操作,但是我们并不主张把n/8写成n>>3,因为现代编译器会帮你做这件事。这里需要注意的是:如果你知道n肯定是个正数,而n又被声明成int时,写成(unsigned)n/8是有利于编译器帮你优化的。因为对于一个有符号的数字除以8并不完全等价于右移3位。
实际上,即使除数不是2的整数幂,编译器的优化依然会消除除法,变成一次乘法加一次移位操作。让编译器有优化余地的唯一前提就是,让除数是一个常数,除了直接写除数,也可以用const int来定义。
对于浮点运算,我们有更多的方法减少除法的运算次数(以下方法在特定条件下,使用一些技巧也同样适用于整数运算):
对于整数除法,如果需要对一个数字反复做除法,则可以先算出其倒数,然后用乘法代替。如果 是常数除法,比如a/3.14倒不必写成a*(1.0/3/14),因为编译器通常会帮你完成这种优化。
在某些情况下,可以用乘法消除掉除法运算,比如if(a>b/c)可以写成if(a*c>b).编译器之所以 不会帮你做这样的优化,是因为两者并非完全等价(如果c是负数,后者的要写成<;当然这个方法 用于整数的时候,要考虑a*c有溢出的可能)
我们还可以想办法把多个除法合并起来。对于运算a/b+c/d,(a*d+c*b)/(b*d)会更快一些,这是 因为即使是算3次乘法也快