当前位置: 首页 > 知识库问答 >
问题:

给定多个集合,如何找到每个集合中唯一于所有其他子集的最小子集?

蒋啸
2023-03-14

出身背景我有数字1到20(黑色背景上的白色数字),可以出现在屏幕上,我希望识别这些数字。由于它们不能简单地复制粘贴,我将比较屏幕上数字的白色像素位置与所有20个数字的白色像素位置列表。然而,每个数字可以有大量的像素,并且可能不需要比较所有这些像素来识别该数字。因此,我希望尽可能少地进行比较。

算法问题:我有多个集合,其中的元素在每个集合中是唯一的,但在所有集合中可能不是唯一的。如何找到每个集合的最小可能子集,使每个子集都是唯一的?

例1:设A={1,2},B={3,4}。A和B的最小子集是{1}和{3}(或{2}和{4}),因为这些子集对于每个原始集合都是唯一的,并且尽可能小。

例2:设A={1,2,3,4},B={1,2,3,5},C={1,2,4,5}。可能的最小子集是{3,4},{3,5},{4,5}。如果从这些子集中删除了任何元素,那么该子集也可以属于不同的集合。例如,从第一个子集中删除4将留下{3},如果{3}标识第一个或第二个集合,则会产生歧义。

共有1个答案

干永丰
2023-03-14

这是一个具有O(n^3)时间复杂度和O(n)内存复杂度的解决方案。(如果我没有错的话)

function isElement(elem, s) {
  return s.includes(elem)
}

function isId(id, sets) {
  let setsWithSuchElementsNumber = 0
  for (const s of sets) {
    if (id.every((e) => isElement(e, s))) {
      setsWithSuchElementsNumber++
    }
  }

  return setsWithSuchElementsNumber === 1
}

function getSetId(s, sets) {
  const count = {}
  const elements = []
  for (const elem of s) {
    if (count[elem] == null) {
      elements.push(elem)
    }
    count[elem] = 0
  }

  for (const otherSet of sets) {
    for (const e of elements) {
      if (isElement(e, otherSet)) {
        count[e]++
      }
    }
  }

  elements.sort((first, second) => {
    return Math.sign(count[first] - count[second])
  })

  for (let idSize = 1; idSize <= elements.length; idSize++) {
    const possibleId = elements.slice(0, idSize)

    if (isId(possibleId, sets)) {
      return possibleId
    }
  }

  return null
}

const getSetIds = (sets) => {
  return sets.map((s) => getSetId(s, sets))
}

const res = getSetIds([
  [1, 2, 3, 4],
  [1, 2, 3, 5],
  [1, 2, 4, 5],
])

console.log(res.join(' '))
 类似资料:
  • 这是一个算法问题。如果我错过了Python中任何有帮助的现有函数,请大喊一声。 给定一组元素的,我们可以在Python中使用函数来找到所有唯一的k元素子集。让我们调用包含所有这些子集的集合。请注意,每个这样的子集都有不同的元素。 问题是两步走。首先,给定这些k-不同元素子集,我想组合(其中的一些),这样(组合只是一些子集的超集): > 构图中任意两个子集之间的交集为空 构图中所有子集的并集给出的正

  • 实际上我想这样写一个给定集合的所有子集: 例如,如果我的集合是,我希望有 这就是我尝试的: 这是输出我的问题是。我不希望在每个子集的末尾和整个输出的末尾都有。你能帮我解决这个问题,让我的输出像<code>{}、{1}、}2}、{1,2}</code>?最后,我想把它们分类

  • 给定一个正整数数组,找出子集的最小数目,其中: 子集中每个元素的总和不超过一个值,k。 数组中的每个元素在任何子集中只使用一次 数组中的所有值都必须出现在任何子集中。 基本上,一个“填充”算法,但需要最小化容器,并需要确保所有东西都被填满。我目前的想法是按降序排序,当总和超过k时开始创建集合,开始下一个,但不确定什么是更好的方法。 编辑: Ex: 在输出集合中,所有1-5都被使用,并且在集合中仅使

  • 问题内容: 我有一套清单: 我要s1∩s2∩s3 … 我可以编写一个函数来执行一系列成对的操作,等等。 有没有推荐,更好或内置的方法? 问题答案: 从python版本2.6开始,您可以对使用多个参数,例如 如果这些集合在列表中,则表示为: 这里是列表扩展 请注意,是 不是 一个静态的方法,但这种使用功能符号应用第一套交叉口列表的其余部分。因此,如果参数列表为空,则将失败。

  • 问题内容: 我有一个REST Json API,它返回一个列表“ logbooks”。有许多实现不同但相似行为的日志。在数据库层的服务器端实现是一种单表继承,因此日志的每个JSON表示都包含其“类型”: 我想在客户端复制此服务器模型,所以我有一个基类和多个日志子类: 我的是一组用于查询JSON API的模型: 当我获取日志集合时,是否有一种方法可以将每个对象转换为其对应的子类(基于JSON“ ty

  • 与其查询具有开始和结束日期的间隔列表,不如从列表中检索仅与搜索开始和结束日期重叠的所有间隔,最好的方法是: 使用整数示例,以整数间隔列表为例。在此列表中,以下是所有唯一的间隔集,其中每组中的每个间隔都相互重叠: 以下是DateInterval的类: 我将收到按开始时间排序的间隔列表,如下所示: (在这个示例列表中,开始日期和结束日期总是均匀地落在一小时上。但是,它们可以落在任何一秒上(或者毫秒)。