找到列表中唯一的非唯一元素对之间的最小距离

时间:2014-07-08 15:43:48

标签: algorithm sorting set complexity-theory

(不是作业)

我有一个包含重复元素的列表:A B C B A D C B

我想要每两个无序元素之间的最短距离:

(A B): 1
(A C): 2
(A D): 1
(B C): 1
(B D): 2
(C D): 1

我可以提高当前实施的复杂性吗?元素是单词,搜索空间是段落,所以我希望在长度为200的列表中有~100个唯一元素。

我的实施:

pairs <= map(pair, distance)

   For each unique element 'me'
1. \  For each index 'o'  of me in list
2.    \  For each 'item' at index 'i' in the list
         |  if (item == me) skip
         |  pair <= sort(me, item)
         |  distance <= abs(i - o)
         |  existing <= dist(pair in pairs), or infinity
         \  if (distance < existing) pairs <= (pair, distance)

我不喜欢它,因为

  1. 需要O(u•n)搜索索引唯一商品的出现次数
  2. O(u•o•(n-o)) uo为唯一商品及其出现次数
  3. 使用示例文本blob&#39; s:

    1. 74500检查事件
    2. 250000跳过比较
    3. 247582排序对,哈希,从地图获取,比较

1 个答案:

答案 0 :(得分:1)

这是一种更简单,更快速的算法。假设列表在数组X []:

  • 初始化2D数组best [i] [j]以包含对于所有1&lt; = i&lt; j&lt; = u。
  • 将数组last [i]初始化为包含-INF的所有1&lt; = i&lt; = u。
  • 对于每个职位我:
    • 对于每个元素类型j:
      • 如果j!= X [i]:
        • 设x = min(j,X [i])和y = max(j,X [i])。
        • 如果我 - 最后[j]&lt; best [x] [y]然后将best [x] [y]更新为i - last [j]。
    • 设置最后[X [i]] = i。

这具有空间复杂度O(u ^ 2),这是最小的,时间复杂度O(u ^ 2 + un),我怀疑它也是最小的。

[编辑:根据要求,我们现在仅报告“任一方向”中的一对元素之间的最小距离,而不是在两个方向上单独分开。在n <1的情况下,还向时间复杂度添加了u ^ 2项。你,虽然听起来我们保证n&gt; = u来自潜在的问题。]