二进制搜索多个值

时间:2014-02-05 14:25:30

标签: python search numpy binary binary-search-tree

嗨我有一个与python相关的问题,

我有一个排序的Numpy数组,我必须快速找到某些值的索引,到目前为止我一直在使用二进制搜索,但我遇到的问题是有很多相同值的条目,我必须找到所有值的索引。有没有办法修改二进制搜索以找到所有?
当前代码是

def binarySearch(alist,item,con_array,element):
    if len(alist) == 0:
        return False
    else:
        midpoint = len(alist)//2
        if alist[midpoint]==item:            
            for l in range(len(alist)):
                if alist[l] == item:
                    n_array.append(con_array[l])
            return True                   
        else:
            if item<alist[midpoint]:
                return binarySearch(alist[:midpoint],item,con_array[:midpoint],i)
            else:
                return binarySearch(alist[midpoint+1:],item,con_array[midpoint+1:],i) 

你可以看到我试图通过简单地搜索缩短的数组来合并它,但这仍然会削减一些值

2 个答案:

答案 0 :(得分:4)

可以轻松调整二进制搜索以找到大于键的第一个值,这样,通过两次搜索,您发现值的范围等于键。 NumPy实际上已经为你实现了这个:

>>> a = np.array([0, 1, 2, 2, 2, 3, 5, 7])
>>> left = np.searchsorted(a, 2, side='left')
>>> right = np.searchsorted(a, 2, side='right')
>>> a[left:right]
array([2, 2, 2])

对于非常大的数组,在a[left:]上执行第二次搜索可能稍微有点效率:

>>> right = left + np.searchsorted(a[left:], 2, side='right')
>>> a[left:right]
array([2, 2, 2])

答案 1 :(得分:0)

使用二进制搜索来完成这项工作是一项非常有教育意义的练习,当我教算法时,我总是建议我的学生尝试它。如果您只是想完成它,numpy已经有了一个能够满足你想要的功能:

import numpy as np
a = np.array([1,2,3,1,2,3,1,1])
np.where(a==1)

输出

(array([0, 3, 6, 7]),)