二分法是当数据量很大时适宜采用,但是采用二分法的前提是,数据是有序不重复的。二分法又称折半查找,故名思意就是就是从中间开始比较查找.
/* 二分法查找指定message的位置
*
* @param messageList 消息的集合
* @param messageTime 指定的消息的时间
* @return 返回所在的位置,-1时未找到
*/
public static int findMessagePosition(List<Message> messageList, long messageTime) {
long startTime = System.currentTimeMillis();
if (messageList == null) {
return -1;
}
int start = 0;
int end = messageList.size() - 1;
int mid;
while (start <= end) {
// 每次取中间位置进行查找
mid = (start + end) / 2;
if (messageTime < messageList.get(mid).getSortDate()) {
end = mid - 1;
} else if (messageTime > messageList.get(mid).getSortDate()) {
start = mid + 1;
} else {
long endTime = System.currentTimeMillis();
Logger.e("findMessagePosition 耗时:" + (endTime - startTime));
return mid;
}
}
return -1;
}
/**
* 位运算查找指定message的位置(比二分法效率更高)
*
* @param messageList 消息的集合
* @param messageTime 指定的消息的时间
* @return 返回所在的位置,-1时未找到
*/
public static int findMessagePositionV(List<Message> messageList, long messageTime) {
long startTime = System.currentTimeMillis();
if (messageList == null) {
return -1;
}
int start = 0;
int end = messageList.size() - 1;
int mid;
while (start <= end) {
mid = (start + end) >>> 1;
if (messageTime < messageList.get(mid).getSortDate()) {
end = mid - 1;
} else if (messageTime > messageList.get(mid).getSortDate()) {
start = mid + 1;
} else {
long endTime = System.currentTimeMillis();
Logger.e("findMessagePosition 耗时:" + (endTime - startTime));
return mid;
}
}
return -1;
}