辅助的存储方式

saishow 2011-08-26 06:20:36
http://blog.csdn.net/zhanxinhang/article/details/6710285

题:假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
分析:
方法一、若使用辅助的存储方式,该选择何种存储方式呢?可使用hash的存储方式,以1到1000作为hash表的索引,遍历原数组,统计各数字出现的个数并存储到以该数字为索引值的hash表中,若某个hash[x]的值为2则退出循环,x就是重复出现两次的数字。时间复杂度最坏是O(n)。优点:高效率,缺点:消耗的内存空间过大。代码如下:


请问一下 辅助的存储方式 是指什么?
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
saishow 2011-08-27
  • 打赏
  • 举报
回复
迷糊的很先结贴,谢谢各位,
SuperFC 2011-08-26
  • 打赏
  • 举报
回复
固定偏移标志法:
这个就是时间复杂度O(N), 空间复杂度O(1)的算法!
利用a[N]本身中值和下标的关系来做标记,处理完成后再清除标记即可

a[N],里面是1至N-1。原数组a[i]最大是N-1,若a[i]=K在某处出现后,将a[K]加一次N,做标记,当某处a[i]=K再次成立时,查看a[K]即可知道K已经出现过。a[i]在程序中最大也只是N-1+N=2N-1(溢出了怎么办啊???),此为一个限制条件


int do_dup(int arr[],int NUM)
{
int temp=0;

for(int i=0; i<NUM; i++)
{
if(arr[i]>=NUM)
temp=arr[i]-NUM; // 该值重复了,因为曾经加过一次了
else
temp=arr[i];

if(arr[temp]<NUM)
{
arr[temp]+=NUM; //做上标记
}
else
{
printf("有重复");
return temp;
}
}

printf("无重复");
return -1;
}
AnYidan 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tg15 的回复:]
应该就是额外的存储空间。就是哈希表需要的空间。
如果直接遍历查找重复的,就可以不用额外的空间。但时间复杂度一定高于O(n)级别。
用了哈希表,多用空间,可以把时间降了O(n)级别,
这就牺牲空间换时间的做法。
[/Quote]

编程就是空间和时间的平衡
0153 2011-08-26
  • 打赏
  • 举报
回复
直接在原来的数组上计算,使得每个下标号存放的值是下标号+1(使用XOR交换法),等到发现哪个值想要放到指定的下标号去时已经被相同的占据了,就找到了。
starfox789 2011-08-26
  • 打赏
  • 举报
回复
就是说除了原始存储这1001个数所用空间以外的空间
tg15 2011-08-26
  • 打赏
  • 举报
回复
应该就是额外的存储空间。就是哈希表需要的空间。
如果直接遍历查找重复的,就可以不用额外的空间。但时间复杂度一定高于O(n)级别。
用了哈希表,多用空间,可以把时间降了O(n)级别,
这就牺牲空间换时间的做法。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧