转:min(x,y)高效算法
2011-08-23 09:03
260 查看
命题:给定整数x,y,计算较小值m。
两个数的差异,在于他们的差,于是想到计算z = x - y,我想也许可以利用这个中间值,利用一些巧妙的位运算求出,可是貌似还是比较困难。于是我打算重新理一下思路:
可能出现的情况:(暂时忽略特殊情况 z = 0)
1. x < y
z < 0
就是要找到一个函数f,满足f(y , z) = x
2. x > y
z > 0
就需要这个f不仅满足1,而且满足此时f(y , z) = y
因为算法的目的是使用加减法、位运算这些基本运算,尽可能简单的计算。所以我选择了加法运算
y + g(z) = x , z = x - y < 0;
y + g(z) = y , z = x - y > 0;
最终变成寻求一元函数g
就是
g(z) = z, z < 0
g(z) = 0, z > 0
也就是要找到一个一元分段函数,而且需要运算简单,于是我想到了g(z) = (z >> 32) & z
如果z < 0,z>>32得到的是FFFFFFFF,再与上一个z,还是z,
如果z > 0, z>>32得到的是0000000,最终还是0
所以最终的算法是
z = x - y
m = (z >> 32) & z + y;
这个算法应该跟当初看到的比较接近了。它的优点很显然,全部是最基本的运算,而且不包含控制指令,而且完全可以直接由寄存器计算完成,效率很高。
算法本身并非什么惊天地泣鬼神大算法,而且在编译器里肯定会有自己做这样的优化,其实最让我欣慰的是我这次的思路,思路非常清晰,很久没有动脑子的我,居然还能这么思考,我已经很高兴了。其中主要包含两种思想:分类讨论、降低元数(降二元为一元)。这也是使用非常广泛的方法了,前者主要帮助理清思路,后者主要降低复杂度。
两个数的差异,在于他们的差,于是想到计算z = x - y,我想也许可以利用这个中间值,利用一些巧妙的位运算求出,可是貌似还是比较困难。于是我打算重新理一下思路:
可能出现的情况:(暂时忽略特殊情况 z = 0)
1. x < y
z < 0
就是要找到一个函数f,满足f(y , z) = x
2. x > y
z > 0
就需要这个f不仅满足1,而且满足此时f(y , z) = y
因为算法的目的是使用加减法、位运算这些基本运算,尽可能简单的计算。所以我选择了加法运算
y + g(z) = x , z = x - y < 0;
y + g(z) = y , z = x - y > 0;
最终变成寻求一元函数g
就是
g(z) = z, z < 0
g(z) = 0, z > 0
也就是要找到一个一元分段函数,而且需要运算简单,于是我想到了g(z) = (z >> 32) & z
如果z < 0,z>>32得到的是FFFFFFFF,再与上一个z,还是z,
如果z > 0, z>>32得到的是0000000,最终还是0
所以最终的算法是
z = x - y
m = (z >> 32) & z + y;
这个算法应该跟当初看到的比较接近了。它的优点很显然,全部是最基本的运算,而且不包含控制指令,而且完全可以直接由寄存器计算完成,效率很高。
算法本身并非什么惊天地泣鬼神大算法,而且在编译器里肯定会有自己做这样的优化,其实最让我欣慰的是我这次的思路,思路非常清晰,很久没有动脑子的我,居然还能这么思考,我已经很高兴了。其中主要包含两种思想:分类讨论、降低元数(降二元为一元)。这也是使用非常广泛的方法了,前者主要帮助理清思路,后者主要降低复杂度。
相关文章推荐
- 发现一种简单高效的Hash算法,比常用的几种算法效率高出一倍以上
- 高效的计算素数的算法--埃氏筛法
- [NOIP模拟题][高效算法设计][建模][BFS][记忆化搜索]
- UVA - 1619 Feel Good(高效算法:滑动窗口)
- 十六进制转换的高效算法
- 第8章 高效算法设计读书笔记
- 逆序单链表的高效算法
- 紫书_第八章_高效算法设计_8.2.3——二分查找
- 第八章 高效算法设计
- 经典问题8:c/c++ 程序设计 ---bit位逆转高效算法问题
- 斐波那契高效算法(4种算法综合分析)
- 高效真实的云效果渲染算法
- Prim 算法及其高效实现
- VS2015--win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突
- 算法竞赛入门经典:第八章 高效算法设计 8.2归并排序
- N皇后问题的两个最高效算法
- 【算法】大数乘法问题及其高效算法
- 扣除节假日高效算法
- 16宫格全解高效算法
- 请设计一个高效算法,找到四条边颜色相同的最大子方阵。