【问题标题】:Difference on arrays, lists, hashes数组、列表、哈希的区别
【发布时间】:2014-09-25 03:39:55
【问题描述】:

是否有一个概念和/或算法来处理基本操作的最小序列来处理结构化对象(例如数组/列表/哈希)之间的差异?我正在想象类似字符串距离的各种概念,但我不仅想处理字符串。比如下面第一个和第二个数组的区别:

["a", {b: 1}, false, "b"]
[{b: 1}, "a", false, true]

可以用两种操作表示:转置索引01 处的元素,并将索引3 处的元素替换为true。替换整个数组可能看起来似乎更少(单个)操作,但这涉及更大的对象,不应该算作最小操作。编程中有这样的概念吗?

我不知道究竟应该将什么视为有意义的基本操作。我想象插入、删除(以及在散列的情况下可能在不同键下的转置、替换和/或赋值)。他们都应该处理结构差异。我显然不想包含诸如“将 +3 添加到数字”之类的操作。

【问题讨论】:

  • 我的第一印象是这是对停机问题的伪装。
  • 这一切都取决于哪些操作是基本的。
  • @VaughnCato 这是问题的一部分。
  • 这可以通过动态规划来解决,只要状态图形成一个树宽小的k-tree即可。
  • 根据您的示例,您的问题基本上仍然是编辑距离问题,您的字母表仅包含结构化项目和原始项目。如果您还想包括编辑结构化项目的成本,这可以通过递归地考虑一对结构化项目的权重作为这些结构的编辑距离来完成。

标签: algorithm computer-science difference


【解决方案1】:

如果您可以将数据结构编码为字符串,那么您可以使用类似Levenshtein distance 算法的变体。为两个数据结构的每个唯一元素分配不同的符号,在这种情况下“a” = A,{b: 1} = B,false = C,true = D,并且“b” = E;那么你会寻找字符串 ABCE 和 BACD 之间的编辑距离

【讨论】:

  • 这行不通(至少微不足道),因为 Levenshtein 距离只考虑对字符的操作,而不是字符序列。
  • @sawa 想到的唯一解决方案是使用不同的字符串编码排列重新运行算法,例如,一种排列将使用符号 A 表示“a”,使用符号 B 表示 {b: 1},而另一个使用符号 A' 表示序列 ["a", {b: 1}]。不幸的是,这会让你陷入组合爆炸
  • @sawa 一个更有效的解决方案是存储所有转置的开始和结束索引的列表;当基本算法终止时,按起始索引对该列表进行排序,如果任何两个或多个起始索引相邻并且也具有相邻的最终索引,则将转置计数减少 [相邻字符的数量 - 1](因为你会有在一次操作中转置两个或多个相邻字符)
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 2015-02-20
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多