【问题标题】:Binary search on an ordered linked list有序链表的二分查找
【发布时间】:2014-11-05 18:18:19
【问题描述】:

我需要一些帮助,将二进制搜索方法添加到有序链表中。这是我到目前为止的代码,但我被困在这部分。我很困惑如何获取使用 insert 方法添加的值,然后搜索它,然后说出元素的位置。这是我到目前为止的程序:

import java.util.LinkedList;

class List {
    public List next;
    public List previous;
    public long data;

    public Link(long d) {
        data = d;
    }

    public void displayLink() {
        System.out.print(data + " ");
    }
}

class OLinkList {

    private LinkedList first;
    private LinkedList last;

    public OLinkList() {
        first = null;
        last = null;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public void insert(long num) {
        List newLink = new List(num);

        if (first == null) {
            first = newLink;
            last = newLink;
        } else {
            last.next = newLink;
            last = newLink;
        }
    }
}

现在,我了解了二分搜索的工作原理。我怎样才能把这样的东西应用到我拥有的代码中?

public int binarySearch(int[] a, int x) {
      int low = 0;
      int high = a.length - 1;
      while (low <= high) {
         int mid = (low + high)/2;
         if (a[mid] == x) return mid;
         else if (a[mid] < x) low = mid + 1;
         else high = mid - 1;
      }
      return -1;
   }

【问题讨论】:

  • 请注意,二进制搜索需要随机访问任意元素才能有效。在链表中情况并非如此。
  • 在听取 Joey 的建议后,将您的 List 转换为数组(使用 .toArray LinkedList 方法)。使用默认的 Java binarySearch 方法 Arrays.binarySearch(请参阅:docs.oracle.com/javase/7/docs/api/java/util/Arrays.html)。注意:由于在列表上调用 toArray 需要 O(n) 这只有在之后执行多个查询时才有意义。
  • 我不明白你的链表是如何排序的

标签: java binary-search


【解决方案1】:

您最好使用数组或使用或实现自己的 TreeSet 类。使用数组,您将能够使用您已经拥有的算法更好。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2016-02-29
    • 2021-08-15
    • 1970-01-01
    • 2011-12-25
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多