【问题标题】:Binary search inside sorted array in OCamlOCaml中排序数组内的二进制搜索
【发布时间】:2015-11-29 09:47:07
【问题描述】:
let find arr word =
  let rec binaryserach arr word min max =
    let mid = (min + max) / 2 in
    if max < min then -1 else
    if (String.compare arr.(mid)  word = 0) then mid else 
    if (String.compare arr.(mid)  word = 1) then (binaryserach arr word (mid+1) max) else
      binaryserach arr word min (mid-1) in 
  binaryserach arr word 0 ((Array.length arr) - 1) ;;

我正在尝试在 OCaml 中进行二进制搜索。这段代码有什么问题?它总是返回-1。它是一个字符串数组,因此比较元素会给出值 0、-1 或 1,如果它们相等,则第一个元素较小和第一个元素分别较大(文档说正整数和负整数,但我已经在解释器中测试并收到 1 和 -1 )。关于我在这里犯的错误的任何提示?

【问题讨论】:

  • 它在使用 =、 代替 String.compare 时给出相同的结果。所以问题是别的东西
  • 可以添加调用代码吗?
  • find [|"a"; "b"; "c"|] "a" 返回 -1 @Grozz

标签: functional-programming ocaml ocaml-batteries


【解决方案1】:

将此if (String.compare arr.(mid) word = 1) 更改为-1

如果左侧大于右侧,String.compare 返回 1

注意:所采用的一般方法包含此处维基百科文章中描述的小已知错误: https://en.wikipedia.org/wiki/Binary_search_algorithm#Implementation_issues

基本上,将mid 计算为(min + max) / 2 会为足够大的数字提供整数溢出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多