C#计算每个给定范围的函数min

时间:2017-02-26 20:16:06

标签: 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;
    }

在第一个数组中它可以工作但不在第二个和第三个数组中。 我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

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

  

三元搜索算法是一种用于查找单峰函数的最小值或最大值的技术。

我们的想法是将范围分成三个相等的段,在两个搜索点进行探测,然后“拉入”包含最小值的那个。假设区间左侧的搜索点i1和右侧的i2

  • 如果f [i1]&lt; f [i2],则最小值介于0和i2之间;从右边拉进来
  • 如果f [i1]> f [i2],则最小值在i1和N之间;从左边拉进来
  • 如果f [i1] == f [i2],则最小值在i1和i2之间;从两边拉进来。

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

答案 1 :(得分:1)

我通常讨厌回答家庭作业问题,但我有点喜欢这个问题。

首先,想想两个&#34;对角线&#34;没有什么特别的情况,只是对夸张的不同观点,其中最小值恰好在边缘。

然后,尝试使用二分查找来找到最小值。看看这两个中间元素,看看它们之间的关系,并决定最小值。重复,直到只剩下一个元素。