Binary-Search
实现思路
两个例子查找成功
查找失败
流程图二分查找完整算法(Python实现)from random import uniform def binary_search(array_to_search,number,left,right): index = -1 while(left <= right): middle = (left + right) // 2 if array_to_search[middle] == number: index = middle break elif array_to_search[middle] > number: right = middle - 1 else: left = middle + 1 return index if __name__ == '__main__': array_size = int(input("Please input the length of array:")) array_to_search = [int(uniform(0,5)) + 5 * i for i in range (0,array_size)] print("Init array:",array_to_search) number = int(input("Please input the number you want to search:")) # start search print("nn") print("######################") print("## Start searching! ##") print("######################") print("") print("Binary Search:",binary_search(array_to_search,len(array_to_search))) 时间复杂度对于一个长度为n的数组,每次与中间元素进行比较后规模都将缩小为原来的(frac{1}{2}),因此经过(log_2n)次比较后,规模将会缩小为1,因此二分查找的时间复杂度为(O(log_2n))。 OJ(LeetCode 852.山脉数组的峰值索引)我们把符合下列属性的数组A称作山脉:
给定一个确定为山脉的数组,返回任何满足任何满足A[0] < A[1] < ... < A[i - 1] < A[i] > A[i + 1] > ... > A[A.length - 1]的i的值。 按照算法的标准可以描述成如下形式:
一种朴素的想法是遍历数组,当某一个i使得A[i - 1] < A[i]并且A[i] > A[i + 1],则i即为所求。显然这种方法的时间复杂度为(O(n))。 我们可以采用二分查找的思想,每次取查找范围最中间的数A[mid],观察A[mid - 1]、A[mid]、A[mid + 1]三者的关系,如果A[mid - 1] < A[mid] && A[mid] > A[mid + 1],则mid为山峰的索引;若A[mid - 1] < A[mid] && A[mid] < A[mid + 1],证明还在上坡过程,mid在山峰的左边,查找范围缩小到[mid + 1,right];否则则为下坡过程,mid在山峰的右边,查找范围缩小到[left,mid - 1]。这种方法的时间复杂度为(O(log_2n))。 山脉数组的峰值索引完整算法(C++实现)class Solution { public: int peakIndexInMountainArray(vector<int>& A) { int length = A.size(); int left = 0,rigth = length - 1; int mid = 0,current = 0; while(left <= rigth) { mid = (left + rigth) / 2; if(A[mid - 1] < A[mid] && A[mid] > A[mid + 1]) { break; } else if(A[mid - 1] < A[mid] && A[mid] < A[mid + 1]) { left = mid + 1; } else { rigth = mid - 1; } } return mid; } }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |