Тернарный поиск
Опубликовано: 14 Января, 2022
Тернарный поиск - это алгоритм «разделяй и властвуй», который можно использовать для поиска элемента в массиве. Это похоже на двоичный поиск, когда мы делим массив на две части, но в этом алгоритме мы делим данный массив на три части и определяем, в какой из них есть ключ (искомый элемент). Мы можем разделить массив на три части, взяв mid1 и mid2, которые можно вычислить, как показано ниже. Первоначально l и r будут равны 0 и n-1 соответственно, где n - длина массива.
mid1 = l + (r-l)/3
mid2 = r – (r-l)/3
Примечание. Для выполнения троичного поиска в массиве необходимо выполнить сортировку.
Шаги для выполнения троичного поиска:
- Сначала мы сравниваем ключ с элементом mid1. Если найдено равное, мы возвращаем mid1.
- Если нет, то мы сравниваем ключ с элементом mid2. Если найдено равное, мы возвращаем mid2.
- Если нет, то мы проверяем, меньше ли ключ, чем элемент mid1. Если да, то вернемся к первой части.
- Если нет, то мы проверяем, больше ли ключ, чем элемент mid2. Если да, то вернемся к третьей части.
- Если нет, то возвращаемся ко второй (средней) части.
Пример:
Recursive Implementation of Ternary Search
C++
// C++ program to illustrate // recursive approach to ternary search #include <bits/stdc++.h> using namespace std; // Function to perform Ternary Search int ternarySearch( int l, int r, int key, int ar[]) { if (r >= l) { // Find the mid1 and mid2 int mid1 = l + (r - l) / 3; int mid2 = r - (r - l) / 3; // Check if key is present at any mid if (ar[mid1] == key) { return mid1; } if (ar[mid2] == key) { return mid2; } // Since key is not present at mid, // check in which region it is present // then repeat the Search operation // in that region if (key < ar[mid1]) { // The key lies in between l and mid1 return ternarySearch(l, mid1 - 1, key, ar); } else if (key > ar[mid2]) { // The key lies in between mid2 and r return ternarySearch(mid2 + 1, r, key, ar); } else { // The key lies in between mid1 and mid2 return ternarySearch(mid1 + 1, mid2 - 1, key, ar); } } // Key not found return -1; } // Driver code int main() { int l, r, p, key; // Get the array // Sort the array if not sorted int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Starting index l = 0; // length of array r = 9; // Checking for 5 // Key to be searched in the array key = 5; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result cout << "Index of " << key << " is " << p << endl; // Checking for 50 // Key to be searched in the array key = 50; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result cout << "Index of " << key << " is " << p << endl; } // This code is contributed // by Akanksha_Rai |
C
// C program to illustrate // recursive approach to ternary search #include <stdio.h> // Function to perform Ternary Search int ternarySearch( int l, int r, int key, int ar[]) { if (r >= l) { // Find the mid1 and mid2 int mid1 = l + (r - l) / 3; int mid2 = r - (r - l) / 3; // Check if key is present at any mid if (ar[mid1] == key) { return mid1; } if (ar[mid2] == key) { return mid2; } // Since key is not present at mid, // check in which region it is present // then repeat the Search operation // in that region if (key < ar[mid1]) { // The key lies in between l and mid1 return ternarySearch(l, mid1 - 1, key, ar); } else if (key > ar[mid2]) { // The key lies in between mid2 and r return ternarySearch(mid2 + 1, r, key, ar); } else { // The key lies in between mid1 and mid2 return ternarySearch(mid1 + 1, mid2 - 1, key, ar); } } // Key not found return -1; } // Driver code int main() { int l, r, p, key; // Get the array // Sort the array if not sorted int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Starting index l = 0; // length of array r = 9; // Checking for 5 // Key to be searched in the array key = 5; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result printf ( "Index of %d is %d
" , key, p); // Checking for 50 // Key to be searched in the array key = 50; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result printf ( "Index of %d is %d" , key, p); } |
Java
// Java program to illustrate // recursive approach to ternary search class GFG { // Function to perform Ternary Search static int ternarySearch( int l, int r, int key, int ar[]) { if (r >= l) { // Find the mid1 and mid2 int mid1 = l + (r - l) / 3 ; int mid2 = r - (r - l) / 3 ; // Check if key is present at any mid if (ar[mid1] == key) { return mid1; } if (ar[mid2] == key) { return mid2; } // Since key is not present at mid, // check in which region it is present // then repeat the Search operation // in that region if (key < ar[mid1]) { // The key lies in between l and mid1 return ternarySearch(l, mid1 - 1 , key, ar); } else if (key > ar[mid2]) { // The key lies in between mid2 and r return ternarySearch(mid2 + 1 , r, key, ar); } else { // The key lies in between mid1 and mid2 return ternarySearch(mid1 + 1 , mid2 - 1 , key, ar); } } // Key not found return - 1 ; } // Driver code public static void main(String args[]) { int l, r, p, key; // Get the array // Sort the array if not sorted int ar[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; // Starting index l = 0 ; // length of array r = 9 ; // Checking for 5 // Key to be searched in the array key = 5 ; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result System.out.println( "Index of " + key + " is " + p); // Checking for 50 // Key to be searched in the array key = 50 ; // Search the key using ternarySearch p = ternarySearch(l, r, key, ar); // Print the result System.out.println( "Index of " + key + " is " + p); } } |
Python3
# Python3 program to illustrate # recursive approach to ternary search import math as mt # Function to perform Ternary Search def ternarySearch(l, r, key, ar): if (r > = l): # Find the mid1 and mid2 mid1 = l + (r - l) / / 3 mid2 = r - (r - l) / / 3 # Check if key is present at any mid if (ar[mid1] = = key): return mid1 if (ar[mid2] = = key): return mid2 # Since key is not present at mid, # check in which region it is present # then repeat the Search operation # in that region if (key < ar[mid1]): # The key lies in between l and mid1 return ternarySearch(l, mid1 - 1 , key, ar) elif (key > ar[mid2]): # The key lies in between mid2 and r return ternarySearch(mid2 + 1 , r, key, ar) else : # The key lies in between mid1 and mid2 return ternarySearch(mid1 + 1 , mid2 - 1 , key, ar) # Key not found return - 1 # Driver code l, r, p = 0 , 9 , 5 # Get the array # Sort the array if not sorted ar = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] # Starting index l = 0 # length of array r = 9 # Checking for 5 # Key to be searched in the array key = 5 # Search the key using ternarySearch p = ternarySearch(l, r, key, ar) # Print the result print ( "Index of" , key, "is" , p) # Checking for 50 # Key to be searched in the array key = 50 # Search the key using ternarySearch p = ternarySearch(l, r, key, ar) # Print the result print ( "Index of" , key, "is" , p) # This code is contributed by # Mohit kumar 29 |
C#
// CSharp program to illustrate // recursive approach to ternary search using System; class GFG { // Function to perform Ternary Search static int ternarySearch( int l, int r, int key, int [] ar) { if (r >= l) { // Find the mid1 and mid2 int mid1 = l + (r - l) / 3; int mid2 = r - (r - l) / 3; // Check if key is present at any mid if (ar[mid1] == key) { return mid1; } if (ar[mid2] == key) { return mid2; } // Since key is not present at mid, // check in which region it is present // then repeat the Search operation // in that region if (key < ar[mid1]) { // The key lies in between l and mid1 return ternarySearch(l, mid1 - 1, key, ar); } else if (key > ar[mid2]) { // The key lies in between mid2 and r return ternarySearch(mid2 + 1, r, key, ar); } else { // The key lies in between mid1 and mid2 return ternarySearch(mid1 + 1, mid2 - 1, key, ar); } } // Key not found return -1; } // Driver code public static void Main() { int l, r, p, key; // Get the array // Sort the array if not sorted РЕКОМЕНДУЕМЫЕ СТАТЬИ |