c/c++ if分支的消除,提高代码的运行效率

9 篇文章 1 订阅
1 篇文章 0 订阅
一般的if语句
if( v < 10{
	v + 48;
}
else{
	v + 50;
}
改进之后的语句(没有分支了)
v + 55 - ( ( (v- 10>> 15& 7 );

解释

1、if语句可以改进为:v + ( v < 10 ? 48 : 50).
2、后面的三元运算符的原型就是 c ? x : y,此处替换成一个与此等价的表达式:y - ( c~ ? ( y - x ) : 0).
3、如果 c~用-1表示为真,0表示假的话,可以替换成另一个等价的表达式:y - ( c~ & ( y - x ) ).(-1与任何整数相位与结果不变).
4、与三元表达式结合起来 c~ = (v < 10)? -1 : 0,其中等号右边可以替换为(v - 10) >> 15(右移的时候用符号位填充移出去的位.如果为负数移位的结果就是-1,为正数移位的结果就是0)

最终我们全部进行替换的话结果就是这样的啦:v + 55 - ( ( (v- 10) >> 15) & 7 );

本文章有感于B站up主LH_Mouse

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
旅行商问题是一个经典的NP完全问题,它的解法有很多种,其中一种是利用分支界限法。 以下是C++代码实现: ```cpp #include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; const int MAXN = 20; const int INF = 0x3f3f3f3f; int n; // 城市数量 int dis[MAXN][MAXN]; // 城市间距离矩阵 int ans = INF; // 最小路径长度 // 分支界限法 void BranchBound(int u, int d, int len, int vis[]) { // 当前路径长度已超过最小路径长度,剪枝 if (len >= ans) return; // 所有城市都已访问过,更新最小路径长度 if (u == n) { ans = len; return; } // 建立子节点队列 priority_queue<pair<int, int>> q; for (int i = 1; i <= n; ++i) { if (vis[i] == 0) { q.push(make_pair(dis[d][i], i)); } } // 访问子节点 while (!q.empty()) { int v = q.top().second; q.pop(); vis[v] = 1; BranchBound(u + 1, v, len + dis[d][v], vis); vis[v] = 0; } } int main() { // 读入城市数量和距离矩阵 cin >> n; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { cin >> dis[i][j]; } } // 初始化访问数组 int vis[MAXN]; memset(vis, 0, sizeof(vis)); vis[1] = 1; // 分支界限法求解 BranchBound(1, 1, 0, vis); // 输出结果 cout << ans << endl; return 0; } ``` 在以上代码中,我们使用了一个优先队列来存储当前节点的子节点,并按照距离从小到大排序,每次访问距离最近的子节点。这样做的目的是尽可能快地找到最优解,从而加速算法的运行分支界限法的核心思想是通过剪枝来减少搜索空间,从而提高算法的效率。在本题中,我们使用了两个剪枝: 1. 当前路径长度已超过最小路径长度,剪枝; 2. 所有城市都已访问过,更新最小路径长度。 这两个剪枝可以有效地减少搜索空间,提高算法的效率

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值