布尔表达式 快速求值

勉励前行 2008-11-28 12:46:29
例 a b c 為整數:
( (a>b) && (b<c) && 0) || (1 && 0 && 1 && (a> 5) || (a>c)))*(c == b)

如何算最快? 聽說有短路的算法,很快,不知道如何做短路避免多余的測試。
...全文
197 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfhtian 2008-11-28
  • 打赏
  • 举报
回复
表达式不大对吧,(a>b) && (b <c) && 0直接就为0了,后面的那个也是
sagegz 2008-11-28
  • 打赏
  • 举报
回复
7楼正解!
lc19890326 2008-11-28
  • 打赏
  • 举报
回复
避免多余的判断很简单
当&&操作时,将为0概率大的置前
当||操作时,将为1概率大的置前
toadzw 2008-11-28
  • 打赏
  • 举报
回复
短路就是指的你的用的&& || ,这几个运算符就能达到的功能,不要再有什么算法了;
qingkongyihe2008 2008-11-28
  • 打赏
  • 举报
回复
根据与和或的运算性质,设置最容易判断的条件放其首
jakqigle 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zmlovelx 的回复:]
利用短路求值.
&&的比如a&&b&&c... 把最小概率为真的放在最前面,大的依次放在后面,这样如果前面求出某条件为假,那么后面条件被短路,不用求了.返回假
||的比如a||b||c.... 则把最大概率为真的放在最前面,小的依次放在后面,前面如果某条件为真,那么后面的条件语句被短路,
不用求了,返回真.
当然如果判断不出概率,就把最简单的条件语句放在最前面,复杂的放后面.
[/Quote]
顶上!
我觉得也应该把简单的并且常容易一次性计算的逻辑放在最前,这样可以避免再计算后面的复杂运算。但是这个还是要具体问题具体分析的。
liaoweixiaoyu 2008-11-28
  • 打赏
  • 举报
回复
一步一步看吧
帅得不敢出门 2008-11-28
  • 打赏
  • 举报
回复
利用短路求值.
&&的比如a&&b&&c... 把最小概率为真的放在最前面,大的依次放在后面,这样如果前面求出某条件为假,那么后面条件被短路,不用求了.返回假
||的比如a||b||c.... 则把最大概率为真的放在最前面,小的依次放在后面,前面如果某条件为真,那么后面的条件语句被短路,
不用求了,返回真.
当然如果判断不出概率,就把最简单的条件语句放在最前面,复杂的放后面.
勉励前行 2008-11-28
  • 打赏
  • 举报
回复
那只是個例子
我想問的是在布爾表達式求值過程中,如何避免多余的計算。這樣求值速度才可能快。

string test = "((a>b) && (b <c) && 0) || (1 && 0 && 1 && (a> 5) || (a>c))*(c == b)" ;
bool R = GetResult(test);
//在求值過程中的方法,用什麼方法算得快些。使用棧可以去括號計算表達式,但要執行全部的操作符及比較運算。那樣不快。
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 PPower 的帖子:]
例 a b c 為整數:
( (a>b) && (b <c) && 0) || (1 && 0 && 1 && (a> 5) || (a>c)))*(c == b)

如何算最快? 聽說有短路的算法,很快,不知道如何做短路避免多余的測試。
[/Quote]

我想应该没有什么最快的说法吧,只是有些情况下可以省略一些计算机步骤
比如
||左边出现了1,那么右边放弃计算
&&左边出现了0,那么右边也不再计算
lbjfeng 2008-11-28
  • 打赏
  • 举报
回复
这个有错误吧,老大,
你的C少了一个啊

其实,就是数学里面的公式化简……0&a=0
1||b=1
MAlice 2008-11-28
  • 打赏
  • 举报
回复
7楼的回答得详细
brookmill 2008-11-28
  • 打赏
  • 举报
回复
LZ的表达式多了个),去掉之后结果是0
brookmill 2008-11-28
  • 打赏
  • 举报
回复
一串&&里面有个0,最后结果就是0
一串||里面有个1,最后结果就是1
LZ是在问这个么?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧