拍案叫绝的算法分析
在知乎上有一个拍案叫绝的算法,它主要用来通过位运算查找非重复的对象。具体的内容请查看:
https://www.zhihu.com/question/27547892
这里主要对两个算法的分析说明,小白一下,可能有的同学们刚刚入门:
第一个,有一个N元素的数组,其它都出现了两次,只有一个出现了一次,找出这个数,要求:时间复杂度为O(n)且不再开辟新的内存空间。
[2,2,1]===>1
[4,1,2,1,2]===>4
看到了左面和右面两个分解没,把相关的数转化成二进制的形式,然后按位异或,这个大家肯定都会,比加法还简单,都不用处理进位。然后得到结果再转回到十进制,就是结果了。重点在第二个,有一个n个元素的数组,除了两个数只出现一次外,其余元素都出现两次,让你找出这两个只出现一次的数分别是几,要求时间复杂度为O(n)且再开辟的内存空间固定(与n无关)。
[1,2,2,1,3,4]===>[3,4]
还是看一下图:
第一步,和上面的单一求解一致。没有什么问题,第二步,如何找出两个不同的单次出现的值呢?网上的分析说得清楚,肯定至少有一位是不同的,但是是哪一位呢?在这里,可以假定第一位,那么就如网上的动态图一致,将已知的数据分成了两组。
看一下图上的重点部分:用三种颜色来标明了可以有三种选择的方式,即第一个为1(0),第二为1(0),第三个为1(0)。然后根据这个,把原来的数据分成了2部分*3组,每一组都可以正确得到结果。也就是说,不用把全部三组都算出来,只要有其中一组就可以了。
这里之所以列出三组来,是为了说明,用任何一组都可以得出正确的结果。