用于排序数组中的天花板的 Python3 程序
给定一个排序数组和一个值 x,x 的上限是数组中大于或等于 x 的最小元素,而下限是小于或等于 x 的最大元素。假设数组按非降序排序。编写有效的函数来找到 x 的下限和上限。
例子 :
For example, let the input array be {1, 2, 8, 10, 10, 12, 19}
For x = 0: floor doesn't exist in array, ceil = 1
For x = 1: floor = 1, ceil = 1
For x = 5: floor = 2, ceil = 8
For x = 20: floor = 19, ceil doesn't exist in array
在下面的方法中,我们只实现了天花板搜索功能。楼层搜索可以以相同的方式实现。
方法一(线性搜索)
搜索 x 上限的算法:
1) 如果 x 小于或等于数组中的第一个元素,则返回 0(第一个元素的索引)
2) Else 线性搜索索引 i,使得 x 位于 arr[i] 和 arr[i+1] 之间。
3) 如果我们在第 2 步中没有找到索引 i,则返回 -1
Python3
# Function to get index of ceiling of x in arr[low..high] */
def ceilSearch(arr, low, high, x):
# If x is smaller than or equal to first element,
# then return the first element */
if x <= arr[low]:
return low
# Otherwise, linearly search for ceil value */
i = low
for i in range(high):
if arr[i] == x:
return i
# if x lies between arr[i] and arr[i+1] including
# arr[i+1], then return arr[i+1] */
if arr[i] < x and arr[i+1] >= x:
return i+1
# If we reach here then x is greater than the last element
# of the array, return -1 in this case */
return -1
# Driver program to check above functions */
arr = [1, 2, 8, 10, 10, 12, 19]
n = len(arr)
x = 3
index = ceilSearch(arr, 0, n-1, x);
if index == -1:
print ("Ceiling of %d doesn't exist in array "% x)
else:
print ("ceiling of %d is %d"%(x, arr[index]))
# This code is contributed by Shreyanshi Arun
Python3
# Function to get index of ceiling of x in arr[low..high]*/
def ceilSearch(arr, low, high, x):
# If x is smaller than or equal to the first element,
# then return the first element */
if x <= arr[low]:
return low
# If x is greater than the last element, then return -1 */
if x > arr[high]:
return -1
# get the index of middle element of arr[low..high]*/
mid = (low + high)/2; # low + (high - low)/2 */
# If x is same as middle element, then return mid */
if arr[mid] == x:
return mid
# If x is greater than arr[mid], then either arr[mid + 1]
# is ceiling of x or ceiling lies in arr[mid+1...high] */
elif arr[mid] < x:
if mid + 1 <= high and x <= arr[mid+1]:
return mid + 1
else:
return ceilSearch(arr, mid+1, high, x)
# If x is smaller than arr[mid], then either arr[mid]
# is ceiling of x or ceiling lies in arr[low...mid-1] */
else:
if mid - 1 >= low and x > arr[mid-1]:
return mid
else:
return ceilSearch(arr, low, mid - 1, x)
# Driver program to check above functions */
arr = [1, 2, 8, 10, 10, 12, 19]
n = len(arr)
x = 20
index = ceilSearch(arr, 0, n-1, x);
if index == -1:
print ("Ceiling of %d doesn't exist in array "% x)
else:
print ("ceiling of %d is %d"%(x, arr[index]))
# This code is contributed by Shreyanshi Arun
输出 :
ceiling of 3 is 8
时间复杂度: O(n)
方法 2(二分查找)
这里没有使用线性搜索,而是使用二进制搜索来查找索引。二分搜索将时间复杂度降低到 O(Logn)。
Python3
# Function to get index of ceiling of x in arr[low..high]*/
def ceilSearch(arr, low, high, x):
# If x is smaller than or equal to the first element,
# then return the first element */
if x <= arr[low]:
return low
# If x is greater than the last element, then return -1 */
if x > arr[high]:
return -1
# get the index of middle element of arr[low..high]*/
mid = (low + high)/2; # low + (high - low)/2 */
# If x is same as middle element, then return mid */
if arr[mid] == x:
return mid
# If x is greater than arr[mid], then either arr[mid + 1]
# is ceiling of x or ceiling lies in arr[mid+1...high] */
elif arr[mid] < x:
if mid + 1 <= high and x <= arr[mid+1]:
return mid + 1
else:
return ceilSearch(arr, mid+1, high, x)
# If x is smaller than arr[mid], then either arr[mid]
# is ceiling of x or ceiling lies in arr[low...mid-1] */
else:
if mid - 1 >= low and x > arr[mid-1]:
return mid
else:
return ceilSearch(arr, low, mid - 1, x)
# Driver program to check above functions */
arr = [1, 2, 8, 10, 10, 12, 19]
n = len(arr)
x = 20
index = ceilSearch(arr, 0, n-1, x);
if index == -1:
print ("Ceiling of %d doesn't exist in array "% x)
else:
print ("ceiling of %d is %d"%(x, arr[index]))
# This code is contributed by Shreyanshi Arun
输出 :
Ceiling of 20 doesn't exist in array
时间复杂度:O(Logn)
有关更多详细信息,请参阅排序数组中有关天花板的完整文章!