我的二进制搜索有效,但返回错误的索引
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
【讨论】:
以上是关于我的二进制搜索有效,但返回错误的索引的主要内容,如果未能解决你的问题,请参考以下文章