【问题标题】:Finding Pivot element in a sorted array, How do I optimize this code?在排序数组中查找 Pivot 元素,如何优化此代码?
【发布时间】:2022-02-07 01:27:58
【问题描述】:

有没有办法优化这段代码? 我试图在排序列表旋转的列表中找到一个元素。 [8,9,10,11,12,6,7] 这里我要查找的元素是 6,索引为 5。

class Solution:    
    def search(self, nums: List[int]) -> int:
        lenn = len(nums)-1
        pivot, mid = 0, (0 + lenn)//2
        
        if(nums[0] > nums[lenn]):
            while True:
                if(nums[mid] > nums[mid+1]):
                    pivot = mid+1
                    break
                if(nums[mid] < nums[mid-1]):
                    pivot = mid
                    break
                if(nums[mid] > nums[lenn]):
                    mid += 1
                if(nums[mid] < nums[lenn]):
                    mid -= 1
        return pivot

【问题讨论】:

  • def search(self, nums: List[int]) -&gt; int - 那是正确的python吗?
  • 另外,根据您的描述,您正在尝试在列表中找到最小的元素,这非常简单。
  • @bbbbbbbbbb 是python。我知道我们可以使用 min() 找到 min,但我正在尝试对数方法。
  • 你想改进哪个,算法还是执行时间?如果是后者,那么仅使用numpy.argmin 会明显更快,这还不够吗?

标签: python optimization


【解决方案1】:

您的解决方案适用于小型列表,但不适用于大型列表,因为它执行线性时间搜索。为了更快,您可以使用二分搜索。为此,您需要使用包含“枢轴”的 [start;end] 值范围。你只需要取中间项,找出哪一部分(左或右)包含增加的项。

此外,您可以微优化代码。 Python 的默认实现是 CPython,它是一个慢速解释器。与编译器(C、Java、Rust 等语言)相比,它几乎没有优化任何东西,所以如果你想要一个快速的代码,你应该自己进行优化。这个想法是对少数项目使用线性搜索,对许多项目使用二进制搜索,并将值存储在临时变量中而不是计算两次。

这是最终的实现:

def search(nums):
    first, last = nums[0], nums[-1]

    # Trivial case
    if first <= last:
        return 0

    lenn = len(nums)-1

    # Micro-optimized fast linear search for few items (optional)
    if lenn < 10:
        pivot, mid = 0, lenn//2
        while True:
            middle = nums[mid]
            if middle > nums[mid+1]:
                return mid+1
            elif middle < nums[mid-1]:
                return mid
            elif middle > last:
                mid += 1
            elif middle < last:
                mid -= 1

    # Binary search for many items
    start, end = 0, lenn
    while start+1 < end:
        mid = (start + end) // 2
        midVal = nums[mid]
        if midVal < nums[start]:
            end = mid
        elif midVal > nums[end]:
            start = mid
        else:
            assert False
    return start+1

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2020-01-30
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多