下面是我的代码,用于检查一个集合(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:
a1为空或a2为空n大于a1的大小,因此a1[i]溢出并读取无效地址m大于a1的大小,因此a1[i]溢出并读取无效地址int散列[max+1]={0}需要太大的哈希值的缓冲区大小一个堆栈,该堆栈不可用。您可以在堆中分配哈希,也可以在数据中分配为静态。或者,您可能希望使用brksyscall来增加堆栈的可用内存a2[i]大于max,这可能导致hash[a2[i]]中的内存访问溢出
我强烈建议您了解如何实现哈希表。您可能对线性探测、二次探测、双重散列和分离链接感兴趣。
如果您厌倦了在静态哈希表中进行重新哈希,那么您可能希望检查可扩展哈希和线性哈希,这两种哈希采用局部重新分布而不是全局重新哈希