函数在数组C 中计数相同的数字

Function to count same numbers in array C++

本文关键字:数字 数组 函数      更新时间:2023-10-16

我具有此功能,该功能应该计算某些数组中发生多少个相同数字的重复。重要的是,这必须具有复杂性o(logn)。我在下面写了这本书,但它不能正确计算重复项。还有一件事,数字是从最低到最高的。

int CountElementsinFile(int *Arr, int num, int numOfD)
{
    int avg{}; 
    int inB = 0; 
    int inE = numOfD - 1; 
    int el{};
    while (inB <= inE)
    {
        avg = (inB + inE) / 2;
        if (Arr[avg] == num)
            el++;
            if (Arr[avg] > num)
                inE = avg - 1;
            else
                inB = avg + 1;
    }
    return el;
}

带有std,您可以做:

int CountElementsinFile(const int *a, int size, int value)
{
    const auto range = std::equal_range(a, a + size, value);
    return range.second - range.first;
}

您需要使用双分配方法确定num子序列的上和下边界。您需要在同时循环中重新排列下部或上部(取决于比较)搜索区域边界,直到inB < inE将区域减少一半。复杂性将为O(ln(n))。您很接近,但是您将无法在一个while循环中找到两个边界。我刚刚更正了您的代码。

int CountElementsinFile(int *Arr, int num, int numOfD)
{
   // There is no num in the array
   if (Arr[0] > num || Arr[numOfD - 1] < num)
      return 0;
   int avg{};
   int lb, ub;
   // Find lower boundary
   int inB = 0;
   int inE = numOfD - 1;
   while (inB < inE)
   {
      // divide search region
      avg = (inB + inE) / 2;
      if (Arr[avg] >= num)
         inE = avg;
      else
         inB = avg+1;
   }
   lb = inE;
   // Find upper boundary   
   // inB already found
   inE = numOfD - 1;
   while (inB < inE)
   {
      avg = (inB + inE + 1) / 2;
      if (Arr[avg] > num)
         inE = avg-1;
      else
         inB = avg;
   }
   ub = inB;
   return ub - lb + 1;
}
int main()
{
   int arr[] = { 5, 7, 8, 9, 9, 9, 9, 9, 11 };
   std::cout << CountElementsinFile(arr, 9, sizeof(arr) / sizeof(int)) << std::endl;
   return 0;
}

从您给出的函数签名中,我猜您得到了数字n和一个数字排序的数组,并且需要计算数组中出现多少次n。

由于数组进行了排序,您需要找到小于N(这是O(log n))的第一个数字的索引(使用二进制搜索),第一个数字的索引大于N(这也是O(log n)),只需从另一个索引一个索引。当然,您需要考虑到没有小于n 大于n的数字的边缘案例,但这是您要找出的。

#include<algorithm>
using namespace std;
int CountElementsinFile(int arr[], int size, int numToSearch)
{
    return count(arr, arr + size, numToSearch); 
}