📜  对字符串进行二进制搜索

📅  最后修改于: 2022-05-13 01:57:07.957000             🧑  作者: Mango

对字符串进行二进制搜索

给定一个已排序的字符串数组和一个字符串 x,如果 x 存在于数组中,则找到它的索引。

例子:

Input :  arr[] = {"contribute", "geeks", "ide", "practice"}, x = "ide"
Output :  2
The String x is present at index 2.

Input :  arr[] = {"contribute", "geeks", "ide", "practice"}, x = "zz"
Output :  -1
The String "zz" is not present. 

先决条件:二分查找、 Java中的字符串比较
这个想法是将 x 与给定数组中的中间字符串进行比较。如果匹配,则返回mid,否则如果小于mid,则在左半部分搜索,否则在右半部分搜索。

C++
// CPP program to implement Binary Search for strings
#include
using namespace std;
 
    // Returns index of x if it is present in arr[],
    // else return -1
    int binarySearch(string arr[], string x,int n)
    {
        int l = 0 ;
        int r = n - 1;
        while (l <= r)
        {
            int m = l + (r - l) / 2;
 
        int res = -1000;   //some random value assigned because if res is already 0 then
                             //it will always return 0    
        if (x == (arr[m]))
            res = 0;
             
 
            // Check if x is present at mid
            if (res == 0)
                return m;
 
            // If x greater, ignore left half
            if (x > (arr[m]))
                l = m + 1;
 
            // If x is smaller, ignore right half
            else
                r = m - 1;
        }
 
        return -1;
    }
 
    // Driver code
    int main()
    {
        string arr[] = { "contribute", "geeks", "ide", "practice"};
        string x = "ide";
        int n = 4;
        int result = binarySearch(arr, x,n);
 
        if (result == -1)
            cout << ("Element not present");
        else
            cout << ("Element found at index ") << result;
    }
     
// This code is contributed by
// Shashank_Sharma


Java
// Java program to implement Binary Search for strings
class GFG {
 
    // Returns index of x if it is present in arr[],
    // else return -1
    static int binarySearch(String[] arr, String x)
    {
        int l = 0, r = arr.length - 1;
        while (l <= r) {
            int m = l + (r - l) / 2;
 
            int res = x.compareTo(arr[m]);
 
            // Check if x is present at mid
            if (res == 0)
                return m;
 
            // If x greater, ignore left half
            if (res > 0)
                l = m + 1;
 
            // If x is smaller, ignore right half
            else
                r = m - 1;
        }
 
        return -1;
    }
 
    // Driver method to test above
    public static void main(String []args)
    {
        String[] arr = { "contribute", "geeks", "ide", "practice"};
        String x = "ide";
        int result = binarySearch(arr, x);
 
        if (result == -1)
            System.out.println("Element not present");
        else
            System.out.println("Element found at "
                              + "index " + result);
    }
}


Python3
# Python3 program to implement Binary
# Search for strings
 
# Returns index of x if it is present
# in arr[], else return -1
def binarySearch(arr, x):
    l = 0
    r = len(arr)
    while (l <= r):
        m = l + ((r - l) // 2)
 
        res = (x == arr[m])
 
        # Check if x is present at mid
        if (res == 0):
            return m - 1
 
        # If x greater, ignore left half
        if (res > 0):
            l = m + 1
 
        # If x is smaller, ignore right half
        else:
            r = m - 1
 
    return -1
 
# Driver Code
if __name__ == "__main__":
 
    arr = ["contribute", "geeks",
               "ide", "practice"];
    x = "ide"
    result = binarySearch(arr, x)
 
    if (result == -1):
        print("Element not present")
    else:
        print("Element found at index" ,
                                 result)
 
# This code is contributed by ita_c


C#
// C# program to implement Binary Search for strings
 
using System;
 
class GFG {
 
    // Returns index of x if it is present in arr[],
    // else return -1
    static int binarySearch(String[] arr, String x)
    {
        int l = 0, r = arr.Length - 1;
        while (l <= r) {
            int m = l + (r - l) / 2;
 
            int res = x.CompareTo(arr[m]);
 
            // Check if x is present at mid
            if (res == 0)
                return m;
 
            // If x greater, ignore left half
            if (res > 0)
                l = m + 1;
 
            // If x is smaller, ignore right half
            else
                r = m - 1;
        }
 
        return -1;
    }
 
    // Driver method to test above
    public static void Main(String []args)
    {
        String[] arr = { "contribute", "geeks", "ide", "practice"};
        String x = "ide";
        int result = binarySearch(arr, x);
 
        if (result == -1)
            Console.WriteLine("Element not present");
        else
            Console.WriteLine("Element found at "
                            + "index " + result);
    }
// This code is contributed by Ryuga
}


PHP
 0)
            $l = $m + 1;
 
        // If x is smaller, ignore right half
        else
            $r = $m - 1;
    }
 
    return -1;
}
 
// Driver Code
$arr = array("contribute", "geeks",
                "ide", "practice");
$x = "ide";
$result = binarySearch($arr, $x);
 
if ($result == -1)
    print("Element not present");
else
    print("Element found at index " .
                            $result);
 
// This code is contributed by mits
?>


Javascript


输出:
Element found at index 2