金牌会员
 
- 积分
- 1254
- 金钱
- 1254
- 注册时间
- 2016-11-30
- 在线时间
- 211 小时
|
10金钱
下面直奔主题了,我这边的需求是:对每次进来的卡号进行查重,卡号的长度为4字节,要求是相同的卡号存进数组只能一个,确保唯一性。(补充:卡号从硬件上拿,有可能相同的卡号,在不同的时间内出现,相当于查重算法是对进来的卡号进行判断是否存进数组)
我的做法是:对进来的卡号一个字节一个字节的对比,连续4个字节相同,则不再存进数组。其中当有一个字节不同时,则跳出判断,数组地址进行偏移(是为了卡号存的地址是连续的),存进数组。
这样的方法首先小批量是可以实现,但是大批量的时候,就比较费时了。
就此,请教各位大侠有没有更有效、更快捷的方法呢?下面是自己写的函数:
[mw_shl_code=c,true]void compare(void)
{
//ID去重比较
u8 CardNum=0,Num=0,counter=0;//counter为相同计数标志
for( CardNum = 0; CardNum < CardOffSet; CardNum++)
{
for(Num = 0;Num < 4;Num++)
{
if( IDdata[CardOffSet * 4 + Num] == IDdata[ CardNum * 4 + Num] ) counter++; //相同counter就加
else //不相同就跳出比较,直接发数据
{
counter=0;//清掉计数
break;
}
}
if( counter == 4) break; //加到8时表示卡号相投,跳出比较,不发数据
}
if(CardOffSet == 0 || counter != 4) //不相同就跳出比较,直接发数据
{
CardOffSet++; //相同CardOffSet则不加,不相同CardOffSet则相加,CardOffSet五分钟后清零
counter=0;
}
}[/mw_shl_code]
|
最佳答案
查看完整内容[请看2#楼]
先说个别的东西,c标准库里有个strncmp()函数,比较2个字符串的前n个字节是否相同,你想比较字符串的时候用这个就行;
回到问题本身
如果批量大的时候就变慢了那肯定是查找比较费时,不是比较字符串本身的问题;
查找费时是因为你没排序;
但是排序也需要时间的,可以在有操作时查找,空闲时排序。
如果人力一次插入一张卡录入卡号,可以直接插入排序;如果一次录入多个卡号,可以归并排序;如果短时间内从数据线输入大量 ...
|