【问题标题】:Binary Search of String within a linked list链表中字符串的二分查找
【发布时间】:2015-08-10 19:48:59
【问题描述】:

我需要对具有各种数据类型的链表执行二进制搜索。下面的代码将无法编译。我似乎无法让 compareTo() 工作。

这里是链表类:

public class Contributor {

private String firstName;
private String lastName;
private String country;
private String phone;
private double contribution;
private int id;}

二分查找方法如下。搜索需要使用二分法查找某个姓氏。

 public void binarySearch(List<Contributor> l, String key) {
    System.out.println("Binary search.");

    int upperBound = l.size();
    int lowerBound = 1;
    int midpoint = (upperBound + lowerBound) / 2;
    int difference = upperBound - lowerBound;

    for (int i = 0; i < l.size(); i++) {
        if (key.compareTo(l.get(midpoint - 1))&& difference != 1) {
            upperBound = midpoint - 1;
            midpoint = upperBound / 2;
        } else if (key.compareTo(l.get(midpoint - 1)) && difference != 1) {
            lowerBound = midpoint + 1;
            midpoint = (lowerBound + upperBound) / 2;

        } else if (key.equals(l.get(midpoint - 1))) {
            midpoint = midpoint - 1;

            System.out.println("We found " + key + " at position " + midpoint + " in the list.");
            i = l.size();
        } else {
            System.out.println("We couldn't find " + key + " in the list.");
            i = l.size();
        }
    }
}

【问题讨论】:

  • 请注意,这将非常低效——O(n log n),而不是 O(log n)。这是因为链表几乎按照定义是非常低效的。
  • 您的问题是什么?还是问题??

标签: java search binary


【解决方案1】:

这里有一个逻辑错误 - 正如 Akshay 所说,您的密钥是 String,因此在 Contibutors 的列表中搜索它没有意义 - 您需要搜索 @987654323 @。

除此之外,二分搜索的前提条件是列表已排序,这要求您的 Contributor 对象为 Comparable(或至少您提供 Comparator

我已修改您的代码以解决这些问题:

class Contributor implements Comparable<Contributor>{

    private String firstName;
    private String lastName;
    private String country;
    private String phone;
    private double contribution;
    private int id;

    public int compareTo(Contributor o) {
        return Integer.valueOf(id).compareTo(o.id);
    }
}

public class BinarySearch {
    /**
     * Performs a binary search for <code>key</code> in the list <code>l</code>.
     * 
     * @param l Ordered list of Contributors.
     * @param key Value to search for.
     */
    public void binarySearch(List<Contributor> l, Contributor key) {
        System.out.println("Binary search.");

        int upperBound = l.size();
        int lowerBound = 1;
        int midpoint = (upperBound + lowerBound) / 2;
        int difference = upperBound - lowerBound;

        for (int i = 0; i < l.size(); i++) {
            if (key.compareTo(l.get(midpoint - 1)) <0 ) {
                upperBound = midpoint - 1;
                midpoint = upperBound / 2;
            } else if (key.compareTo(l.get(midpoint - 1))>0 ) {
                lowerBound = midpoint + 1;
                midpoint = (lowerBound + upperBound) / 2;

            } else if (key.equals(l.get(midpoint - 1))) {
                midpoint = midpoint - 1;

                System.out.println("We found " + key + " at position "
                        + midpoint + " in the list.");
                i = l.size();
            } else {
                System.out.println("We couldn't find " + key + " in the list.");
                i = l.size();
            }
        }
    }
}

这应该可以修复您的编译错误,尽管正如其他人所指出的,搜索逻辑本身存在一些错误。还请注意binarySearch 方法的前提条件是列表是有序的,并且应该记录此要求。我添加了一个 javadoc 注释来解释这一点。

【讨论】:

    【解决方案2】:

    通过查看您的代码 l.get(midpoint-1) 返回 Contributor 对象而不是 String,并且 key.compareTo 方法只能接受 String 类型的参数。

    【讨论】:

      【解决方案3】:

      compareTo() 函数返回整数值。所以试试

      if(key.compareTo(str) < 0)
      

      if(key.compareTo(str) > 0)
      

      if(key.compareTo(str) == 0)
      

      还将它与来自 Contributor 类的 String 进行比较,而不是与该类本身进行比较。那是

      if(key.compareTo((l.get(midpoint - 1)).firstName)<0)
      

      另一个逻辑错误是当你这样做时

      midpoint = upperBound / 2;
      

      您假设lowerbound1。但它的值可能会在迭代中发生变化。所以也考虑一下

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 2011-02-02
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 2019-03-01
        相关资源
        最近更新 更多