blob: e6314283491cf3bc80537b2513d12ad5022a7d14 [file] [log] [blame]
/*
* Copyright 2009-2010 by The Regents of the University of California
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may obtain a copy of the License from
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.uci.ics.hyracks.data.std.algorithms;
import edu.uci.ics.hyracks.data.std.api.IComparable;
import edu.uci.ics.hyracks.data.std.collections.api.IValueReferenceVector;
/**
* Performs Binary Search over a vector of value references.
* Assumption: The items in the vector are sorted in ascending order with respect
* to the specified key.
*
* @author vinayakb
*/
public class BinarySearchAlgorithm {
private int index;
public BinarySearchAlgorithm() {
}
/**
* Perform binary search on the given vector for the specified key. It returns the result of the search
* and sets the {@link #index} value that is retrievable by calling {@link #getIndex()} to refer to
* the index in the array where the key was found (if it was found), and where it should have been (if
* not found).
*
* @param vector
* - Sorted vector of items
* @param key
* - Search key
* @return <code>true</code> if the key is found, <code>false</code> otherwise.
*/
public boolean find(IValueReferenceVector vector, IComparable key) {
index = 0;
int left = 0;
int right = vector.getSize() - 1;
while (left <= right) {
index = (left + right) / 2;
int cmp = key.compareTo(vector.getBytes(index), vector.getStart(index), vector.getLength(index));
if (cmp > 0) {
left = index + 1;
index = left;
} else if (cmp < 0) {
right = index - 1;
index = left;
} else {
return true;
}
}
return false;
}
/**
* Get the index as a result of binary search.
*
* @return the index in the array where the key was found (if it was found), and where it should have been (if
* not found).
*/
public int getIndex() {
return index;
}
}