【问题标题】:Binary Search (Spline application)二分搜索(样条应用)
【发布时间】:2013-02-07 00:13:58
【问题描述】:

我一直在尝试使用三次样条插值的应用程序对已排序的数据数组实现二进制搜索。我无法让它在所有范围内运行。例如,搜索编号 4.4 应返回范围 [4.35-4.57) 的下限 4.35。 4.57 存在于 [4.35-4.57] 和 [4.57, 4.76) 等中。

Sub Binary_Search_of_Array()
Dim SplineRanges() As Variant
Dim Right As Integer
Dim Middle As Integer
Dim Left As Integer
Dim SearchNumber As Variant


SplineRanges = Array(4, 4.35, 4.57, 4.76, 5.26, 5.88)
SearchNumber = 4.4


Right = UBound(SplineRanges)
Left = LBound(SplineRanges)
Do While Left < Right
  Middle = Left + (Right - Left) / 2

  If SplineRanges(Middle) < SearchNumber Then
     Left = Middle + 1
  ElseIf SplineRanges(Middle) > SearchNumber Then
     Right = Middle - 1
  Else
    Left = Middle
    Exit Do
  End If
Loop


  Debug.Print SplineRanges(Left - 1); SearchNumber; SplineRanges(Left) ' Tried many different statements to return the correct bounds.



End Sub

【问题讨论】:

    标签: arrays algorithm vba binary-search


    【解决方案1】:

    你的问题出在一行

    Right = Middle - 1
    

    应该是这样的

    Right = Middle
    

    否则你会关闭间隔太远,太快......

    【讨论】:

    • 右移 = 中间进入 4.76 和 5.26 之间的无限循环。
    【解决方案2】:

    我太快(只)指出了一件让您的代码出现问题的事情。我又看了一下整体逻辑,并提出了以下 sn-p - 更容易理解和更正:

    Do While Right - Left > 1
      Middle = Left + (Right - Left) / 2
    
      If SplineRanges(Middle) < SearchNumber Then
        Left = Middle
      Else
        Right = Middle
      End If
    Loop
    
    Debug.Print SplineRanges(Left); SearchNumber; SplineRanges(Right)
    

    我以 0.01 的步长在 4.01 到 5.88 的整个值范围内运行它,并且它似乎始终表现良好。逻辑更容易理解:如果你的中点值太高,那么你调整你的下边界到那个点;否则你调整你的上限。一旦上下边界仅相距一,您的目标就“在括号中”。请注意,除小整数值外,浮点类型并非真的每个都达到相等。因此,您关于“4.57 存在于 [4.35-4.57] 和 [4.57-4.76] 中”的观点很棘手。无论如何,当你制作样条曲线时,当你“只是一个点的错误的一面”时,近似值不会崩溃,因为样条曲线有所有这些可爱的连续导数......

    【讨论】:

    • 弗洛里斯是一个荷兰名字,所以在荷兰语中..BEDANKT!!
    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多