mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
commit
f785f37376
@ -1,116 +1,19 @@
|
|||||||
/*
|
int three_part_binary_search(int a[], int x, int low, int high){
|
||||||
* This is a divide and conquer algorithm.
|
if (low < high){
|
||||||
* It does this by dividing the search space by 3 parts and
|
int m1 = (low + high) / 3 + 1;
|
||||||
* using its property (usually monotonic property) to find
|
int m2 = 2 * (low + high) / 3 + 1;
|
||||||
* the desired index.
|
|
||||||
*
|
if (x == a[m1])
|
||||||
* Time Complexity : O(log3 n)
|
return m1;
|
||||||
* Space Complexity : O(1) (without the array)
|
else if (x == a[m2])
|
||||||
*/
|
return m2;
|
||||||
|
else if (x < a[m1])
|
||||||
#include <iostream>
|
return three_part_binary_search(a, x, low, m1 - 1);
|
||||||
using namespace std;
|
else if (x<a[m2])
|
||||||
|
return three_part_binary_search(a, x, m1 + 1, m2 - 1);
|
||||||
/*
|
else if (x>a[m2])
|
||||||
* The absolutePrecision can be modified to fit preference but
|
return three_part_binary_search(a, x, m2 + 1, high);
|
||||||
* it is recommended to not go lower than 10 due to errors that
|
}
|
||||||
* may occur.
|
else
|
||||||
*
|
return -1;
|
||||||
* The value of _target should be decided or can be decided later
|
}
|
||||||
* by using the variable of the function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _target 10
|
|
||||||
#define absolutePrecision 10
|
|
||||||
#define MAX 10000000
|
|
||||||
|
|
||||||
int N = 21;
|
|
||||||
int A[MAX] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,10};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get_input function is to receive input from standard IO
|
|
||||||
*/
|
|
||||||
void get_input()
|
|
||||||
{
|
|
||||||
// TODO: Get input from STDIO or write input to memory as done above.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the iterative method of the ternary search which returns the index of the element.
|
|
||||||
*/
|
|
||||||
int it_ternary_search(int left, int right, int A[],int target)
|
|
||||||
{
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
if(left<right)
|
|
||||||
{
|
|
||||||
if(right-left < absolutePrecision)
|
|
||||||
{
|
|
||||||
for(int i=left;i<=right;i++)
|
|
||||||
if(A[i] == target) return i;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int oneThird = (left+right)/3+1;
|
|
||||||
int twoThird = (left+right)*2/3+1;
|
|
||||||
|
|
||||||
if(A[oneThird] == target) return oneThird;
|
|
||||||
else if(A[twoThird] == target) return twoThird;
|
|
||||||
|
|
||||||
else if(target > A[twoThird]) left = twoThird+1;
|
|
||||||
else if(target < A[oneThird]) right = oneThird-1;
|
|
||||||
|
|
||||||
else left = oneThird+1, right = twoThird-1;
|
|
||||||
}
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the recursive method of the ternary search which returns the index of the element.
|
|
||||||
*/
|
|
||||||
int rec_ternary_search(int left, int right, int A[],int target)
|
|
||||||
{
|
|
||||||
if(left<right)
|
|
||||||
{
|
|
||||||
if(right-left < absolutePrecision)
|
|
||||||
{
|
|
||||||
for(int i=left;i<=right;i++)
|
|
||||||
if(A[i] == target) return i;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int oneThird = (left+right)/3+1;
|
|
||||||
int twoThird = (left+right)*2/3+1;
|
|
||||||
|
|
||||||
if(A[oneThird] == target) return oneThird;
|
|
||||||
if(A[twoThird] == target) return twoThird;
|
|
||||||
|
|
||||||
if(target < A[oneThird]) return rec_ternary_search(left, oneThird-1, A, target);
|
|
||||||
if(target > A[twoThird]) return rec_ternary_search(twoThird+1, right, A, target);
|
|
||||||
|
|
||||||
return rec_ternary_search(oneThird+1, twoThird-1, A, target);
|
|
||||||
}
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ternary_search is a template function
|
|
||||||
* You could either use it_ternary_search or rec_ternary_search according to preference.
|
|
||||||
*/
|
|
||||||
void ternary_search(int N,int A[],int target)
|
|
||||||
{
|
|
||||||
cout << it_ternary_search(0,N-1,A,target) << '\t';
|
|
||||||
cout << rec_ternary_search(0,N-1,A,target) << '\t';
|
|
||||||
cout << '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
get_input();
|
|
||||||
ternary_search(N,A,_target);
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user