【问题标题】:binary search on a array with a string prefix对带有字符串前缀的数组进行二分搜索
【发布时间】:2012-03-20 14:15:29
【问题描述】:

如何使用二进制搜索将包含特定字符串前缀的已排序数组的元素添加到数组列表中,并将这些元素作为它们在数组中出现的顺序添加到数组列表中。

编码并不难,但我在使用二分搜索时遇到了困难。要使用 String 类提供的字符串前缀,请以开头。我只需要帮助来开始二分搜索

public static <T extends Comparable<T>> ArrayList prefixMatch(T[] list,
            String prefix) {

}

【问题讨论】:

  • 也许您可以稍微澄清一下您的问题...也许还可以添加一个示例,说明您要实现的输入和输出是什么?
  • 我添加了要完成的方法,这不是一种审查。即使有通用的 T[] 列表,数组也会是 String [] 因为我必须使用二进制搜索来查找元素在那个以特定前缀开头的数组中..

标签: java string binary-search


【解决方案1】:

我有一个类似的要求 - 给定字符串数组查找每个以新字母开头的字符串的索引,即对于 Africa Angela Beach Bamboo Zorro,我需要返回 [ 0, 2, 4 ] 的算法

我发现对众所周知的二分搜索算法进行了修改,该算法使用“延迟相等测试”,这具有找到确切需要的索引的副作用 - 开始范围的索引。

您可以在this Wikipedia article 中阅读有关它的信息(还有一个非常简单的示例,我根据它实现了自己的示例)。

【讨论】:

    【解决方案2】:

    使用 API 中的 binarySearch 方法。

    String[] objString = {"a","b","c"};  
    System.out.println(Arrays.binarySearch(objString,"c")); 
    

    或者,如果您想创建自己的二进制搜索实现。在这里。

    /* BinarySearch.java */
    public class BinarySearch {
            public static final int NOT_FOUND = -1;
    
            public static int search(int[] arr, int searchValue) {
                    int left = 0;
                    int right = arr.length - 1;
                    return binarySearch(arr, searchValue, left, right);
            }
    
            private static int binarySearch(int[] arr, int searchValue, int left, int right) {
                    if (right < left) {
                            return NOT_FOUND;
                    }
                    /* 
                    int mid = mid = (left + right) / 2;
                    There is a bug in the above line;
                    Joshua Bloch suggests the following replacement:
                    */
                    int mid = (left + right) >>> 1;
                    if (searchValue > arr[mid]) {
                            return binarySearch(arr, searchValue, mid + 1, right);
                    } else if (searchValue < arr[mid]) {
                            return binarySearch(arr, searchValue, left, mid - 1);
                    } else {
                            return mid;
                    }               
            }
    }
    public class BinarySearchTest {
    
            public static void main(String[] args) {
                    int[] arr = {1, 5, 2, 7, 9, 5};
                    Arrays.sort(arr);
                    System.out.println(BinarySearch.search(arr, 2));
            }
    }
    

    【讨论】:

    • 感谢您的帮助,我非常感谢,但我需要对已排序的通用数组(在本例中为字符串)实现二进制搜索。然后将开头或包含特定前缀的元素添加到数组列表中,因为它们出现在原始通用数组中
    • API 有binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator&lt;? super T&gt; c) 方法。您可以创建一个比较器并将其传递给仅比较前缀。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多