📜  在未排序的数组中查找 floor 和 ceil(1)

📅  最后修改于: 2023-12-03 14:51:28.665000             🧑  作者: Mango

在未排序的数组中查找 floor 和 ceil

介绍

在计算机科学中,floor和ceil是两个计算数学函数,用于向下和向上取整。在未排序的数组中查找floor和ceil意味着在数组中找到最大或最小的数值,该数值小于或大于或等于给定数字,但与之最接近。

解决方法

在未排序的数组中查找floor和ceil,我们需要使用一些技巧和算法。下面是几个解决方法。

方法一:Sort and search

这是最简单的方法,但是排序复杂度为O(nlogn),不适用于大型和臃肿的数组。以下是Java实现的伪代码:

sort(array)
if searchElement < array[0]
   return -1
if searchElement > array[n-1]
   return n-1
for i = 0 to n-1
   if array[i] == searchElement
       return i
   if array[i] < searchElement && array[i+1] > searchElement
       if searchElement - array[i] < array[i+1] - searchElement
           return i
       else
           return i+1
方法二:线性搜索

这种方法比前一种方法更简单和快速,但效率仍不够理想。它需要一个O(n)的时间复杂度。以下是Java实现的伪代码:

if searchElement <= array[0]
   return 0
for i = 1 to n-1
   if array[i] == searchElement
       return i
   if array[i-1] < searchElement && searchElement < array[i]
       if searchElement - array[i-1] < array[i] - searchElement
           return i-1
       else
           return i
if searchElement >= array[n-1]
   return n-1
方法三:二分搜索

这是最优解决方法,但是它的前提是要求数组已经排序。以下是Java实现的伪代码:

int floorSearch(int arr[], int low, int high, int x) {
  if(high<low) return -1;
  if(x>=arr[high]) return high;
  int mid = (low+high)/2;
  if(arr[mid] == x) return mid;
  if(mid>0 && arr[mid-1]<=x && x<arr[mid]) return mid-1;
  if(x<arr[mid]) return floorSearch(arr, low, mid-1, x);
  return floorSearch(arr, mid+1, high, x);
}
结论

以上是三种不同的方法,可以在未排序的数组中查找floor和ceil,但是最好的方法是使用已排序的数组和二分搜索算法。这在时间上是最优的,但是前提条件是必须使用已排序的数组。