【问题标题】:Algorithm(!= linear search) to find the first number less than X in an array of integers算法(!=线性搜索)在整数数组中找到小于 X 的第一个数字
【发布时间】:2013-03-07 14:02:08
【问题描述】:

我正在寻找一种算法来查找整数数组中小于 X 的第一个数字。实际上我正在使用线性搜索,但我认为二进制搜索可能更好(正如我前一段时间已经看到的那样)但我不知道如何自己实现它(不实现修改版本来查找第一个小于X)。如果有比 bin 搜索更好的方法,请告诉我。我需要它,因为这个数组在程序运行时被大量访问和修改。

这是当前(简单)的实现:

int findmin(int *arr,int n,int size)
{
  int i;
  for(i = 0; i < size && arr[i] < n; i++)
    ;
  return i-1;
}

该索引用于在特定索引中插入 N 值的函数的参数输入。此函数的索引并在数组中插入一个数字,但在每次插入新数字时仍使其排序而无需调用 sort()。 它是一个相关的文件文本解析,解析很多文件和一些相当多的字符。我需要努力使事情尽可能快(根据我的上下文和知识)。

编辑:数组总是排序的,即使在新数字的分割之后。

【问题讨论】:

  • 如果整数没有排序,你真的不能比线性搜索做得更好。
  • @isbadawi:数组已排序。我忘了说。查看更新。
  • 为了保持数组排序,对要插入的元素进行二分搜索,然后在找到的位置插入元素。
  • 杰克,我很好奇你排序的数字是什么意思。你说它与文本文件解析有关,但我想不出什么样的操作需要对整数进行排序。如果您能给我们提供更多关于您正在执行的实际操作的详细信息并满足我对这个难题的好奇心,我将不胜感激。
  • @beaker:这个数字类似于哈希。我正在编写一个解析,它需要一些关键字,获取它的哈希,然后插入一个排序的整数数组。我需要做很多请求在这个数组中,我使用 bsearch 来获取性能,其中需要对数组进行排序。我有几个其他函数和算法可以在这个数组上工作,同样,对于性能问题需要排序(总是)

标签: c arrays search binary-search


【解决方案1】:

你必须有 N 个元素的数组已经排序。

将“高”设置为 N,将“低”设置为 -1。

“探测”元素 N/2(向下舍入为 int)。

如果探测的元素是,将“低”设置为 N/2。 (当然,如果 ==,那么您就有答案了。)

重复,在“低”和“高”之间探测。

有些边界条件你需要担心,但不要太复杂。

【讨论】:

    【解决方案2】:

    二分查找在这里没有问题。困难的是如何检查边界条件以及应该返回什么值。此外,您必须注意重复值。以下功能将起作用。

        int binarySearch(int a[], int length, int value)
        {
            if (a[0] > value)
                return -1;
    
            int low = 0;
            int high = length-1;
    
            while (low<=high)
            {
                int mid = low+((high-low)/2);
    
                if(a[mid] >= value)
                    high = mid-1;
                else
                    low = mid+1;
            }
    
            return low-1;
        }
    

    测试:(有重复)

        int arr[] = {1, 3, 4, 6, 6, 10};
        int length = sizeof(arr)/sizeof(arr[0]);
    
        int index = binarySearch(arr, length, 6); // will be 2
    

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多