【问题标题】:Find state transition from Low to High in python (using binary search)在python中查找从低到高的状态转换(使用二进制搜索)
【发布时间】:2021-01-21 01:27:30
【问题描述】:

挑战: 我想知道逻辑何时从 HIGH(1) 变为 LOW (0),反之亦然。

数值示例:

  1. 当输入值 = 3.5 时,以 0.05 的步长将数据从 0 刷到 5,逻辑从 LOW(0) 变为 HIGH (1)。
  • arr = [0, 0.05..3.5..5]
  • 当 arr 中的值 = 3.5。状态变为 HIGH(1)
  1. 当输入值 = 2.5 时,以 0.05 的步长将数据 5 刷到 0,逻辑从 HIGH (1) 变为 LOW(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 来完成我试图将它集成到我的代码中,但惨遭失败...... 如果有人知道,是否可以在此代码中使用二进制搜索或者有更有效的方法,请告诉我。

【问题讨论】:

  • 总结您的代码返回 2 个浮点数的数组中的位置(索引)。这是其他地方逻辑的开关值。您一直使用的数组是排序的,并且总是有 2 个开关(一个向上一个向下)按数组(既不多也不少)?
  • @RomainL.是的,你完全正确!
  • 那我不明白你为什么不使用内置的python。索引方法似乎符合你的需求。它返回元素的第一个索引。例如。 arr.index(3.5), arr[::-1].index(2.5)。如果这不是您要查找的内容,请解释为什么它不适用于您的情况。
  • @RomainL。实际上,在实际情况下,我不知道它将从高切换到低然后从低切换到高的值,它大约在 2.5 和 3.5 之间。

标签: python python-3.x binary-search


【解决方案1】:

因为您的数组是使用二分搜索对您进行排序的,所以您可以从平均 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")

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 2021-03-19
    • 1970-01-01
    • 2015-08-15
    • 2022-07-02
    • 1970-01-01
    • 2019-03-11
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多