如何计算数组中相似数字的数量

时间:2014-10-31 14:19:09

标签: c arrays

让我们假设我们有一个没有任何库的C(嵌入世界)。我想知道一些好的实现,以获得数组中多数数的计数,它们在定义的偏移量附近彼此接近。 示例(偏移量+/- 10):

array(1, 5, 9, 50, 2, 54, 3, 1, 58, 59, 56, 54, 48, 2), result 7
array(1, 5, 4, 8, 60, 500, 200, 7, 2, 4, 1, 2, 4), result 10 

3 个答案:

答案 0 :(得分:0)

我会一次取一个数字并检查其“x范围”中的数字。

迭代数组并使用以下方法检查每个数字:

For (int i = 0; i < array.length; i++){
    int sum = 0
    int result = CheckNumbersInRange(i, array, range)
    if (result > sum)
        sum = result;
}

//现在你有了想要的号码。

现在你只需要创建一个函数来检查array [i]范围内有多少个数字。 在那里,您可以再次迭代整个数组并比较每个元素并在每次满足条件时对其进行计数。最后返回范围内的元素数。

int CheckNumbersInRange(int i, int array[], int range){
    int sum = 0;
    for(int j = 0; j < a.length; j++){
        if (array[i] < (array[j] + range) && array[i] > (array[j] - range))
            sum++;
    }
    return (sum -1); // because the array[i] will count up itself.
}

答案 1 :(得分:0)

排序数组
对于数组中的每个元素:
请注意Num[max] - Num[i] <= (10 - -10 + or 20)处的max_index 索引的差异是计数 返回最高计数。

O(N * LN2(n))的

#include <stdio.h>
#include <stdlib.h>

int fcmp(const void *a, const void *b) {
  int ia = *((int*) a);
  int ib = *((int*) b);
  return (ia>ib) - (ia<ib);
}

size_t LongRun(int *Num, size_t n, int range) {
  // This is a placeholder for a user sort().  OP does not want to use libraries
  qsort(Num, n, sizeof *Num, fcmp);  

  size_t lo_i;
  size_t hi_i = 0;
  size_t LongestRun = 0;
  for (lo_i = 0; lo_i<n; lo_i++) {
    while (hi_i < n && Num[hi_i] - Num[lo_i] <= range) hi_i++;
    if (hi_i - lo_i >  LongestRun) LongestRun = hi_i - lo_i;
  }
  return LongestRun;
}

void Doit(int *Num, size_t n) {
  size_t i;
  fputs("(", stdout);
  for (i=0; i<n; i++) printf(" %d,", Num[i]);
  size_t lr = LongRun(Num, n, 10 - -10);
  fputs(")\n", stdout);
  fputs("(", stdout);
  for (i=0; i<n; i++) printf(" %d,", Num[i]);
  fputs(")", stdout);
  printf(": %zu\n", lr);
}

int main(void) {
  int a1[] = {1, 5, 9, 50, 2, 54, 3, 1, 58, 59, 56, 54, 48, 2};
  Doit(a1, sizeof a1 / sizeof a1[0]);
  int a2[] = {1, 5, 4, 8, 60, 500, 200, 7, 2, 4, 1, 2, 4};
  Doit(a2, sizeof a2 / sizeof a2[0]);
  return 0;
  }

( 1, 5, 9, 50, 2, 54, 3, 1, 58, 59, 56, 54, 48, 2,)  
( 1, 1, 2, 2, 3, 5, 9, 48, 50, 54, 54, 56, 58, 59,): 7

( 1, 5, 4, 8, 60, 500, 200, 7, 2, 4, 1, 2, 4,)
( 1, 1, 2, 2, 4, 4, 4, 5, 7, 8, 60, 200, 500,): 10

答案 2 :(得分:-1)

对数组进行排序,并使用队列来计算关闭元素的数量。

以下是演示算法的代码(使用C ++而不是C语言)(假设v已排序):

using namespace std;
#include <vector>
#include <queue>
int foo(vector<int> v, int offset)
{
    queue<int> q;
    int max = 0;
    for (unsigned i = 0; i < v.size(); i++)
    {
        q.push(v[i]);
        if (v[i] - q.front() <= offset)
        {
            if (q.size() > max)
            {
                max = q.size();
            }
        }
        else
        {
            while (!q.empty() && (v[i] - q.front() > offset))
            {
                q.pop();
            }
        }
    }
    return max;
}