C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略
2007-08-29 21:47
1006 查看
【序】创新的源泉在哪?idea来自于analogy and imitation。下面第二种方法是我在分析原作者的思路时想到的,也就是借鉴模仿吧,让我突然觉得,如果每一个算法题目,要是能分析其精髓,举一反三,再来点创新,我相信不用把所有常考的算法都做一遍,我也能够应付,这才是我学习此算法得到的idear!
[align=center]反转32 位数[/align]
[align=center]saior_forever sailing_9806@163.com 转载请注明[/align]
[align=center]http://blog.csdn.net/sailor_8318/archive/2007/08/29/1764477.aspx[/align]
[align=center] [/align]
把一个32位的数按位反转,就是第32位转到第1位,第31位转到第2位…………
什么样的算法最节省效率?
参考http://www.yuanma.org/data/2007/0723/article_2763.htm
unsignedint bit_reverse(unsignedint n)
{
n =((n >> 1)& 0x55555555)|((n << 1)& 0xaaaaaaaa);
n =((n >> 2)& 0x33333333)|((n << 2)& 0xcccccccc);
n =((n >> 4)& 0x0f0f0f0f)|((n << 4)& 0xf0f0f0f0);
n =((n >> 8)& 0x00ff00ff)|((n << 8)& 0xff00ff00);
n =((n >> 16)& 0x0000ffff)|((n << 16)& 0xffff0000);
return n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。
上述奇偶、2、4、8、16的交换方法可以演变有四种实现形式,本质一样,可以都先移后取、都先取后移以及一个先移后取、另一个先取后移
受上面程序启发,可以考虑16、8、4、2、奇偶来实现交换,即先将左右整体换边,再处理局部换边的问题,
将32位分成两个16位的箭头,折半互换有两种实现方式:
一,先把每个箭头换向,整体分别左移或右移16位,即可;问题是每个箭头怎么换向?问题又成了16位数怎么折半互换,再分成两个8位的箭头,如上方法,依次实现,最后就是奇偶互换了,可以形成递归算法;或者将1的思路反相考虑,直接奇偶互换,2、2互换,4、4互换,8、8互换,16、16互换即可,是一种倒推条件的方法,对应于原作者的方法。
二,先把两个箭头的位置互换,即16、16互换;再将每个箭头分成两份,两组8、8互换,依次类推,4组4、4互换,8组2、2互换,16组奇偶互换,实现方法和思考方法一致。
第二种方法更容易想到,借鉴了二分查找的思想,逐层分半。
如果为面试,要是你很快写出上述算法,一种说明你是天才,另外一种说明你以前做过此题,那么考察就没有意义了,只能说明你准备充分,不能说明你有多牛;当然天才是很少的了,他立刻随便再出个题,如果你也能很快搞定,那可能真说明你是天才,可是这样的概率太小了;咱们还是老实点吧,肯定不能说咱们做过,又不能说自己是天才,那要想装牛B怎么办呢?
创新的源泉在哪?肯定不是抄袭,做过跟抄袭差不多了,idea来自于analogy and imitation,类比借鉴才是创新的源泉,不能无地拔高楼,但咱们可以借鉴模仿,这才是体现人学习的能力,才是素质的根本。对于一个很复杂的算法,我相信借鉴模仿的理由比证明你是个天才更让人信服,因为我不是天才,我只能以此来博取面试官的信任。
面试是一种策略,同样的事情,不同的表述方式,可以让面试官产生不同的印象,我相信你在你给面试官一个答案的时候,能更好的阐述你的理由,强调你的学习模仿借鉴能力,我相信面试官会认为你具备创新能力。
现在课题时间很紧,可我为什么要抽时间写此文呢?上述第二种方法是我在分析原作者的思路时想到的,也就是借鉴模仿吧,让我突然觉得,如果每一个算法题目,要是能分析其精髓,举一反三,再来点创新,我相信不用把所有常考的算法都做一遍,我也能够应付,这才是我学习此算法得到的idear!
以上乃个人愚见,如果大家有其他的算法,欢迎讨论
[align=center]反转32 位数[/align]
[align=center]saior_forever sailing_9806@163.com 转载请注明[/align]
[align=center]http://blog.csdn.net/sailor_8318/archive/2007/08/29/1764477.aspx[/align]
[align=center] [/align]
把一个32位的数按位反转,就是第32位转到第1位,第31位转到第2位…………
什么样的算法最节省效率?
参考http://www.yuanma.org/data/2007/0723/article_2763.htm
unsignedint bit_reverse(unsignedint n)
{
n =((n >> 1)& 0x55555555)|((n << 1)& 0xaaaaaaaa);
n =((n >> 2)& 0x33333333)|((n << 2)& 0xcccccccc);
n =((n >> 4)& 0x0f0f0f0f)|((n << 4)& 0xf0f0f0f0);
n =((n >> 8)& 0x00ff00ff)|((n << 8)& 0xff00ff00);
n =((n >> 16)& 0x0000ffff)|((n << 16)& 0xffff0000);
return n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。
上述奇偶、2、4、8、16的交换方法可以演变有四种实现形式,本质一样,可以都先移后取、都先取后移以及一个先移后取、另一个先取后移
受上面程序启发,可以考虑16、8、4、2、奇偶来实现交换,即先将左右整体换边,再处理局部换边的问题,
将32位分成两个16位的箭头,折半互换有两种实现方式:
一,先把每个箭头换向,整体分别左移或右移16位,即可;问题是每个箭头怎么换向?问题又成了16位数怎么折半互换,再分成两个8位的箭头,如上方法,依次实现,最后就是奇偶互换了,可以形成递归算法;或者将1的思路反相考虑,直接奇偶互换,2、2互换,4、4互换,8、8互换,16、16互换即可,是一种倒推条件的方法,对应于原作者的方法。
二,先把两个箭头的位置互换,即16、16互换;再将每个箭头分成两份,两组8、8互换,依次类推,4组4、4互换,8组2、2互换,16组奇偶互换,实现方法和思考方法一致。
第二种方法更容易想到,借鉴了二分查找的思想,逐层分半。
如果为面试,要是你很快写出上述算法,一种说明你是天才,另外一种说明你以前做过此题,那么考察就没有意义了,只能说明你准备充分,不能说明你有多牛;当然天才是很少的了,他立刻随便再出个题,如果你也能很快搞定,那可能真说明你是天才,可是这样的概率太小了;咱们还是老实点吧,肯定不能说咱们做过,又不能说自己是天才,那要想装牛B怎么办呢?
创新的源泉在哪?肯定不是抄袭,做过跟抄袭差不多了,idea来自于analogy and imitation,类比借鉴才是创新的源泉,不能无地拔高楼,但咱们可以借鉴模仿,这才是体现人学习的能力,才是素质的根本。对于一个很复杂的算法,我相信借鉴模仿的理由比证明你是个天才更让人信服,因为我不是天才,我只能以此来博取面试官的信任。
面试是一种策略,同样的事情,不同的表述方式,可以让面试官产生不同的印象,我相信你在你给面试官一个答案的时候,能更好的阐述你的理由,强调你的学习模仿借鉴能力,我相信面试官会认为你具备创新能力。
现在课题时间很紧,可我为什么要抽时间写此文呢?上述第二种方法是我在分析原作者的思路时想到的,也就是借鉴模仿吧,让我突然觉得,如果每一个算法题目,要是能分析其精髓,举一反三,再来点创新,我相信不用把所有常考的算法都做一遍,我也能够应付,这才是我学习此算法得到的idear!
以上乃个人愚见,如果大家有其他的算法,欢迎讨论
相关文章推荐
- C/C++面试之算法系列--快速计算32位数中1的位数
- C/C++面试之算法系列--不申请变量和空间反转字符串
- 面试引发的high level abstration of OO language books named "Objects Unencapsulated: Java, Eiffel, and C++?" --正反全面分析编程语言
- Asp.net MVC 示例项目"Suteki.Shop"分析之---IOC(控制反转)
- c++实现"四分位数"算法1
- C/C++面试之算法系列--atoi(char *str)将字符串转换成整数
- C/C++面试之算法系列--如何实现用更少的空间表示英文字母(a ~ z)构成char A[n]字符串
- C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- C/C++面试之算法系列--如何实现用更少的空间表示英文字母(a ~ z)构成char A[n]字符串
- C/C++面试之算法系列--寻找最大公共子字符串
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen
- C/C++面试之算法系列
- C/C++面试(1)——extern "C"
- C/C++面试之算法系列--打印 N*N 螺旋矩阵
- C/C++面试之算法系列--二维动态数组定义及二维静态数组与**P的区别
- C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理续(伪类选择器“PSEUDO”和子伪类选择器"CHILD"原子选择器详解)
- 面试被虐系列_算法分析篇_二叉树