CP猫 2023-06-12 06:44 采纳率: 0%
浏览 29

一个集合元素取值剔重算法问题

本人最近在开发一个数据处理的程序,涉及一个集合处理问题,总结来说大致的问题如下:
有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的要求。


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-12 08:02
    关注
    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7576737
    • 这篇博客也不错, 你可以看下一元稀疏多项式乘法问题
    • 除此之外, 这篇博客: 一种基于图论的分割图算法中的 简述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 分割图一直是图像识别的热门研究方向,主要完成的任务就是把图中某部分有意义的物体影像抠出来。比入在X光或CT透视中将某些特定的组织抠出来啥的。

    • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 单链表添加元素小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:

      解决方案:

      可以使用散列表(哈希表)来实现对集合中元素的剔重。具体步骤如下:

      1. 定义一个散列表
      #define HASHSIZE 12  // 定义哈希表长为数组的长度
      #define NULLKEY -32786 
      
      typedef struct
      {
          int *elem; // 指向动态分配数组的指针
          int count; // 当前元素个数
      }HashTable;
      
      1. 初始化散列表
      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;
      }
      
      1. 对元素进行哈希(散列)操作,将元素存储到散列表中
      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--;
      }
      
      1. 遍历集合,对每个元素进行哈希操作,并插入到散列表中

      2. 遍历散列表,将不为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;
      }
      
    评论

报告相同问题?

问题事件

  • 修改了问题 6月12日
  • 修改了问题 6月12日
  • 创建了问题 6月12日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度