求一个函数的优化

FancyMouse FancyMouse 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
发在这个区说明算法层面上的优化我已经想不出来了,只能追求常数上的优化了。瓶颈就一个函数,我想问一下能有什么优化。
先给代码:

typedef unsigned long long uint64;
uint64 dp[33][19];
int n;
uint64 StateToIndex(uint64 state, int blackpos)
{
uint64 result = 0;
int prev = 1;
for(int i=n-1;i>=0;i--)
switch((state >> (2*i)) & 0x3)
{
case 2:
result += dp[i][prev+1] + dp[i][prev];
if(--prev < 0)
return -1; //invalid state
break;
case 1:
result += dp[i][prev];
++prev;
default:
break;
}
return result;
}

以下是几点说明。
1. 代码里n的范围大概在24~28左右,并且可以看成常数,也就是说单个进程里n的值不会改变。dp数组是运行时计算,但是和输入无关,所以也能看成常数。uint64类型是必须的,uint32不够大。
2. 程序逻辑保证数据都合法,prev不会越界。for loop结束以后prev保证==0。
3. 那个if期望是一般不进入if。
4. 目前dp是运行期生成,n是全局变量。dp直接写编译期常数没有问题。n写成template int也没有问题,不过我不知道n做成const对这里有没有好处。坏处目前倒有一个,编译时间会从12秒增加到若干分钟(因为组合爆炸,代码里已经有很多的template了)。
5. 试过预计算dp[i][prev+1] + dp[i][prev],但是效果不明显。试过if(unlikely()),效果也不明显。
6. 最终平台linux 3.2 x64,gcc 4.7.2,开-O3。CPU是i7 3930K。目标是做到几倍的优化(我知道这有可能非常困难,但是做不到几倍的话我这程序就要跑一整年了)。


最后给个dp数组的计算代码:

dp[0][0] = 1;
for(int i=1;i<=32;i++)
for(int j=0;j<=16;j++)
{
if(j <= i-1)
dp[i][j] += dp[i-1][j]; // current value 0
if(j+1 <= i-1)
dp[i][j] += dp[i-1][j+1]; // current value 1
if(j > 0)
dp[i][j] += dp[i-1][j-1]; // current value 2
}
...全文

相关推荐

线性规划是在一组线性约束条件下,求一个线性目标函数的最大值或最小值的数学优化方法.docx

基本概念 线性规划(Linear Programming,LP)是在一组线性约束条件下,求一个线性目标函数的最大值或最小值的数学优化方法。 数学模型 目标函数:通常表示为 ,其中 是系数,是决策变量,目标是使 最大化或最小化。例如,在生产计划问题中,可能表示利润或成本。 约束条件:包括等式约束和不等式约束。不等式约束一般形式为 或 ,等式约束形式为 ,其中 和 是常数。这些约束条件限制了决策变量的取值范围,反映了实际问题中的资源限制、技术要求等方面的限制条件。 求解方法 单纯形法 这是求解线性规划问题最常用的方法之一。它从一个可行解开始,通过迭代逐步改进目标函数的值,直到找到最优解。在每次迭代中,选择一个非基变量进入基变量集合,同时选择一个基变量离开基变量集合,从而实现从一个基本可行解到另一个基本可行解的转换。 内点法 该方法是从可行域的内部而不是边界开始进行迭代搜索。通过定义一个障碍函数,将有约束的优化问题转化为一系列无约束的优化问题,然后利用牛顿法等方法求解这些无约束问题,逐渐逼近可行域的边界,最终找到最优解。 应用领域 生产计划与资源分配:企业可以根据不同产品的利润、生产时间、

大叔_爱编程

DSP的代码优化求余运算,用移位实现乘除法运算,延时函数

位操作只需一个指令周期即可完成,而大部分的 C 编译器的“ % ”运算均是调用子程序来完成,代码长、执行速度慢。

mercy_achieve61

求函数值.zip

求函数值.zip

木鄑

python 求一元函数极小值-第7章 函数的极小值.pdf

。。。

苦茶子12138

DSPC6000 CCS矩阵求逆

DSP C6000矩阵求逆运算实现。通过调用芯片自带库函数实现,无需自己编写C程序。内含调用说明和例程。

monster木
评论 32
收藏 已收藏
分享
返回顶部
FancyMouse
C++ 语言 65,214 成员 250,514 内容