本人最近在开发一个数据处理的程序,涉及一个集合处理问题,总结来说大致的问题如下:
有n个数字集合s1,s2,...,si,...,sn,n个集合中可能两两存在交集,且每个集合元素个数不等,
现需要从每个集合中取部分数字构建新集合S,要求S与si每个集合元素的交集个数最少mi1个(mi1最小为0),
最多mi2个(mi2最大值可能为集合si的元素个数),mi1和mi2针对每个si取值不同。
S中的元素个数必须等于X(X的大小可能比单个集合si大小还要小,有可能大,但一定大于所有si指定的mi1相加)。
但从其他集合中取元素时要求大于该集合要求的至少mi1个元素可能导致S与si的交集元素个数大于mi2。
本问题中的集合都是无重复元素的,重复插入相同元素会插入不成功,本问题碰到的最麻烦的问题是,结果集合的元素是固定的,每个si集合取元素有上下限,而各个集合之间存在交集,导致后取值集合使得前面集合超出限定数,如果避免交集中的元素,又可能导致后面集合取出的最小数无法不满足要求。
请给出算法保障最终s的元素与每个si的交集符合该si取值大于等于mi1小于等于mi2的要求。
一个集合元素取值剔重算法问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 - 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7576737
- 这篇博客也不错, 你可以看下一元稀疏多项式乘法问题
- 除此之外, 这篇博客: 一种基于图论的分割图算法中的 简述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
分割图一直是图像识别的热门研究方向,主要完成的任务就是把图中某部分有意义的物体影像抠出来。比入在X光或CT透视中将某些特定的组织抠出来啥的。
- 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 单链表添加元素小节, 巩固相关知识点
- 以下回答由chatgpt基于相关博客总结生成:
解决方案:
可以使用散列表(哈希表)来实现对集合中元素的剔重。具体步骤如下:
- 定义一个散列表
#define HASHSIZE 12 // 定义哈希表长为数组的长度 #define NULLKEY -32786 typedef struct { int *elem; // 指向动态分配数组的指针 int count; // 当前元素个数 }HashTable;
- 初始化散列表
Status InitHashTable (HashTable *H) { int i; m=HASHSIZE; H->count=m; H->elem=(int *)malloc(m*sizeof(int)); for(i=0;i<m;i++) H->elem[i]=NULLKEY; return OK; }
- 对元素进行哈希(散列)操作,将元素存储到散列表中
int Hash(int key) { return key % m; // m为散列表长,取余法获得散列地址 } // 将元素key插入到散列表H中 void InsertHash(HashTable *H,int key) { int addr = Hash(key); while(H->elem[addr]!=NULLKEY) // 冲突的处理 { addr = (addr+1)%m; // 线性探测 } H->elem[addr] = key; H->count--; }
-
遍历集合,对每个元素进行哈希操作,并插入到散列表中
-
遍历散列表,将不为NULLKEY的元素取出来,即为集合中去重后的元素
完整代码如下:
#include <stdio.h> #include <stdlib.h> #define HASHSIZE 12 // 定义哈希表长为数组的长度 #define NULLKEY -32786 typedef struct { int *elem; // 指向动态分配数组的指针 int count; // 当前元素个数 }HashTable; // 初始化哈希表 Status InitHashTable (HashTable *H) { int i; m=HASHSIZE; H->count=m; H->elem=(int *)malloc(m*sizeof(int)); for(i=0;i<m;i++) H->elem[i]=NULLKEY; return OK; } // 哈希函数 int Hash(int key) { return key % m; } // 将元素key插入到散列表H中 void InsertHash(HashTable *H,int key) { int addr = Hash(key); while(H->elem[addr]!=NULLKEY) { addr = (addr+1)%m; } H->elem[addr] = key; H->count--; } int main() { // 读取集合中的元素 int length; printf("请输入集合中元素的个数:"); scanf("%d", &length); int *a = (int*)malloc(length*sizeof(int)); printf("请输入集合中的元素:"); for(int i=0;i<length;i++) { scanf("%d",&a[i]); } // 定义哈希表并初始化 HashTable table; InitHashTable(&table); // 对集合中元素进行哈希操作,插入到哈希表中 for(int i=0;i<length;i++) { InsertHash(&table, a[i]); } // 遍历哈希表,输出不为NULLKEY的元素,即为集合中去重后的元素 printf("去重后的元素为:"); for(int i=0;i<HASHSIZE;i++) { if(table.elem[i]!=NULLKEY) { printf("%d ",table.elem[i]); } } return 0; }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 程序实在不会写,要秃了
- ¥15 pycharm导入不了自己的包
- ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
- ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
- ¥15 关于R语言单因素与多因素线性回归的平均值
- ¥15 服务器清除BIOS之后引导不了
- ¥15 CPLEX用OPL编写的混合整数线性优化问题。
- ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
- ¥15 前端预览docx文件,文件从后端传送过来。
- ¥15 层次聚类和蛋白质相似度