我的二进制搜索有效,但返回错误的索引

Posted

技术标签:

【中文标题】我的二进制搜索有效,但返回错误的索引【英文标题】:my binary search works but returns the wrong index 【发布时间】:2021-02-11 23:15:05 【问题描述】:

我在haskell中实现了一个二分查找功能,如果找到了,我想返回数字的实际索引。

我多次测试了这个函数,如果它存在,它总能找到数字,但最后它写出错误的索引。我试图以各种方式改变它,但我失去了逻辑。我做错了什么?

search :: Int -> Int -> [Int] -> Int
search _ _ [] = (-1)
search e i xs 
    | e == mid = (index + i)
    | e < mid = search e (i - index) prev
    | e > mid = search e (index + i + 1) next
    where
        index = length xs `quot` 2
        (mid: next) = drop index xs
        prev = take index xs

如果我找到它,我应该返回元素的索引。

i 在第一次调用时将是 0,然后它会在 recusion 中增长和缩小。

输入列表xs按升序排序。

e 是元素 提前谢谢你。

【问题讨论】:

i 参数的意义何在? 一般注意事项:以这种方式搜索 list 毫无意义,实际上它比简单的穷举搜索要慢得多。 @leftaroundabout i 是索引,我把它作为参数,因为函数是递归的,新索引将基于子列表,我需要返回完整列表的索引.我编辑了我的问题以添加它 (i - index) 看起来对我很好奇。为什么不应该只是i 考虑在[0,1]中搜索0的情况,search 0 0 [0,1]。那么你的第一个递归将是search 0 (-1) [0] 【参考方案1】:

我发现了如何获得正确的索引。我应该把第二个模式改成有

e < mid = search e (i) prev

【讨论】:

以上是关于我的二进制搜索有效,但返回错误的索引的主要内容,如果未能解决你的问题,请参考以下文章

切片时返回错误索引值的数据类型

使用二进制搜索的 Java 前缀搜索

二进制搜索程序未打印正确的索引

在java上给出错误索引的数组的二进制搜索

我的二进制搜索只返回数字不能是,C

使用二进制搜索的多个键的最后索引?