baynkrnr 发表于 2013-3-7 21:41:02

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

小弟最近在搞一个门禁系统,用了STC12C5A32的单片机,内部的“EEPROM”是比较大,如果一张卡号存4个字节,那么可以存7000张卡这样子,如果用历遍法查找7000张卡中的一张卡号,用的时间太长了,有什么算法能快速的查找吗?

BDXing6 发表于 2013-3-8 00:25:18

卡号*4=地址

sibtck 发表于 2013-3-8 02:53:52

数据 库....

daliqi 发表于 2013-3-8 07:37:43

哈希表,通过哈希算法,让每个UID与某个地址对应起来,这样查找每个的UID的时间相同。数量少时遍历还凑合,多的话时间上受不了。哈希表的缺点是会浪费些存储空间。

cc224 发表于 2013-3-8 07:54:10

排序,然后就可以用二分法查找了

XA144F 发表于 2013-3-8 08:25:07

7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等几秒,没事的。

Etual 发表于 2013-3-8 08:36:44

链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那么对于经常使用的卡,搜1-3次就读出来了。

embeddev_1 发表于 2013-3-8 08:39:16

二分法!!

Halley 发表于 2013-3-8 08:49:29

我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。

baynkrnr 发表于 2013-3-9 15:38:09

Etual 发表于 2013-3-8 08:36 static/image/common/back.gif
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...

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

baynkrnr 发表于 2013-3-9 15:40:52

Halley 发表于 2013-3-8 08:49 static/image/common/back.gif
我也在弄这个东西,现在的想法是:存数据的时候把地址记下来,然后根据地址找数据。 ...

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

baynkrnr 发表于 2013-3-9 15:43:05

cc224 发表于 2013-3-8 07:54 static/image/common/back.gif
排序,然后就可以用二分法查找了

扇区里不好用排序

baynkrnr 发表于 2013-3-9 15:44:11

XA144F 发表于 2013-3-8 08:25 static/image/common/back.gif
7000*4=28000,最多才28K,你用的STC12单片机,把工作频率开到最大,那一秒查询3000组是没问题的吧?耐心等 ...

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

cc224 发表于 2013-3-9 19:02:03

baynkrnr 发表于 2013-3-9 15:43 static/image/common/back.gif
扇区里不好用排序

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

zuu0 发表于 2013-3-9 19:16:37

2楼方法不错,记下

baynkrnr 发表于 2013-3-9 22:20:24

cc224 发表于 2013-3-9 19:02 static/image/common/back.gif
如果排序的话确实在增加和删除卡的时候比较麻烦
极端情况下比如你在第一个区加、减卡,那么需要重写所有 ...

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

Hz01800475 发表于 2013-4-9 12:31:44

Etual 发表于 2013-3-8 08:36 static/image/common/back.gif
链式哈希表,设计得好的话7000条数据读取几次就找到数据了。还可以考虑将常用数据上浮,以实用次数排序
那 ...

此楼正解。

chaily 发表于 2013-4-9 12:46:15

把数据当作地址,存入对应的地址中,查找的时候读到的数据直接当作地址来寻址,看看寻址后存储单元的数据内容是不是和地址数据一样的,一样的表明是存在的白名单,如果寻址后发现是0则表明未录入。

mhw 发表于 2013-4-9 12:47:57

内部EEPROM的话,直接用for循环从头比较到尾就行了……不信你可以测试一下速度

Wxy8030 发表于 2013-4-9 12:49:56

最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错!

Halley 发表于 2013-4-9 12:57:49

Wxy8030 发表于 2013-4-9 12:49 static/image/common/back.gif
最简单的:加个32K的并口RAM,把卡号复制过去!
算法越复杂越容易出错!

好办法 值得一试
页: [1]
查看完整版本: 求助!关于门禁卡号在EEPROM中如何快速查找