C# 计算每个给定范围的函数最小值

标签 c# arrays graph-theory

我需要在不运行 O(n) 的情况下找到给定范围内的最小值。

数组可能是一些对角线或双曲线。这是三个示例数组:

var arrDiag1 = new double[10] { 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5 };
var arrDiag2 = new double[10] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
var arrHyperbole = new double[10] { 9, 8, 7, 6, 5, 4, 3, 4, 5, 6 };

我尝试根据沙漠练习中的直线进行某种计算,但结果并不理想。 谁有更好的主意?

感谢帮助

更新

在 dasblinkenlight 的帮助下,我设法找到了这个方法:

    private double BinarySearchMin(double[] arr, int left, int leftMiddle, int rightMiddle, int right)
    {
        if (left == right)
            return arr[left];

        if (arr[leftMiddle] < arr[rightMiddle])
        {
            right = rightMiddle;
            leftMiddle = ((right - left) / 3);
            rightMiddle = ((right - left) / 3 * 2);
            return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
        }
        if (arr[leftMiddle] > arr[rightMiddle])
        {
            left = leftMiddle;
            leftMiddle = ((right - left) / 3) + left;
            rightMiddle = ((right - left) / 3 * 2) + left;
            return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
        }
        if (arr[leftMiddle] == arr[rightMiddle])
        {
            left = leftMiddle;
            right = rightMiddle;
            leftMiddle = ((right - left) / 3) + left;
            rightMiddle = ((right - left) / 3 * 2) + left;
            return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
        }
        return -1;
    }

在第一个数组中有效,但在第二个和第三个数组中无效。 我在这里缺少什么?

最佳答案

如果函数只有一个最小值,使用Ternary Search :

ternary search algorithm is a technique for finding the minimum or maximum of a unimodal function.

想法是将范围分成三个相等的部分,探测两个搜索点,然后“拉入”包含最小值的那个。假设搜索点 i1 位于区间左侧,i2 位于区间右侧:

  • 如果f[i1] < f[i2],则最小值在0到i2之间;从右侧拉入
  • 如果f[i1] > f[i2],则最小值在i1和N之间;从左边拉进来
  • 如果f[i1] == f[i2],则最小值在i1和i2之间;从两侧拉入。

算法的运行时间为O(log N)。

关于C# 计算每个给定范围的函数最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473711/

相关文章:

c# - 在 C# 中将本地用户添加到本地组

c - c中的字符串文字

c++ - C++ 中的连通分量标记

c++ - 查找有向图中从根到所有顶点的给定长度的所有路径

c# - .net 程序中的 self 更新?

c# - 从后面的代码生成 html

c# - 监控应用程序内存使用情况的正确方法是什么?

php - 搜索具有开始和结束持续时间(以秒为单位)的数组(视频)以查找完整长度的视频

javascript - Jquery检查数组是否包含子字符串

graph-theory - 出队时将节点标记为在 BFS 上访问过