一个数组算法问题

时间:2011-04-30 16:12:55

标签: algorithm sequences

如果我有两个数组。例如, 一个数组是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已更改示例,并且数组中每个项的值不相等 (你可以看看我的例子。)

  1. 至少有两个项目匹配
  2. 两个数组中匹配项的索引无需匹配 ,但相同的部分必须是连续的。

3 个答案:

答案 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))