【问题标题】:Determining where to restore element after removal and subsequent change of containing array确定在删除和后续更改包含数组后恢复元素的位置
【发布时间】:2020-01-01 23:43:24
【问题描述】:

我有一个元素数组。删除了一些元素。然后以某种方式更改数组,这可以是删除或添加元素,在数组中移动元素或这些的组合。

现在我想将移除的元素放回原处,使其尽可能靠近其原始邻居。想象这些元素是文本中的句子,用户可以选择撤消删除他们之前删除的句子。 (这不是实际用例,而是等价的)

我的想法是在删除元素时保存元素 ID 列表(每个元素都有一个 uuid),然后以某种方式使用它来将元素恢复到其原始位置 尊重数组。仅查看前一个元素是行不通的,因为如果在此期间删除或移动前一个元素,它会搞砸。

查看被移除元素周围元素的平均移动似乎也不是一个好主意,因为这会导致它处于它们之间的某个随机位置,而不是处于特别重要的位置。

编辑:显然这对我所说的“最佳”的意思不够清楚,这里有一些例子来说明我的意思:

//start
[1, 2, 3, 4, 5, 6]

//removal of 4
[1, 2, 3, 5, 6]

//array changed in some way...
[1, 2, 6, 5, 7, 8]

//should yield:
[1, 2, 4, 6, 5, 7, 8]

//more examples: (changed array, array with element added back)
[1, 2, 3, 5, 6], [1, 2, 3, 4, 5, 6]
[1, 2, 5, 6], [1, 2, 4, 5, 6]
[5, 6], [4, 5, 6]
[6, 5], [4, 6, 5]
[6, 5, 3, 2, 1], [6, 5, 4, 3, 2, 1]
[5, 6, 1, 2, 3], [5, 6, 1, 2, 3, 4]

【问题讨论】:

  • 如果您需要这方面的帮助,您应该提供您的代码
  • 作为过程中可能状态的示例?我不是在寻找实现,只是算法的设计......
  • 在你定义你的目标之前,你不可能有一个算法。您的帖子未能在您的范例中指定“最佳”。因此,这让我觉得这是 NLP 和语义方面的讨论,而不是算法请求。
  • 我添加了说明性示例并澄清了文本。希望这就足够了吗?

标签: javascript arrays algorithm merge


【解决方案1】:

假设您有一个元素列表和一个目标元素。对于每个元素,我们可以计算到目标元素的偏移量(前任有-1,后继有+1 等等)。如果我们愿意,我们可以将其限制在当地社区。​​p>

现在我们有一个修改后的列表,其中目标元素不存在,而其他元素的顺序不同(或消失)。但我们仍然知道偏移量。因此,每个元素都可以投票选出目标元素的新位置。如果所有选票都同意,我们就很好。但这一般不会发生。那么我们能做些什么呢。

本质上,这是一个最小化问题,我们希望为目标元素选择一个新位置,以便我们最小化一些错误。我们可以非常不同地测量误差。我们希望新位置接近所有选票,因此某种形式的求和差似乎是有意义的。

您使用平均投票位置的建议等于最小化 L2 差异误差。正如您所发现的,这对异常值非常敏感(即移动很远的单个元素)。

更强大的选择是 L1 最小化。解决方案是投票位置的中位数。但类似的效果仍然可能发生。但你可能还是想尝试一下。

我主张 L0 最小化。即,采取大多数其他元素都同意的位置(计算每个位置有多少元素投票并选择最大值)。如果有多个这样的位置,则可以考虑 L1 和 L2 错误。

【讨论】:

  • 谢谢!这实际上很有帮助。
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多