algorithm - 如何使用最坏情况 O(n^2) 来搜索 2 个列表并将公共(public)值添加到第 3 个列表?

标签 algorithm sorting big-o

我需要帮助为一个算法制作一个伪代码,该算法采用两个整数列表,并创建一个由出现在两个列表中的那些整数组成的列表(最终列表中的每个整数应该只出现一次)。该算法需要实现比 Θ(n2) 渐近更好的最坏情况性能,其中 n 是两个输入列表的长度之和。

这是我目前的情况,但我对此没有信心:

  • 从两个列表 a 和 b 开始。结果列表将是 c。
  • 使用合并排序算法对列表 b 进行排序。
  • 从索引 i=0 开始,遍历列表 a。
  • 使用二进制搜索算法在列表 b 中搜索 a[i] 的值
  • 如果 a[i] 在 b 中找到,而 a[i] 不在 c 中.. 将 a[i] 附加到 c。

最佳答案

  1. 对两个列表进行排序。此步骤的复杂度顺序为 n log n。使用 quick sort .
  2. 比较排序列表并找到共同元素。这一步的复杂度阶数是n
int i = 0, j = 0;
while ((j < b.size()) && (i < a.size()))
{
   if (a[i] < b[j])
   {
       i++;
       continue;
   }
   if (a[i] > b[j])
   {
       j++;
       continue;
   }
   // if we are here, a[i] == b[j]
   c.push_back(a[i]);
   i++;
   j++;
   // skip identical elements
   while ((i < a.size()) && (a[i-1]==a[i]))
   {
       i++;
   }
   while ((j < b.size()) && (b[j-1]==b[j]))
   {
       j++;
   }
}
return c;

总复杂度阶数是n log n

关于algorithm - 如何使用最坏情况 O(n^2) 来搜索 2 个列表并将公共(public)值添加到第 3 个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454944/

相关文章:

algorithm - 图论中的盒子堆叠

javascript - 以相同的方式打乱多个javascript数组

javascript - 按值 A 删除 2 个数组并按值 B 排序的最有效方法?

performance - for循环的运行时间

算法时间复杂度分析(for loop with inner while loop)

algorithm - 胶囊 - 射线(线段)相交,2D

java - 计算滚动某个数字的方式数

JavaScript 根据名称对 DOM 元素进行排序

algorithm - f(n) = n^4 + 100n^2 + 50 的上限是多少?

c++ - 平滑算法