使用分而治之 - 合并排序检测重复项

问题描述 投票:0回答:2

我想使用分而治之的方法来检测给定数组中的重复项。我可以为此使用合并排序吗:

  1. 首先以 log N 步分割数组

  2. 然后通过合并排序

  3. 合并时使用计数器变量来检测重复项。 O(N)

所以总共需要 O(N log N) 步骤...

这种做法正确吗?

c algorithm sorting data-structures
2个回答
3
投票

你不需要。你可以在 O(n) 内完成

你有原始数组int A[N];创建第二个数组bool

seen[K]
,其中
K
是A中的最大值。将所有seen设置为false。迭代第一个数组,如果 was saw 为 false,则设置 saw[A[i]] = true,否则您发现了重复项。


1
投票

一旦数组排序完毕,您只需使用归并排序对需要 O(nlogn) 的数组进行排序 您可以在 O(n) 时间内检测重复项,因此总时间为 O(nlogn)。
例如,数组是

arr[]
并且它有
N
元素。

1.Sort array using merge sort.

2. (a)variables 
   start -- initially at position 1 of array (arr has elements from 1 to N).
   count--- to count number of times a specific number occurs

   (b)method
   for(i=2;i<=N;i++)
   {
       if(arr[i]!=arr[start])
       { 
           printf("%d has occurred %d times",arr[start],count);
           count=1;
           start=i;
       }
       else count++;
   }
   printf("%d has occurred %d times",arr[start],count);

因此总时间 O(nlogn) 空间 O(n)。

© www.soinside.com 2019 - 2024. All rights reserved.