Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同时使用两个中间(两个指针)进行二进制搜索_Python_Algorithm_Binary Search - Fatal编程技术网

Python 同时使用两个中间(两个指针)进行二进制搜索

Python 同时使用两个中间(两个指针)进行二进制搜索,python,algorithm,binary-search,Python,Algorithm,Binary Search,我只是想把数组分成三个子数组,而不是两个子数组 首先,这样做合乎逻辑吗?请帮我理解这个算法并写下来 def contains(elements, value): left, right = 0, len(elements) - 1 if left <= right: middle = (left + right) // 2 if elements[middle] == value: return True if elements[middle]

我只是想把数组分成三个子数组,而不是两个子数组 首先,这样做合乎逻辑吗?请帮我理解这个算法并写下来

def contains(elements, value):
left, right = 0, len(elements) - 1

if left <= right:
    middle = (left + right) // 2

    if elements[middle] == value:
        return True

    if elements[middle] < value:
        return contains(elements[middle + 1:], value)
    elif elements[middle] > value:
        return contains(elements[:middle], value)

return False
def包含(元素、值):
左,右=0,len(元素)-1
如果为左值:
返回包含(元素[:中间],值)
返回错误

您确实可以调整二进制搜索,将数组拆分为多个部分,而不仅仅是两个部分。更一般地说,以下是k元搜索背后的想法:

  • 将数组拆分为大小大致相等的k个部分。(对于二进制搜索,这是两半。对于您的搜索,这将是三分之三)

  • 选择第一个(k-1)部分的最后一个元素作为关键点。(对于二进制搜索,您选择前半部分的最后一个元素,即中间元素。对于搜索,这将是数组中1/3和2/3点处的元素。)

  • 根据您的元素与键的比较情况,(1)停止搜索,因为您找到了要查找的内容,或者(2)递归地浏览相应的部分。(在二进制搜索中,您可以向左分支,停止,因为中间的元素是您想要的元素,或者向右分支。在搜索中,您可以(1)发现您的元素是您选择要查看的两个元素之一,或者(2)将下降到包含您的元素的三分之一。)

至于这是否是一个好主意-这很可能是一个好主意!在k元搜索中,每次迭代都会将数组缩小k倍,因此算法的迭代次数大约为logkn=(logn)/(logk)。每次迭代都会查看k-1键,因此您正在进行O(k)工作。这意味着所做的功是O((k/logk)n)。当您选择k=e(即约2.7182828)时,数量k/log k会最小化,因此选择k=2或k=3是不错的选择。然而,由于处理器缓存的工作方式,我怀疑选择k=2总体上会更快,因为缓存未命中的次数会更少。(嘿!实际上我们倾向于使用二进制搜索,所以这可能不是个坏主意。)

有趣的是,在数据库中广泛使用的,使用类似的东西来存储其元素。由于B-树是如何构造的,B-树通常选择k作为某个巨大的数字,但在常规数组搜索中,这可能不是一个好主意


希望这有帮助

如果将其拆分为三个,则根据定义,它不再是二进制搜索。:)也许你想要三元搜索。但这里似乎真的没有必要。旁白:最后一个
elif
可以更改为
else
elements[middle]>值
此时必须为真)。