前言
这部分我在项目中为从文件里获取存储信息时,准备的二分法算法。
适用于,整理清晰,键数值从小到大排列的数据列表
使用时注意以下几点:
- 保证数据存储长度相同。
- 保证数据键值从小到大排列。
- 保证单条数据有办法获取关键数据信息。
使用案例
private String getOwnerTime(String userid) {
String dataString = "id:0012345678+"+getNowDate(); //获取参考字符串
int dataSize = dataString.length(); //获取参考长度
int cnt = OwnerTimeListBuffLen / dataSize; //获取数据队列长度
// 二分法
int min = 0;
int mid = 0;
int max = cnt;
boolean found = false;
while (true){
//二分法第一步取中索引
mid = (min+max)/2 ;
//二分法第二步取中值
String str = bytesToAscii(OwnerTimeListBuff,mid*dataSize+3 ,userid.length());
Log.i(TAG,"try to fine data:id:"+userid);
//二分法第三步比较中值
int temp = userid.compareTo(str);
//二分法第四步跟换区间-or-获取查找对象
if(temp==0) {
//查询成功
found = true;
Log.i(TAG,"fine data:id:"+str);
break;
}else if(temp>0){
//选上区间
max = max;
min = mid;
}else if(temp<0){
//选下区间
max = mid;
min = min;
}
if(max==min){
//区间用尽
break;
}
}
if(found){
String strTemp = bytesToAscii(OwnerTimeListBuff,mid*dataSize ,dataSize);
String strTemp2 = strTemp.substring(strTemp.lastIndexOf("+")+1);
return strTemp2;
}else
return null;
}
解析
在这个案例中我的单条数据总长是固定的是参数dataSize,并且键值id也确保了在平时存储管理时始终从小到大排列。并且我期望获取的参数strTemp2(实际是日期时间)也有明确的获取方式(存储的数据"+"右侧部分),因此可以使用2分法查找存储的数据
结语
技术积累+1,ヽ( ̄▽ ̄)ノ