Arrays 二进制搜索(样条曲线应用)

Arrays 二进制搜索(样条曲线应用),arrays,algorithm,vba,binary-search,Arrays,Algorithm,Vba,Binary Search,我一直在尝试使用三次样条插值应用程序在已排序的数据数组上实现二进制搜索。我无法让它在所有范围内运行。例如,搜索编号4.4应返回范围[4.35-4.57]的下限4.35。4.57同时存在于[4.35-4.57]和[4.57,4.76]等中 数组()的子二进制搜索 Dim SplineRanges()作为变体 将右调为整数 中间为整数 将左变暗为整数 作为变量的数字 样条线=数组(4,4.35,4.57,4.76,5.26,5.88) SearchNumber=4.4 右=UBound(花键连接)

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

数组()的子二进制搜索 Dim SplineRanges()作为变体 将右调为整数 中间为整数 将左变暗为整数 作为变量的数字 样条线=数组(4,4.35,4.57,4.76,5.26,5.88) SearchNumber=4.4 右=UBound(花键连接) 左=左键(夹板键) 当左<右时做 中间=左+(右-左)/2 如果SplineRanges(中间)然后搜索编号 右=中-1 其他的 左=中 退出Do 如果结束 环 Print SplineRanges(左-1);SearchNumber;SplineRanges(左)”尝试了许多不同的语句以返回正确的边界。 端接头
你的问题就在眼前

Right = Middle - 1
那应该是

Right = Middle

否则,您将太快、太远地关闭间隔…

您的问题已经到了

Right = Middle - 1
那应该是

Right = Middle

否则,您将太快、太远地关闭间隔…

我太快地指出了(仅)一件使您的代码出现问题的事情。我再次查看了总体逻辑,并得出了以下代码片段-更容易理解和更正:

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)
Do While Right-Left>1
中间=左+(右-左)/2
如果SplineRanges(中间)

我以0.01的步长在从4.01到5.88的整个值范围内运行了这一过程,它似乎自始至终都在运行。逻辑更容易理解:如果你的中点值太高,那么你调整你的下边界到该点;否则你调整你的上边界。一旦上下边界只相隔一个,你的target是“在括号中”。请注意,浮点类型并不是每个类型都达到相等,只有小的整数值除外。因此,您提出的关于“4.57同时存在于[4.35-4.57]和[4.57-4.76]”的点是很棘手的。无论如何,当您制作样条曲线时,当您“恰好是点的错误一侧”时,近似不会崩溃由于样条曲线具有所有这些可爱的连续导数…

我太快地指出了(仅)一件使您的代码出现问题的事情。我再次查看了所有逻辑,并得出了以下代码片段-更容易理解和更正:

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)
Do While Right-Left>1
中间=左+(右-左)/2
如果SplineRanges(中间)

我以0.01的步长在从4.01到5.88的整个值范围内运行了这一过程,它似乎自始至终都在运行。逻辑更容易理解:如果你的中点值太高,那么你调整你的下边界到该点;否则你调整你的上边界。一旦上下边界只相隔一个,你的target是“在括号中”。请注意,浮点类型并不是每个类型都达到相等,只有小的整数值除外。因此,您提出的关于“4.57同时存在于[4.35-4.57]和[4.57-4.76]”的点是很棘手的。无论如何,当您制作样条曲线时,当您“恰好是点的错误一侧”时,近似不会崩溃由于样条曲线具有所有这些可爱的连续导数…

a shift right=middle进入4.76和5.26之间的无限循环。a shift right=middle进入4.76和5.26之间的无限循环。Floris是荷兰名字,所以在荷兰语中..BEDANKT!!Floris是荷兰名字,所以在荷兰语中..BEDANKT!!