re: min(x,y)高效算法 夜风 2011-08-24 22:42
@a
也许是我强调得不太清楚,我的写这文章的目的不在于向大家介绍算法本身,这些早已是成熟的算法,我只是从一个推理的角度,介绍我再现该算法的过程。结果不重要,实现也不重要,何必这么钻牛角尖呢?难道文章的中心思想就如此难以把握?
re: min(x,y)高效算法 夜风 2011-08-24 22:42
@a
也许是我强调得不太清楚,我的写这文章的目的不在于向大家介绍算法本身,这些早已是成熟的算法,我只是从一个推理的角度,介绍我再现该算法的过程。结果不重要,实现也不重要,何必这么钻牛角尖呢?难道文章的中心思想就如此难以把握?
re: min(x,y)高效算法 夜风 2011-08-23 20:18
@哎哟,还要用户名2
z >> 32用gcc编译会有警告:
right shift count >= width of type [enabled by default]
虽然计算结果正确,但不知会有什么隐患,所以我已经改成31,谢谢关注
re: min(x,y)高效算法 夜风 2011-08-23 19:54
@哎哟,还要用户名2
效果一样,多一位少一位不影响
re: min(x,y)高效算法 夜风 2011-08-23 19:52
@fuwutu
不知道你的理由是什么?没有出现0的情况,不过少个括号倒是个问题,我忘记了&优先级低于+号,已经修正,谢谢关注
re: min(x,y)高效算法 夜风 2011-08-23 19:47
@matrix42
既然是求差值,那z显然需要一个有符号的整型,对有符号整型右移,是算术移位
re: 一道简单的面食题来自CSDN 夜风 2011-08-22 23:19
我找到个更好的
z = x - y;
z = (z >> 32) & z;
z = z + y;
得到min(x,y) = z
这应该是最高效的算法了,避免了if-else,也避免了乘法运算的复杂性,全部由基本运算取代
re: 做MTK笔试的总结(一) 夜风 2011-08-15 23:13
@夜风
如果不理解,还真有可能出现大问题,我曾经就遇到过一个问题,后来看汇编代码时才回忆起<<的二元函数形式
re: 做MTK笔试的总结(一) 夜风 2011-08-15 23:07
@Chipset
不见的,有可能题目的用意在于考察是否理解<<操作符的函数形式,还有函数参数入栈顺序,如果这样理解,还是比较有技术含量的
re: 做MTK笔试的总结(一) 夜风 2011-08-15 22:58
@江浸月
哦,对的,10和6已经入栈了
<<在同一语句中连续使用,其实本质上是函数的复合调用
cout<<a+b<<" "<<a++<<" "<<b++;
本质上是
operator<<(operator<<(operator<<(cout,a+b),a++),b++)
由于c函数参数传递顺序是从右至左,所以参数的计算次序是:
b++ //7
a++ //11
a+b //18
cout<<18
cout<<11 //应该是10,因为已经先入栈了
cout<<7 //应该是6
可以采用给节点加上额外标记的方法(算法概论中有提到):
准备两个数组pre和post,分两个步骤
1.采用后续遍历算法从根节点开始遍历
准备一个全局的计数变量tag,初始值为0
遍历过程中,
访问节点i之前,pre[i] = tag++;
访问节点i之后,post[i] = tag++;
2.对于节点u,v,求出
b=min(pre[u],pre[v]);
e=max(post[u],post[v]);
然后求出一个i,满足
域 [ pre[i],post[i] ] 包含 [ b,e ],且 post[i] - pre[i] 最小
(这个只要从0到n遍历一下就可以求得了)
那这个i就是要求的了
算法复杂度O(n)
re: C++的流设计很糟糕 夜风 2010-07-07 02:40
@陈梓瀚(vczh)
为什么说是大忌呢?
re: 2005-2009年个人总结 夜风 2010-02-22 16:33
你的总结真让人振奋,新的一年 我也得做点什么了,像兄台学习!
你的总结真让人振奋,新的一年 我也得做点什么了,像兄台学习!
re: 如何为软件源码产品选择授权 夜风 2009-10-28 23:44
这篇文章出现的太及时了!多谢!
re: 虚拟键盘(软键盘)设计要点 夜风 2009-10-19 00:20
@OwnWaterloo
1.kbcwait4ibe是驱动级别的哦,正打算开始研究驱动呢。。。
2.哦,是的,倒是没注意这个。。。但这命名还真是个伤脑筋的问题呢!
你这个算法有很多是多余的,而且位运算就少用+、-,看看下面的算法,感觉不错哦
bool prjfun( int & des , int & src , int n)
{
if(n <= 0)
return false;
int mask = 1 << (n-1);
if((des & mask) != (src & mask))
{
des ^= mask;
src ^= mask;
}
return true;
}