搜索
bottom↓
回复: 20

求助!关于门禁卡号在EEPROM中如何快速查找

[复制链接]

出0入0汤圆

发表于 2013-3-7 21:41:02 | 显示全部楼层 |阅读模式
小弟最近在搞一个门禁系统,用了STC12C5A32的单片机,内部的“EEPROM”是比较大,如果一张卡号存4个字节,那么可以存7000张卡这样子,如果用历遍法查找7000张卡中的一张卡号,用的时间太长了,有什么算法能快速的查找吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-3-8 00:25:18 | 显示全部楼层
卡号*4=地址

出0入0汤圆

发表于 2013-3-8 02:53:52 | 显示全部楼层
数据 库....

出0入0汤圆

发表于 2013-3-8 07:37:43 来自手机 | 显示全部楼层
哈希表,通过哈希算法,让每个UID与某个地址对应起来,这样查找每个的UID的时间相同。数量少时遍历还凑合,多的话时间上受不了。哈希表的缺点是会浪费些存储空间。

出0入0汤圆

发表于 2013-3-8 07:54:10 | 显示全部楼层
排序,然后就可以用二分法查找了

出0入0汤圆

发表于 2013-3-8 08:25:07 | 显示全部楼层
7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等几秒,没事的。

出0入0汤圆

发表于 2013-3-8 08:36:44 | 显示全部楼层
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那么对于经常使用的卡,搜1-3次就读出来了。

出0入0汤圆

发表于 2013-3-8 08:39:16 | 显示全部楼层
二分法!!

出0入0汤圆

发表于 2013-3-8 08:49:29 | 显示全部楼层
我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。

出0入0汤圆

 楼主| 发表于 2013-3-9 15:38:09 | 显示全部楼层
Etual 发表于 2013-3-8 08:36
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...

STC单片机内部的"EEPROM"为512个字节为一个扇区,我现在每读一个扇区就历遍一次数据,最后一张卡要重复50来次,查找好慢的.能详细说一下吗?

出0入0汤圆

 楼主| 发表于 2013-3-9 15:40:52 | 显示全部楼层
Halley 发表于 2013-3-8 08:49
我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。 ...

你是怎么外理的呢? 一个扇区512个字节,一张卡号4个字节,一个扇区正好装512/4张卡,地址就是  卡号*4了.能说说你的思路吗?

出0入0汤圆

 楼主| 发表于 2013-3-9 15:43:05 | 显示全部楼层
cc224 发表于 2013-3-8 07:54
排序,然后就可以用二分法查找了

扇区里不好用排序

出0入0汤圆

 楼主| 发表于 2013-3-9 15:44:11 | 显示全部楼层
XA144F 发表于 2013-3-8 08:25
7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等 ...

读卡加找最后一张卡要4秒这样子.我用的晶体是11.0592

出0入0汤圆

发表于 2013-3-9 19:02:03 | 显示全部楼层
baynkrnr 发表于 2013-3-9 15:43
扇区里不好用排序

如果排序的话确实在增加和删除卡的时候比较麻烦
极端情况下比如你在第一个区加、减卡,那么需要重写所有的数据
不过一旦数据全部排好序,那么查找就比较容易了
60多个区最不巧的情况下也只是读7个区就可以找到数据了,查找时间大约缩小到你目前的十分之一
门禁系统如果需要4秒钟才知道是不是合法卡那肯定是太慢了

出0入0汤圆

发表于 2013-3-9 19:16:37 | 显示全部楼层
2楼方法不错,记下

出0入0汤圆

 楼主| 发表于 2013-3-9 22:20:24 | 显示全部楼层
cc224 发表于 2013-3-9 19:02
如果排序的话确实在增加和删除卡的时候比较麻烦
极端情况下比如你在第一个区加、减卡,那么需要重写所有 ...

读了你的回复,一个扇区排一次序。那也不好办呀!

出0入0汤圆

发表于 2013-4-9 12:31:44 | 显示全部楼层
Etual 发表于 2013-3-8 08:36
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...

此楼正解。

出0入0汤圆

发表于 2013-4-9 12:46:15 | 显示全部楼层
把数据当作地址,存入对应的地址中,查找的时候读到的数据直接当作地址来寻址,看看寻址后存储单元的数据内容是不是和地址数据一样的,一样的表明是存在的白名单,如果寻址后发现是0则表明未录入。

出0入0汤圆

发表于 2013-4-9 12:47:57 | 显示全部楼层
内部EEPROM的话,直接用for循环从头比较到尾就行了……不信你可以测试一下速度

出0入0汤圆

发表于 2013-4-9 12:49:56 | 显示全部楼层
最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错!

出0入0汤圆

发表于 2013-4-9 12:57:49 | 显示全部楼层
Wxy8030 发表于 2013-4-9 12:49
最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错!

好办法 值得一试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表