如果我有两个数组。例如,
一个数组是int[] one={1,2,4,6,54,3,34};
,另一个数组是int[] two={12,1,2,4,7,8,54,3,34,5};
问题是如何在一到二之间得到“相同的部分”。
示例中的“相同部分”是[1,2,4]和[54,3,34]。
P.S.You可以使用伪语言 ,c,c#,java,php或其他语言。
P.S。现在我说清楚了 零件。相同的零件元素 列表。
P.S.I已更改示例,并且数组中每个项的值不相等 (你可以看看我的例子。)
答案 0 :(得分:1)
您可以为两个数组构建suffix tree(视为'字符串')并比较两棵树。
特别是,您可以选择两棵树中的一棵(比较小的数组,例如)(称之为A)并开始遍历它,模仿另一棵树上的移动(称之为B)。
如果您在树A的节点u中,并且无法将此节点中的任何“移动”复制到树B中的相应节点,那么您已找到“最大匹配”(从根拼写的那个)你可以修剪植根于你的树A的子树。
这只是一个想法,你必须建立它;请注意,你可以在O(n)中构建一个后缀树,这种“双相似性”也是O(n),所以它看起来是最优的。
答案 1 :(得分:0)
这可能是longest common subsequence问题。
答案 2 :(得分:0)
近乎蛮力和一些优化。最坏情况O(n ^ 4)。 n是较短阵列的大小。
one=[1,2,4,6,54,3,34]
two=[12,2,4,3,54,3,5]
one_pos_list_map = {} # map of value -> position list
one_pos_map = {} # map of value -> map of position -> 1
for pos in xrange(len(one)):
val = one[pos]
if val not in one_pos_map:
one_pos_map[val] = {}
one_pos_map[val][pos] = 1
if val not in one_pos_list_map:
one_pos_list_map[val] = []
one_pos_list_map[val].append(pos)
checked = [False for i in xrange(len(two)*len(two))]
def print_maximal_matches(start, end):
idx = start * len(two) + end - 1
if (checked[idx] or end - start < 2):
return
checked[idx] = True
match_pos_list = one_pos_list_map.get(two[start], [])
for match_pos in match_pos_list:
found = True
for i in xrange(start + 1, end):
if not one_pos_map.get(two[i], {}).get(match_pos + i - start, None):
found = False
break
if found:
print two[start:end]
return
print_maximal_matches(start + 1, end)
print_maximal_matches(start, end - 1)
print_maximal_matches(0, len(two))