我正在尝试构建一种高效的算法,可以处理包含客户邮政编码的数千行数据。然后,我希望将这些邮政编码与大约1000个邮政编码分组进行交叉检查,但我有大约100列包含1000个邮政编码。很多这些邮编是连续的数字,但也有很多随机的邮编混在其中。因此,我想要做的是将连续的邮编分组在一起,然后只需检查该邮编是否落在该范围内,而不是针对每个单独的邮编进行检查。
示例数据 -
90001
90002
90003
90004
90005
90006
90007
90008
90009
90010
90012
90022
90031
90032
90033
90034
90041
应按以下方式进行分组:
{ 90001-90010, 90012, 90022, 90031-90034, 90041 }
这是我对算法的想法:
public struct gRange {
public int start, end;
public gRange(int a, int b) {
start = a;
if(b != null) end = b;
else end = a;
}
}
function groupZips(string[] zips){
List<gRange> zipList = new List<gRange>();
int currZip, prevZip, startRange, endRange;
startRange = 0;
bool inRange = false;
for(int i = 1; i < zips.length; i++) {
currZip = Convert.ToInt32(zips[i]);
prevZip = Convert.ToInt32(zips[i-1]);
if(currZip - prevZip == 1 && inRange == false) {
inRange = true;
startRange = prevZip;
continue;
}
else if(currZip - prevZip == 1 && inRange == true) continue;
else if(currZip - prevZip != 1 && inRange == true) {
inRange = false;
endRange = prevZip;
zipList.add(new gRange(startRange, endRange));
continue;
}
else if(currZip - prevZip != 1 && inRange == false) {
zipList.add(new gRange(prevZip, prevZip));
}
//not sure how to handle the last case when i == zips.length-1
}
}
目前,我不确定如何处理最后一种情况,但是看这个算法,它似乎不太高效。有更好/更容易的方法来排序这组数字吗?
O(n)
。 - vgru