将二进制搜索解决方案与书籍进行比较

时间:2018-06-02 19:46:17

标签: python algorithm binary-search

问题如下:

  

如果可以循环移位其条目以使其变为排序,则称该数组是循环排序的。例如,图11.2中的数组是循环排序的 - 循环左移4乘以排序数组。设计一个Z算法,用于查找循环排序数组中最小元素的位置。假设所有元素都是不同的。例如,对于O(logN),返回值应为4。

解决方案的工作原理是将中间值与A [n-1]进行比较 - 取决于您可以将搜索范围缩小到带有拐点的列表侧面的关系。

我的解决方案:

list = [378, 478, 550, 631, 103, 203, 220, 234, 279, 368]

作者解决方案:

def cyclic_sorted_lst(A):
  low, high = 0, len(A) - 1
  while low <= high:
    mid = (low + high) // 2
    if A[mid] < A[high]:
      high = mid 
    elif A[mid] == A[high]:
      return mid 
    else:
      low = mid + 1 

我想知道我的解决方案是否会导致任何一个错误,或者两个解决方案是否同样好。我有什么想念的吗?至少对于问题描述中的示例,它运作良好。

1 个答案:

答案 0 :(得分:-1)

根据我的评论,我写了一个简单的测试生成器来测试你的解决方案。这是代码:

def cyclic_sorted_lst(A):
  low, high = 0, len(A) - 1
  while low <= high:
    mid = (low + high) // 2
    if A[mid] < A[high]:
      high = mid 
    elif A[mid] == A[high]:
      return mid 
    else:
      low = mid + 1

import random
i = 0
while True:
    i += 1
    print(i)
    arr = list(set([random.randint(1, int(1000)) for _ in range(10)]))
    arr.sort()
    length = random.randint(1, len(arr))
    cyclic_arr = arr[length:] + arr[:length]
    print(cyclic_arr)
    if cyclic_sorted_lst(cyclic_arr) != cyclic_arr.index(min(cyclic_arr)):
        print(cyclic_arr, cyclic_sorted_lst(cyclic_arr), cyclic_arr.index(min(cyclic_arr)))
        break

您的代码成功运行超过200K次迭代,所以我非常有信心它是正确的。