[01]Binary Search二分查找

Binary Search二分查找

作用:二分查找适用于有序的的数组或列表中,如果列表及数组中有n个元素,通过二分查找查询某一元素的位置需要的步骤是log2(n)(注:该log的底数是2)

1.Python实现

def binary_search(list,item):
    low = 0
  high = len(list)-1 #python数组ID从0开始,与matlab不同、
  t = 0
  while low <= high:
        t = t + 1;
        mid = round((low + high)/2)
        guess = list[mid]
        if guess == item:
            return (mid,t)
        if guess > item:
            high = mid-1
  else:
            low = mid + 1
  return None #python关键字None,相当于matlab的NaN
my_list = range(1,101)
value = binary_search(my_list,1)
print ("Search Num:",value[1],‘Index Position‘,value[0])

运行后结果:

Search Num: 6 Index Position 0

注意事项:

  • python定义的函数、使用如if、while、for时在语句后使用分号‘;‘
  • 列表元素索引从0开始;
  • 如果定义的函数具有返回值,那么返回值通过关键字‘return‘实现函数输出,可多输出,如果调用函数返回值,可通过查询对应返回值索引,查找所需的函数返回值;
  • 求中间索引位置时,防止出现查询调用时索引计算出现小数,通过round函数进行四舍五入处理;

2.Matlab实现  

函数实现代码:

function [count,out] = binary_search(list,item)
%list:所要查找的数组一维行向量
%item:查找的元素
low = 1;
high = length(list);
t = 0;
while low <= high
    t = t+1;
    mid = round((low+high)/2);
    guess = list(1,mid);
    if guess == item
        out =  mid;
        count = t;
        break;
    else if guess > item
            high = mid - 1;
            if high<low
                out = ‘None‘;
                break;
            end
        else
            low = mid + 1;
            if high<low
                out = ‘None‘;
                break;
            end
        end
    end
end

测试用代码:

n = 100;
data = randperm(n);
data = sort(data);
[t,v] = binary_search(data,100);
str = [‘search num:‘,num2str(t),‘;   ‘,‘Index Position:‘,num2str(v)];
disp(str);

运行后结果:  

search num:6;   Index Position:100

注意事项

  • Matlab数组元素索引从1开始,这点与python不同;
  • 函数返回值在定义函数时直接定义;

原文地址:https://www.cnblogs.com/GavinDu/p/12320894.html

时间: 2024-10-07 10:22:08

[01]Binary Search二分查找的相关文章

Binary Search 二分查找总结

Binary Search基本的复杂度为O(logn).如果提示需要对O(n)的算法进行优化,非常可能就是二分,另外二分一般出现在排序数组或者变形后的排序数组(rotated array)当中.二分主要有两种,binary search on index(index上的二分)和binary search on result(结果上的二分).index上的二分主要有 result上的二分主要有Sqrt(x),Wood cut两种. 另外binary search的版本很多,区别在终结条件,比如是l

【算法模板】Binary Search 二分查找

模板: 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. int binarySearch(vector<int> &array, int target) { if (array.size() == 0) { return -1; } int start = 0; int end = array.size() - 1; int mid; while (start

Binary Search (二分查找)

思路就是砍一半, 适用于sorted array. 时间复杂度O(lgn). 每次都是取中间的跟target比较, 比target小的话目标值肯定在lower和mid之间, 比target大的话在mid和high之间~ 1 public int binarySearch(int num[], int target){ 2 int lower = 0; 3 int high = num.length - 1; 4 while(lower <= high){ 5 int mid = lower +

501. Find Mode in Binary Search Tree查找BST中的众数

[抄题]: Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST. Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than or equal to t

[LeetCode] Binary Search 二分搜索法

Given a sorted (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1. Example 1: Input: nums = [-1,0,3,5,9,12], target = 9 Out

二分查找的实现和应用汇总(转载)

转载地址:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 二分查找法的实现和应用汇总 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度.在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

STL之二分查找 (Binary search in STL)

STL之二分查找 (Binary search in STL) Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_i

【转】STL之二分查找 (Binary search in STL)

Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的派别式版本,其