3

我在 Java 中有一个排序的字符串数组。我试图在该数组中找到以用户指定的字符串开头的第一个元素。我一开始以为是二分查找,但它找到的是相等的字符串,而不是以用户指定的字符串开头的字符串。我应该如何修改二进制搜索,以便我可以实现我想做的事情?

4

1 回答 1

6

如果元素不存在,二分搜索可以找到“小于所需元素的最后一个元素”(有时称为“应该插入它的索引”)。

通过使用此功能进行二进制搜索,您可以找到一个元素并检查:

  1. 如果它是确切的元素 - 那么它是数组中具有此前缀的第一个元素,因为它是具有此前缀的“最小”元素,你就完成了。
  2. 如果它不是同一个元素 - 通过增加一个 - 你会得到“比所需元素更大的最小元素”。此元素是数组中带有此前缀的第一个元素(如果数组有前缀)。

这个功能很常见——例如它存在于 java 的Arrays.binarySearch(). 从javadocs:

返回: 搜索键的索引,如果它包含在数组中;否则,(-(插入点)- 1)。插入点定义为键将插入数组的点:第一个元素的索引大于键

从刚刚找到的索引中,很容易找到想要的元素。

代码快照:

String[] arr = { "aa" , "bb","c", "cc" , "ccc", "cccc", "ddD" };
int idx = Arrays.binarySearch(arr, "c");
if (idx < 0) 
    System.out.println(arr[-1 * idx - 1]);
else System.out.println(arr[idx]);
于 2012-10-21T11:43:39.840 回答