Тернарный поиск
Опубликовано: 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 Searchint 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 codeint 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 Searchint 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 codeint 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 searchclass 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 searchimport math as mt# Function to perform Ternary Searchdef 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 codel, r, p = 0, 9, 5# Get the array# Sort the array if not sortedar = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]# Starting indexl = 0# length of arrayr = 9# Checking for 5# Key to be searched in the arraykey = 5# Search the key using ternarySearchp = ternarySearch(l, r, key, ar)# Print the resultprint("Index of", key, "is", p)# Checking for 50# Key to be searched in the arraykey = 50# Search the key using ternarySearchp = ternarySearch(l, r, key, ar)# Print the resultprint("Index of", key, "is", p)# This code is contributed by# Mohit kumar 29 |
C#
// CSharp program to illustrate// recursive approach to ternary searchusing 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РЕКОМЕНДУЕМЫЕ СТАТЬИ |