当前位置: 首页 > 知识库问答 >
问题:

二进制搜索算法的实现

南门建章
2023-03-14

我使用这个二进制搜索函数得到一个较大数据集的索引错误。当我输入一个较小的数据集时,即[1,2,3,4,5]搜索5。算法按预期运行。但是,当我获取下面的文本时,使用空参数列表(delimeter char为“”)调用string对象的split方法,并将字符串拆分为列表值,其中每个元素都是字符串,然后搜索单词“culpa”,我最终会出现以下错误:

索引错误:列表索引超出范围

非常感谢你的帮助。非常感谢。

字符串:1。知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡。

代码:http://ideone.com/TXVfQA

def binary_search(l,skey,start,stop):
    length = (stop - start) + 1 # length of search space
    middle = start + (length / 2)
    mid_val = l[middle]
    if skey == mid_val:
        return middle
    elif skey > middle:
        return binary_search(l,skey,(middle + 1),stop)
    else:
        return binary_search(l,skey,start,(middle - 1))

共有2个答案

皇甫智明
2023-03-14

您从不检查stop是否小于start递归调用将很容易创建该条件。

楚乐逸
2023-03-14

这个算法有几个问题。

首先,如果您请求的项目小于列表中最小的(skey)

对于列表中未显示元素的情况,您并没有适当的行为。例如,如果未找到元素,则可以返回None。您的代码可以这样修复:

def binary_search(l, skey, start, stop):
    # possible answer is always in interval [start, stop)
    while start + 1 != stop:
        middle = (start + stop) // 2
        mid_val = l[middle]
        if skey < mid_val:
            stop = middle
        else:
            start = middle
    return start if l[start] == skey else None

它将发现元素的最后一次出现等于skey。它还使用循环而不是递归,从而节省了执行函数所需的时间。

 类似资料:
  • 我有一个二进制搜索树,它的每个节点都有两个值。 所以它的节点是这样的。 我已经根据节点的“name”变量的升序在BST中插入了值。所以树的顺序遍历将按“name”的升序返回节点。 现在我想根据“值”变量的升序显示树节点。无需更改原始树。哪种算法/方法对此最有效?

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地

  • 这是理解分而治之算法的练习题。 给你一个N个排序整数的数组。所有元素都是不同的,除了一个元素重复两次。设计一个O(log N)算法来找到那个元素。 我得到这个数组需要被划分,看看下一个索引中是否找到了一个相等的对应项,我相信这是二进制搜索的一种变体。但我找不到任何解决方案或指导。

  • 我和我的搭档正在为数据结构实现二进制搜索树 在我们的测试案例中,我们没有得到我们预期的结果。我们最初创建了一个空的BinarySearchTree,并调用add方法。从这里,我们将一个整数对象(10)传递给该方法。完成此操作后,应该调用递归addItem方法。thisRoot当前应该引用null(因为我们创建了一个空的BinarySearchTree),因此thisRoot现在应该引用新的Bina

  • 问题内容: 我正在编写一个使用二进制搜索树存储数据的程序。在以前的程序中(无关),我能够使用Java SE6随附的实现来实现链表。二进制搜索树是否有类似的东西,还是我需要“从头开始”? 问题答案: 您可以使用。被实现为一棵红黑树,这是一个自平衡二进制搜索树。

  • 问题内容: 有什么方法可以在具有对象的ArrayList中实现二进制搜索?在此示例中,ArrayList将使用字段“ id”进行排序。 如果我应该使用二进制搜索返回具有指定ID的用户,“ User getUserById(ArrayList users,int userid)”将如何?这有可能吗? 问题答案: Java教程的对象排序文章中有一个示例,您可以编写自己的示例以对自定义类型进行比较。 然