【问题标题】:Algorithm for finding circular mappings of maximal size寻找最大尺寸的圆形映射的算法
【发布时间】:2012-12-06 09:24:24
【问题描述】:

我有九组,每组 500 个对象。尽管这些集合是独立的,但我假设这些集合共享一个共同对象的核心。但是,一个相同的对象可能具有不同的名称(索引),具体取决于集合。但我可以测量两个物体之间的成对距离。

基于成对距离,我已经为所有成对的集合计算了两个集合的对象之间的最佳映射。所以,对于每一对集合,我可以说任意两个对象之间的对应关系。

现在我想检测封闭的映射圈,例如{ 5 (set 1) -> 13 (set 2) -> 24 (set 3) -> 5 (set 1) },即set 1的object 5映射到set 2的object 13,它映射到set 3中的24 ,然后映射回集合 1 的对象 5。我需要这种形式的循环映射来证明对象本质上是相同的。

当然,在理想的世界中,我可以识别出跨越所有九个集合的大多数圆圈。但是,3-9 组之间的常见对象也很有趣。因此,我想要一份详尽的清单。

您是否知道执行此任务的算法,或者这个问题在组合数学中是如何定义的!?

作为一种启发式方法,我将首先确定 3 个集合的所有组合中的圆圈,然后将这些结果组合成更大的集合组合。

【问题讨论】:

  • 不确定我是否在关注,您是否正在寻找一个包含大多数对象的循环,同时在集合之间“跳跃”?它闻起来很像Hamiltonian Path Problem 恐怕:|
  • 我无法真正理解问题描述,但听起来您正在寻找集合之间的同构?
  • 我的解释有没有具体的点,很难理解?也许我可以澄清...
  • 基本上,我正在寻找的似乎是最大集团问题。
  • 一个对象可以映射到一个目标集的多个对象吗? (映射是函数还是关系?)

标签: algorithm


【解决方案1】:

如果我正确地遵循了您的描述,您似乎会希望找到这些集合之间的对应关系。这个算法对你有用吗?

 1. Intialize a hashmap H
 2. Initialize key frequency map U = {}
 3. for each set i 
 4.    for each element e in set i
 5.        H.insert {e.key, {i, ...}}
 6.        if U.contain(e.key)
 7.            c = U.get(e.key)
 8.           U.update(e.key,  c + 1)
 9.        else
10.            U.insert(e.key,  1)
11.        endif 
12.    endfor
13. endfor

第 5 行将向映射 H 中插入一个元素。具有相同键的元素存储在一个链表中。您可以通过找到 U 中频率最大的键来找到最长的链。然后通过执行 H.get(key),您将得到列表。通过将最后一个元素链接到第一个元素,您将获得所需的循环。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多