首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制搜索(Spline应用程序)

二进制搜索(Spline应用程序)
EN

Stack Overflow用户
提问于 2013-02-07 08:13:59
回答 2查看 200关注 0票数 0

我一直在尝试使用三次样条插值的应用程序在排序的数据数组上实现二进制搜索。我不能让它在所有的范围内运行。例如,搜索号4.4应该返回范围[ 4.35 -4.57]的下限4.35。4.57既有4.35-4.57又有[4.57,4.76]等。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-07 11:14:44

我太快了,只指出了一件事,那就是让你的代码有麻烦。我又看了一遍所有的逻辑,并提出了以下代码片段-更容易理解,也更正确:

代码语言:javascript
复制
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“的观点是很棘手的。无论如何,当你制作样条曲线时,当你“只是在一个点的错误一侧”时,近似不会崩溃,因为样条曲线有所有那些可爱的连续导数……

票数 1
EN

Stack Overflow用户

发布于 2013-02-07 08:24:51

你的问题出在队伍里

代码语言:javascript
复制
Right = Middle - 1

那应该是

代码语言:javascript
复制
Right = Middle

否则,您将关闭间隔太远,太快...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14741390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档