比较两个数组并在C中创建具有相同元素的新数组

时间:2017-01-24 13:58:52

标签: c arrays algorithm

问题是检查两个数组是否存在相同的整数值,并将匹配的值放在一个新数组中。

假设我有两个数组

from textblob import TextBlob words = "cat dog child goose pants" blob = TextBlob(words) plurals = [word.pluralize() for word in blob.words] print(plurals) # >>> ['cats', 'dogs', 'children', 'geese', 'pantss']
a[n] = {2,5,2,7,8,4,2}

每个阵列的大小可以不同。

我需要检查数组是否有匹配的元素并将它们放在一个新数组中。这种情况的结果应该是:

b[m] = {1,2,6,2,7,9,4,2,5,7,3}

我需要在 O(n.log(n)+ m.log(m))中进行。

我知道有一种方法可以使用合并排序或将其中一个数组放入哈希数组中,但我真的不知道如何实现它。

我将非常感谢您的帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,您可以使用合并排序(实现它超出了本答案的范围,我想您可以在wikipedia上找到解决方案或搜索Stack Overflow)以便获得{ {1}}复杂性假设nlogn + mlogm是第一个数组的大小,n是另一个数组的大小。

让我们调用第一个数组m(大小为a),第二个数组n(大小为b)。首先对这些数组进行排序(合并排序会给我们m复杂性。现在我们有:

nlogn + mlogma[n] // {2,2,2,4,5,7,8}

假设b[n] // {1,2,2,2,3,4,5,6,7,7,9}我们可以简单地迭代比较相应的值:

但首先让我们分配数组n <= m来存储结果(如果需要,可以打印到控制台而不是存储)。现在循环本身:

int c[n];

注意:循环本身在最差情况下是 int k = 0; // store the new size of c array! for (int i = 0, j = 0; i < n && j < m; ) { if (a[i] == b[j]) { // match found, store it c[k] = a[i]; ++i; ++j; ++k; } else if (a[i] > b[j]) { // current value in a is leading, go to next in b ++j; } else { // the last possibility is a[i] < b[j] - b is leading ++i; } } 复杂度(请记住n+m假设),这比排序要小,因此整体复杂度为n <= m。现在您可以迭代nlogn + mlogm数组(它的大小实际上是我们分配的c,但其中的元素数量是n)并使用这些数字执行您需要的操作

答案 1 :(得分:0)

从解释它的方式来看,执行此操作的方法是循环较短的数组并针对较长的数组进行检查。我们假设A是较短的数组,B是较长的数组。创建结果数组C.

  1. 循环遍历A中的每个元素,将其称为I

  2. 如果我在B中找到,请将其从B中移除并放入C中,然后退出测试循环。

  3. 现在转到A中的下一个元素。

  4. 这意味着如果一个数字I在A中被发现两次而在B中被发现三次,那么我只会在C中出现两次。一旦完成,那么在两个数组中找到的每个数字都将以C的形式出现在C中它实际上出现在两者中。

    我小心翼翼地没有提出建议的代码,因为您的问题是关于您可以使用的方法。你应该自己弄清楚代码。

答案 2 :(得分:0)

我倾向于采取以下方法:

1)对数组B进行排序。有许多已发布的排序算法可以做到这一点,以及各种常用库中的几种实现。

2)循环遍历数组A并且对于每个元素在阵列B上进行二进制搜索(或其他合适的算法)以进行匹配。如果找到匹配项,则从数组B中删除该元素(以避免将来的匹配)并将其添加到输出数组中。