python - 从排序数组到排序多项式数组的算法

标签 python algorithm python-2.7 sorting polynomial-math

处理下面的问题,主要思想是,(1)如果 A > 0,从两端合并,在这种情况下,两端的值比数组的中间大,( 2) 如果 A < 0,也从两端合并,在这种情况下,两端的值比数组的中间值小。

想知道在我的代码中是否有更好的性能改进(例如时间复杂度或其他角度)、空间复杂度改进或任何错误的想法?

问题,

给定一个已排序的整数数组 X 和 3 个整数 A、B 和 C。返回对应的已排序多项式数组。

换句话说,对数组中的每个元素 x 应用 Axx + B*x + C 并返回排序后的数组。

Python 2.7 中的源代码,

def f(v, a, b, c):
    return a*v*v + b*v + c

def sort_polynomial(numbers, a, b, c):
    result = []
    if a > 0:
        start = 0
        end = len(numbers) - 1
        while start <= end:
            if f(numbers[start], a, b, c) <= f(numbers[end], a, b, c):
                result.insert(0, (numbers[end], f(numbers[end], a, b, c)))
                end -= 1
            else:
                result.insert(0, (numbers[start], f(numbers[start], a, b, c)))
                start += 1
    elif a < 0:
        start = 0
        end = len(numbers) - 1
        while start <= end:
            if f(numbers[start], a, b, c) <= f(numbers[end], a, b, c):
                result.append((numbers[start], f(numbers[start], a, b, c)))
                start += 1
            else:
                result.append((numbers[end], f(numbers[end], a, b, c)))
                end -= 1
    else:
        raise Exception('invalid argument!')

    return result

if __name__ == "__main__":
    numbers = [-2, -1, 0, 1, 2]
    print sort_polynomial(numbers, 1, 2, 1)
    print sort_polynomial(numbers, -1, 2, 1)

最佳答案

你有功能

F(x) = A*x^2 + B * x + C

查找最小值或最大值(x 值 -B/2A)。如果极值在您的数据范围内,则获取具有极值的索引并以合并方式从开头(如果最小)或从结尾(如果最大)填充输出数组 - 您已经实现了一种合并。

在这种情况下(初步内存分配,没有插入)复杂度是线性的 O(N)

关于python - 从排序数组到排序多项式数组的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609028/

相关文章:

python - 如何在 python 中获取当前的 jupyter notebook 服务器?

python - 使用QLineEdit.setText()可以卡住窗口,但是后台任务可以正常工作

Python:替换,rstrip() 无法删除换行符

c - 为什么我的生成排列的回溯函数永远不会停止?

python - 在一定时间后调用函数并在按下按钮时终止,tkinter

python - 使用朴素贝叶斯的文本微调器

python - SQLite3 Python : How to do an efficient bulk update?

python - 保存文件为jpg格式

在序列中查找元素包的算法

algorithm - 来自小区 ID (OpenCellId) 的粗略位置