有n个数的一个数堆,排序是乱的,已知每个数在数堆都有一个重复的数,最快速度找到其中一组相同的数即可,是用什么算法?
贡献下想法:
1、先排序再遍历,判断前后2个
2、确定数字范围,使用足够长的数组作为标志,元素对应下标的值默认为0,出现设置1,先判断是否数组对应下标的数是不是为1,是就可以返回
3、使用高级语言Java的HashMap或HashSet或自己实现链地址法这类hash算法,实现hash映射,找出是不是已经插入过数字,
。。。待楼下补充
用什么语言? python的话可以遍历列表用字典记录出现的数值和下标位置,下次判断如果字典中已经记录有这个数值,就是找到一组相同的数了,Java和c++的话也是用HashMap做一样的算法
你题目的解答代码如下:
a = [6,5,1,4,2,1,6,2,5,3,4,3]
dic = {}
for i in range(len(a)):
if a[i] in dic:
print(f"{a[i]}重复的下标位置是{dic[a[i]]}和{i}")
else:
dic[a[i]] = i
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
使用无序折半算法最坏情况约为N*N/2最好情况约为N/2应该算得最快
如:3 6 9 8 5 2 1 4 7 3 6 9 8 5 2 1 4 7是最坏情况
如:3 6 9 8 5 2 1 4 7 7 4 1 2 5 8 9 6 3是最好情况
可以用C++的map或者手写离散化之类的,因为题目只需要一组解,所以说我们在读入的时候就可以直接看这个数是否之前出现过。
不知道数字环能不能提高效率,这里只是给出一种猜想:
随机取一个位置p∈[1,n],然后得到这个位置对应的数字值为a[p],然后我们取出一个新的位置p'=(a[p] mod n)+1,然后取出新的数值a[p']继续重复如上操作
其中,如果发现有a[i]≠a[j]且a[i]≡a[j] (mod n)的情况,那本次取出p’的值就顺延+d后再对n取模再+1(d是顺延的数值,每次遇到这种情况自增),如果遇到自环也通过这种方式进行偏移
比如说数列6 9 3 7 3 8 6 8 9 7,随机抽取到数字3,那就到位置3,发现产生自环,那就偏移到位置4,得到数字7,再到达位置7得到数字6,再到位置6得到数字8,到位置8得到数字8,发现产生相等,则退出程序【过程中还是用hash记录每个数字是否出现过】
对于纯随机的数据,虽然这种方法的下限和直接遍历没有区别,但是查找效率期望值应该是比直接遍历要高一些的
(这个是书上看来的,本人数学渣渣,不会证明,如果实际与上述内容不符勿喷)
哈希表。将相同的值存储到相同的下标里面,如果已经有了那就输出,没有就交换,如果没有一个重复的那么就会输出排序好的数组并且值和下标一一对应。