如何解决在python中查找从低到高的状态转换使用二进制搜索
挑战: 我想知道逻辑何时从 HIGH(1) 变为 LOW (0),反之亦然。
数字示例:
- 当输入值 = 3.5 时,以 0.05 的步长滑动数据 0 到 5,逻辑从低(0)变为高(1)。
- arr = [0,0.05..3.5..5]
- 当 arr 中的值 = 3.5 时。状态变为 HIGH(1)
- 以 0.05 的步长将数据从 5 滑动到 0,当输入值 = 2.5 时,逻辑从高 (1) 变为低 (0)。
- arr = [5,4.95..2.5..0]
- 当 arr 中的值 = 2.5 时。状态变为 LOW(0)
以下是我的功能代码:
def get_state(value):
if value > 3.5:
return 1
if value < 2.5:
return 0
def find_state_changed(arr):
low_state = get_state(min(arr))
high_state = get_state(max(arr))
for up in arr:
if get_state(up) != low_state:
LowHigh = up
break
for low in arr[::-1]:
if get_state(low) != high_state:
HighLow = low
break
return LowHigh,HighLow
low = 0
high = 5
iteration = 100
step = (high - low)/iteration
arr = [round(i * step,2) for i in list(range(iteration+1))]
print(find_state_changed(arr))
需要帮助:
我的一位同事提到可以使用 binary search 来完成我曾尝试将其集成到我的代码中,但不幸的是失败了... 如果有人知道,是否可以在此代码中使用二分查找或者有更有效的方法,请告诉我。
解决方法
因为您的数组已排序,所以您使用二分搜索允许从平均 O(n) 传递到 O(log(n)),这在大型数据集上可能会很戏剧化。
您必须自定义二分搜索,因为您不搜索精确值。
例如,您可以执行以下操作:
def custom_binary_search(arr,value):
"""
return the position of value in arr if value in arr. Alse return the position of the nearest superior value.
:param arr:
:param value:
:return:
"""
_arr = arr[::]
left_ = 0
right_ = len(arr) - 1
while True: # possible infinite loops here
middle_i = int((right_ - left_) / 2)
middle_v = arr[middle_i]
if middle_v == value:
return middle_i
elif middle_v < value and arr[middle_i + 1] > value:
return middle_i + 1
elif middle_v < value:
right_ = middle_i
elif middle_v > value:
left_ = middle_i
else:
raise AssertionError("Should never reach this condition")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。