【问题标题】:What is the Sherwood binary search algorithm in Java?Java中的舍伍德二分搜索算法是什么?
【发布时间】:2014-09-16 18:39:42
【问题描述】:

我周一参加了 Java 编程的期末考试并通过了。我今天刚拿到分级硬拷贝,我的导师说我应该使用舍伍德二进制搜索算法而不是常规的二进制搜索。有人有这个算法的模板吗?我曾尝试在网上搜索它,但仅了解它的含义,而不是实际的模板或副本的副本,因此我可以运行它。

感谢死灵法师,我让它工作了,看看他为什么想要它。

【问题讨论】:

  • +1 向我介绍了舍伍德二分搜索的概念 :)
  • 阅读更多:books.google.com/…
  • 恭喜它开始工作并发布您的代码,并且在您的测试之后搞定它。一个+! :D
  • @EJP 跳过课程的某些部分很容易。病假,学习另一门课程,或者就我而言,只是懒惰或听了非常无聊的讲座,会导致我不学习或不费心去学习我认为不重要的课程的某些部分。有时欣赏会在以后出现。无论 OP 的原因是什么,我都会赞扬 OP 在一天结束时对学习的热情。 :)
  • @EJP 等待,减少最坏情况的运行时间?这听起来不对。在输入错误和随机选择的情况下,这在我看来可能会退化为线性时间。你的意思是不是正好相反?

标签: java algorithm search binary-search


【解决方案1】:

Sherwood 算法是标准二分搜索的修改版本。在搜索算法中,总是存在可能发生的最佳情况和最坏情况。 在执行二分搜索时,总会有一些位置需要失败才能被检查。失败检查的数量会因您搜索的元素数量而有很大差异。

这些失败背后的原因是由于二进制搜索的核心语句是:

中间=(第一个+最后一个)/2;

在 Sherwood 算法中,标准结构被随机性的概念所取代。 Sherwood 算法背后的核心语句是:

middle = first + rand.nextInt(last - first + 1);

如果您使用 Sherwood 算法搜索包含 1000 个元素的列表,它会选择中间作为第 250 个元素。您正在搜索的值可能是

概念是舍伍德算法将减少最坏情况的时间,但增加最好情况的时间。

这并不是说它比二分查找更好,而只是展示了另一种完成它的方式。我相信这就是我教授的意思背后的原因,因为在他的课堂上,他喜欢看到我们跳出框框思考并展示多种方法来获得一个解决方案。您应该始终拥有多条路径,以防一条路径被阻塞。

public static void sherwoodSearch(int[ ] array, int value)
    {
        int first, last, middle, position, count;
        boolean found;

        //set the inital values.
        first = 0;
        last = array.length-1;
        position = -1;
        found = false;
        count =1;
        Random rand = new Random();
        //search for the value
        while (!found && first <= last)
        {
            count++;
            middle = first + rand.nextInt(last - first + 1);
            if (array[middle] == value)
            {
                found = true;
                position = middle;
            }
            else if (array[middle] > value)
                last = middle -1;
            else
                first = middle + 1;
            if (first <= last)
            {
                System.out.println("The number was found in array subscript" + position);
                System.out.println("The sherwood search found the number after " + count +
                    " comparisons.");

            }
            else
                System.out.println("Sorry, the number is not in this array.  The sherwood search made "
                    +count  + " comparisons.");
        }
    }

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2012-02-09
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2014-05-25
    • 2014-02-03
    相关资源
    最近更新 更多