我的代码编译得很好,但在Geeksforgeks上提交时显示分段错误……我无法识别问题

下面是我的代码,用于检查一个集合(a2)是否是另一个集合(a1)的子集。
在main函数中声明数组,然后将其传递给该isSubset函数。
我创建了一个包含所有元素0的散列数组,并从a1开始按元素递增,然后按元素递增a2
现在从值为2的哈希数组中计算元素

字符串发行集(int a1[],int a2[],int n,int m){
int max=a1[0];
整数计数=0;
对于(int i=0;i<n;i++){
如果(a1[i]>最大值){
max=a1[i];
}
}
int hash[max+1]={0};
对于(int i=0;i<n;i++){
散列[a1[i]]++;
}
对于(int i=0;i<m;i++){
散列[a2[i]]++;
}
对于(int i=0;i<max+1;i++){
if(散列[i]==2)
计数++;
}
如果(计数=m)
返回“是”;;
否则返回“否”;;
}

您可能会得到一个SIGSEGV:

  1. a1为空或a2为空
  2. n大于a1的大小,因此a1[i]溢出并读取无效地址
  3. m大于a1的大小,因此a1[i]溢出并读取无效地址
  4. int散列[max+1]={0}需要太大的哈希值的缓冲区大小一个堆栈,该堆栈不可用。您可以在堆中分配哈希,也可以在数据中分配为静态。或者,您可能希望使用brksyscall来增加堆栈的可用内存
  5. a2[i]大于max,这可能导致hash[a2[i]]中的内存访问溢出

我强烈建议您了解如何实现哈希表。您可能对线性探测、二次探测、双重散列和分离链接感兴趣。
如果您厌倦了在静态哈希表中进行重新哈希,那么您可能希望检查可扩展哈希和线性哈希,这两种哈希采用局部重新分布而不是全局重新哈希

发表评论