Algorithm 数组、列表、散列上的差异

Algorithm 数组、列表、散列上的差异,algorithm,computer-science,difference,Algorithm,Computer Science,Difference,是否有一个概念和/或算法处理最小的基本操作序列,以处理数组/列表/哈希等结构化对象之间的差异?我在想象一些类似于弦距离的各种概念,但我想处理的不仅仅是弦。例如,第一个和第二个数组之间的差异如下: ["a", {b: 1}, false, "b"] [{b: 1}, "a", false, true] 可以由两个操作表示:将索引0和1处的元素转置,并将索引3处的元素替换为true。替换整个阵列可能看起来不像是单一操作,但这涉及到更大的对象,不应算作最小操作。编程中有这样的概念吗 我不知道到底什么

是否有一个概念和/或算法处理最小的基本操作序列,以处理数组/列表/哈希等结构化对象之间的差异?我在想象一些类似于弦距离的各种概念,但我想处理的不仅仅是弦。例如,第一个和第二个数组之间的差异如下:

["a", {b: 1}, false, "b"]
[{b: 1}, "a", false, true]
可以由两个操作表示:将索引0和1处的元素转置,并将索引3处的元素替换为true。替换整个阵列可能看起来不像是单一操作,但这涉及到更大的对象,不应算作最小操作。编程中有这样的概念吗


我不知道到底什么应该被认为是有意义的基本操作。我想象在散列的情况下,在不同的键下插入、删除,或者转置、替换和/或赋值。他们都应该处理结构性差异。很明显,我不想将+3这样的操作包括到一个数字中

如果可以将数据结构编码为字符串,则可以使用类似算法的变体。为两个数据结构的每个唯一元素分配不同的符号,在这种情况下,a=a、{b:1}=b、false=C、true=D和b=E;然后,您将查找字符串ABCE和BACD之间的编辑距离

我的第一印象是,这是停止问题的伪装。这完全取决于什么操作是基本的。@VaughnCato这是问题的一部分。只要状态图形成一个带有根据你的例子,你的问题基本上仍然是一个编辑距离的问题,你的字母表只包含结构化的项目以及基本的项目。如果您还想包括编辑结构化项的成本,可以通过递归地将一对结构化项的权重作为这些结构的编辑距离来实现。这至少不会起到很小的作用,因为Levenshtein距离只考虑对字符的操作,不是字符序列。@sawa想到的唯一解决方案是使用不同的字符串编码排列重新运行算法,例如,一个排列使用符号A表示A,B表示{B:1},而另一个排列使用符号A'表示序列[A,{B:1}]。不幸的是,这会让你遇到一个组合问题explosion@sawa一个更有效的解决方案是存储所有转置的起始和最终索引列表;当基本算法终止时,按起始索引对该列表进行排序,如果任何两个或多个起始索引相邻,并且也有相邻的最终索引,则将转置计数减少[相邻字符数-1],因为您将在一次操作中转置两个或多个相邻字符