给定两个长度相同的序列A和B:一个是严格递增的,另一个是严格递减的. 需要找到一个指数i,使得A[i]和B[i]之间的差的绝对值是最小的.如果有几个这样的指数,答案是其中最小的一个.输入序列是标准的Pythonarray.可以保证它们的长度是相同的.效率要求:渐近复杂性:不超过输入序列长度的对数的幂. 我已经使用黄金分割方法实现了索引查找,但我对浮点算法的使用感到困惑.有没有可能改进这个算法,不再使用它,或者你能想出一个更简洁的解决方案?

import random
import math
def peak(A,B):
    def f(x):
        return abs(A[x]-B[x])
    phi_inv = 1 / ((math.sqrt(5) + 1) / 2)
    def cal_x1(left,right):
        return right - (round((right-left) * phi_inv))
    def cal_x2(left,right):
        return left + (round((right-left) * phi_inv))
    left, right = 0, len(A)-1
    x1, x2 = cal_x1(left, right), cal_x2(left,right)
    while x1 < x2:
        if f(x1) > f(x2):
            left = x1
            x1 = x2
            x2 = cal_x1(x1,right)
        else:
            right = x2
            x2 = x1
            x1 = cal_x2(left,x2)
    if x1 > 1 and f(x1-2) <= f(x1-1): return x1-2
    if x1+2 < len(A) and f(x1+2) < f(x1+1): return x1+2
    if x1 > 0 and f(x1-1) <= f(x1): return x1-1
    if x1+1 < len(A) and f(x1+1) < f(x1): return x1+1
    return x1

#value check
def make_arr(inv):
    x = set()
    while len(x) != 1000:
        x.add(random.randint(-10000,10000))
    x = sorted(list(x),reverse = inv)
    return x

x = make_arr(0)
y = make_arr(1)
needle = 1000000
c = 0
for i in range(1000):
    if abs(x[i]-y[i]) < needle:
        c = i
        needle = abs(x[i]-y[i])
print(c)
print(peak(x,y))

推荐答案

Approach

发帖者询问发布代码的替代、更简单的解决方案.

问题是Leetcode Problem 852的变体,其中的目标是在山峰数组中找到峰值指数.我们通过计算绝对差的负值来换算成峰值,而不是最小值.我们的方法是将这个Python solution修改为Leetcode问题.

Code

def binary_search(x, y):
    ''' Mod of https://walkccc.me/LeetCode/problems/0852/ to use function'''
    def f(m):
        ' Absoute value of difference at index m of two arrays '
        return -abs(x[m] - y[m])    # Make negative so we are looking for a peak
            
    # peak using binary search
    l = 0
    r = len(arr) - 1

    while l < r:
      m = (l + r) // 2
      if f(m) < f(m + 1):    # check if increasing
        l = m + 1
      else:
        r = m                 # was decreasing

    return l

Test

def linear_search(A, B):
    ' Linear Search Method '
    values = [abs(ai-bi) for ai, bi in zip(A, B)]
    return values.index(min(values))     # linear search
    
def make_arr(inv):
    random.seed(10)    # added so we can repeat with the same data
    x = set()
    while len(x) != 1000:
        x.add(random.randint(-10000,10000))
    x = sorted(list(x),reverse = inv)
    return x


# Create data
x = make_arr(0)
y = make_arr(1)

# Run search methods
print(f'Linear Search Solution {linear_search(x, y)}')
print(f'Golden Section Search Solution {peak(x, y)}') # posted code
print(f'Binary Search Solution {binary_search(x, y)}')

Output

Linear Search Solution 499
Golden Section Search Solution 499
Binary Search Solution 499

Python相关问答推荐

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

我从带有langchain的mongoDB中的vector serch获得一个空数组

如何根据参数推断对象的返回类型?

可变参数数量的重载类型(args或kwargs)

如何在给定的条件下使numpy数组的计算速度最快?

DataFrames与NaN的条件乘法

Pandas Loc Select 到NaN和值列表

如何保持服务器发送的事件连接活动?

Python列表不会在条件while循环中正确随机化'

需要帮助重新调整python fill_between与数据点

如何从列表框中 Select 而不出错?

Pandas Data Wrangling/Dataframe Assignment

* 动态地 * 修饰Python中的递归函数

Flash只从html表单中获取一个值

替换现有列名中的字符,而不创建新列

判断Python操作:如何从字面上得到所有decorator ?

有了Gekko,可以创建子模型或将模型合并在一起吗?

仅取消堆叠最后三列

具有不同坐标的tkinter canvs.cocords()和canvs.moveto()

合并Pandas中的数据帧,但处理不存在的列