求助!关于门禁卡号在EEPROM中如何快速查找
小弟最近在搞一个门禁系统,用了STC12C5A32的单片机,内部的“EEPROM”是比较大,如果一张卡号存4个字节,那么可以存7000张卡这样子,如果用历遍法查找7000张卡中的一张卡号,用的时间太长了,有什么算法能快速的查找吗? 卡号*4=地址 数据 库.... 哈希表,通过哈希算法,让每个UID与某个地址对应起来,这样查找每个的UID的时间相同。数量少时遍历还凑合,多的话时间上受不了。哈希表的缺点是会浪费些存储空间。 排序,然后就可以用二分法查找了 7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等几秒,没事的。 链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序那么对于经常使用的卡,搜1-3次就读出来了。 二分法!! 我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。 Etual 发表于 2013-3-8 08:36 static/image/common/back.gif
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...
STC单片机内部的"EEPROM"为512个字节为一个扇区,我现在每读一个扇区就历遍一次数据,最后一张卡要重复50来次,查找好慢的.能详细说一下吗? Halley 发表于 2013-3-8 08:49 static/image/common/back.gif
我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。 ...
你是怎么外理的呢? 一个扇区512个字节,一张卡号4个字节,一个扇区正好装512/4张卡,地址就是卡号*4了.能说说你的思路吗? cc224 发表于 2013-3-8 07:54 static/image/common/back.gif
排序,然后就可以用二分法查找了
扇区里不好用排序 XA144F 发表于 2013-3-8 08:25 static/image/common/back.gif
7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等 ...
读卡加找最后一张卡要4秒这样子.我用的晶体是11.0592 baynkrnr 发表于 2013-3-9 15:43 static/image/common/back.gif
扇区里不好用排序
如果排序的话确实在增加和删除卡的时候比较麻烦
极端情况下比如你在第一个区加、减卡,那么需要重写所有的数据
不过一旦数据全部排好序,那么查找就比较容易了
60多个区最不巧的情况下也只是读7个区就可以找到数据了,查找时间大约缩小到你目前的十分之一
门禁系统如果需要4秒钟才知道是不是合法卡那肯定是太慢了
2楼方法不错,记下 cc224 发表于 2013-3-9 19:02 static/image/common/back.gif
如果排序的话确实在增加和删除卡的时候比较麻烦
极端情况下比如你在第一个区加、减卡,那么需要重写所有 ...
读了你的回复,一个扇区排一次序。那也不好办呀! Etual 发表于 2013-3-8 08:36 static/image/common/back.gif
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...
此楼正解。 把数据当作地址,存入对应的地址中,查找的时候读到的数据直接当作地址来寻址,看看寻址后存储单元的数据内容是不是和地址数据一样的,一样的表明是存在的白名单,如果寻址后发现是0则表明未录入。 内部EEPROM的话,直接用for循环从头比较到尾就行了……不信你可以测试一下速度 最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错! Wxy8030 发表于 2013-4-9 12:49 static/image/common/back.gif
最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错!
好办法 值得一试
页:
[1]