c# - 如何修复代码以便 C# 中的斐波那契搜索算法正常​​工作

标签 c# algorithm .net-core visual-studio-2017 fibonacci

代码并不总能找到索引。

我正尝试在 C# 中实现斐波那契搜索算法。有时算法找不到数组中的元素。我编写了单元测试来检查代码覆盖率,发现我的代码没有达到 10%。我还检查了其他实现。我认为问题出在这部分:

if (GetFibonacciNumberOnIndex(index - 1) == 1 && hayStack[offset + 1] == needle)
                return offset + 1;

但从逻辑上讲,这应该在剩下最后一个元素时运行。

    public static int FibSearch(int[] hayStack, int needle)
    {
        if (hayStack == null)
        {
            throw new ArgumentNullException(nameof(hayStack), "The array containing values to search in mustn't be null");
        }

        if (hayStack.Length == 0)
        {
            return -1;
        }

        int index = 0;

        while (GetFibonacciNumberOnIndex(index) < hayStack.Length)
            index++;

        int offset = -1;

        while (GetFibonacciNumberOnIndex(index) > 1)
        {
            int i = Math.Min(offset + GetFibonacciNumberOnIndex(index - 2), hayStack.Length - 1);

            if (needle < hayStack[i])
                index -= 2;
            else if (needle > hayStack[i])
            {
                index--;
                offset = i;
            }
            else
                return i;               
        }

        if (GetFibonacciNumberOnIndex(index - 1) == needle && hayStack[offset + 1] == needle)
            return offset + 1;

        return -404;
    }


    private static int GetFibonacciNumberOnIndex(int index)
    {
        if (index < 1)
            return 0;
        else if (index == 1)
            return 1;

        int first = 0;
        int second = 1;
        int tmp = 0;

        for (int i = 0; i < index; i++)
        {
            tmp = first;
            first = second;
            second = tmp + second;
        }

        return first;
    }
}

我有一个包含 1000000 个数字的文件。我正在读取文件并将内容转换为整数数组。最后我正在搜索一个数字,知道该数字在数组中,但算法返回 -404。我在整数数组上使用 Linq 扩展方法验证了该数字在数组中。

最佳答案

我用二进制搜索创建了一个小样本。使用 Fabonacci 搜索没有优势。您可以使用流阅读器一次添加一个整数,它们将同时添加和排序。

public class NumIndex:IComparable<NumIndex>
        {
            public int Number { get; set; }
            public int Index { get; set; }

            public int CompareTo(NumIndex other)
            {
                return this.Number.CompareTo(other.Number);
            }

        }

        public static void Main(string[] args)
        {
            int[] nums = { 8, 4, 8, 1, 6, 3, 4, 32, 43, 5, 8, 95 };

            List<NumIndex> intArray = new List<NumIndex>();
            int i = 0;
            foreach (int num in nums)
            {
                NumIndex newNum = new NumIndex() { Number = num, Index = i++ };
                int index = intArray.BinarySearch(newNum);
                if (index > -1)
                {
                    //Item already found, you decide what to do with it, I added all numbers
                }
                else index = ~index;

                intArray.Insert(index, newNum);
            }

            NumIndex dummy = new NumIndex() { Number = 18, Index = 0 };

            int findItemIndex = intArray.BinarySearch(dummy);
            if (findItemIndex < -1) throw new Exception("Item not found");
            int itemIndex = intArray[].Index;
        }

关于c# - 如何修复代码以便 C# 中的斐波那契搜索算法正常​​工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037466/

相关文章:

algorithm - 图论:在锦标赛图中寻找获胜者的算法(如果有的话)

c# - .NET Core 中HttpContext TraceIdentifier 是如何生成的?

c# - Azure 认知搜索 - 如何使用 & 等保留字符进行搜索

c# - 在 C# 中访问 Azure 中系统管理标识的应用程序 ID

c# - Xamarin iOS绑定(bind)类别类方法

c# - 如何将变量从Windows应用程序传递到asp网站?

algorithm - 有没有一种通用的方法可以将明确的上下文无关文法转换为 LALR(1) 文法?

algorithm - 在有向图上具有负边的 Dijkstra 算法

node.js - 如何将 Angular 2 应用程序与 .net core 连接

c# - 亚音速 3 ActiveRecord 删除/销毁抛出奇怪的异常