【问题标题】:How do i fix my c# binary search algorithm?如何修复我的 c# 二进制搜索算法?
【发布时间】:2019-04-23 14:21:05
【问题描述】:

我正在尝试在我的程序中实现二进制搜索算法,但它似乎不起作用。

这是我的代码:

public static void Search(float[] array, float key)
    {
        int min = 0; 
        int max = array.Length - 1;
        int mid = 0;

        do
        {
            mid = (min + max) / 2;

            if (key > array[mid])
            {
                min = mid + 1; 
            }

            if (key < array[mid])
            {
                max = mid - 1; 
            }

            if (key == array[mid])
                Console.WriteLine($"The item, {key} was found at index {mid} of the array");
        } while (min <= max);

(我正在使用的数组已排序) 我只是得到一个空白控制台,它似乎永远找不到结果。 我该怎么做才能解决它?

谢谢

更新: 我已经从一个 txt 文件创建了 float[],如下所示:

float[] floats = (File.ReadAllLines(@"floats.txt")).Where(s => s != String.Empty).Select(s => float.Parse(s)).ToArray();

Here's the contents of floats.txt (link to pastebin)

这是用于测试算法是否有效的行:

Search(floats, -2.4439f);

(另外,我在尝试搜索之前对数组进行了排序)

【问题讨论】:

  • 你的数组是什么样子的,关键是什么?数组中可能不存在键。
  • 你的输入数组排序了吗?
  • 比较浮点数可能很棘手,您确定确切的键在数组中,而不是非常接近的东西。代替 ==,您可以尝试诸如 Math.Abs​​(key - array[mid])
  • 如果内置的Array.BinarySearch(array, key) 也找不到它,可能是浮点问题。

标签: c# binary-search


【解决方案1】:

使用您提供的输入文件,这段代码实际上对我有用。我的猜测是您没有先对数组进行排序:

    static void Main(string[] args)
    {
        // Read in floats from input file
        var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "input.txt"));
        var floats = new List<float>();
        foreach (var l in lines)
        {
            if (float.TryParse(l, out var result))
            {
                floats.Add(result);
            }
        }

        var array = floats.OrderBy(f => f).ToArray();
        float key = -2.4439f;

        Search(array, key);
    }

    public static void Search(float[] array, float key)
    {
        int min = 0;
        int max = array.Length - 1;
        int mid = 0;

        do
        {
            mid = (min + max) / 2;

            if (key > array[mid])
            {
                min = mid + 1;
            }

            if (key < array[mid])
            {
                max = mid - 1;
            }

            Console.WriteLine($"Checking {array[mid]}");
            if (key == array[mid])
            {
                Console.WriteLine($"The item, {key} was found at index {mid} of the array");
                break;
            }
        } while (min <= max);
    }

这是输出:

The item, -2.4439 was found at index 146 of the array  

【讨论】:

  • 我也是第一个排序的,但是收到一个黑色的控制台
  • 运行我的代码,它可以工作。您只需要单步调试您的代码并对其进行调试。也许将 floats[] 数组与我的数组进行比较?您如何对示例中的浮点数组进行排序?
【解决方案2】:

二分搜索是递归函数的完美候选者。 也许你可以尝试这样的事情:

public static void Search(float[] array, float key, int? min = null, int? max = null)
    {
        if (!min.HasValue)
        {
            min = 0;
        }
        if (!max.HasValue)
        {
            max = array.Length - 1;
        }

        Console.WriteLine(string.Format("Searching from {0} to {1}", min.Value, max.Value));

        if (min.Value >= max.Value)
        {
            if (array[min.Value] == key)
            {
                Console.WriteLine(string.Format("The item, {0} was found at index {1} of the array", key, min.Value));
            }
        }
        else
        {
            int mid = (max.Value - min.Value) / 2;
            if (mid < 1)
            {
                mid = 1;
            }
            Search(array, key, min, min.Value + mid - 1);
            Search(array, key, min.Value + mid, max);
        }
    }

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多