搜索
bottom↓
回复: 13

请教下如果我有150个id号每个id 号都是32bit每次接收.

[复制链接]

出0入0汤圆

发表于 2018-6-1 15:47:54 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2018-6-1 16:07 编辑

请教下,如果我有150个id号,每个id 号都是32bit,每次接收保存读取等,有什么好方法啊 ?


请教下,如果我有150个id号,每个id都是32bit,每次接收到一个 id 号后都会与之前接收到的 id 号对比一次查看是否之前接收过的,如果是没有接收过的则继续接收,如果是接收过的就丢弃不用

这样的话,每次都需要对比 接收 id 号,接收到的 id 号需要定时清除,时间为 8s,就是8s 过后需要吧这个 接收到的 id 清除 重新再次接收,


所以的id 号 都如此反复循环上面的 操作,大家有什么好方法啊 ?

出0入0汤圆

发表于 2018-6-1 15:53:40 | 显示全部楼层
2个排序队列, 一个基于ID 排序, 一个基于时间排序。。。。  

出0入0汤圆

 楼主| 发表于 2018-6-1 16:06:49 | 显示全部楼层
浮华一生 发表于 2018-6-1 15:53
2个排序队列, 一个基于ID 排序, 一个基于时间排序。。。。

貌似 排序 方法比较麻烦啦,

比如我只使用 1、2、3、 145、129、68 等,id 号不是连续的,这样每接收一次就排一次,感觉有些不是很好啊

另外关键是 每接收一个 id 后,到一定时间后又需要吧之前接收到的 id 号清除 重新再接收

出300入477汤圆

发表于 2018-6-1 16:35:27 | 显示全部楼层
hpdell 发表于 2018-6-1 16:06
貌似 排序 方法比较麻烦啦,

比如我只使用 1、2、3、 145、129、68 等,id 号不是连续的,这样每接收一 ...

才150个,当然是一直保持你的队列有序是最简单的,每次收到新的就插入已有的队列(最坏情况是需要移动全部150个元素)
如果数量大到每次无法移动全部元素,那就改成某种排序二叉树,比如红黑树之类,这样插入删除都是对数级别的时间。但是代价是每个元素都是动态分配的,也就是需要分配更多的内存。还有就是你能不能写对红黑树的各种操作

出0入0汤圆

 楼主| 发表于 2018-6-1 16:41:54 | 显示全部楼层
redroof 发表于 2018-6-1 16:35
才150个,当然是一直保持你的队列有序是最简单的,每次收到新的就插入已有的队列(最坏情况是需要移动全 ...

目前对这个 红黑树 没有写过,估计 不能写对,能否提供一下相关的代码参考一下啊 ??

因为每个 id 号对应的还有 其他的一些数据,比如 adc 值,加速度值,sos 报警值等 也都要一起保存

出300入477汤圆

发表于 2018-6-1 17:10:42 | 显示全部楼层
hpdell 发表于 2018-6-1 16:41
目前对这个 红黑树 没有写过,估计 不能写对,能否提供一下相关的代码参考一下啊 ??

因为每个 id 号对 ...

Linux源码中有一份正确的,C++的STL里面也有一份正确的(std::set就是)。
我手上可没有。我只会直接用STL
如果你不是很熟悉数据结构,没事不要自己写,能写对所有操作的人太少见了

出0入0汤圆

发表于 2018-6-1 17:20:41 | 显示全部楼层
本帖最后由 浮华一生 于 2018-6-1 17:24 编辑
redroof 发表于 2018-6-1 16:35
才150个,当然是一直保持你的队列有序是最简单的,每次收到新的就插入已有的队列(最坏情况是需要移动全 ...


其实用排序 150个数据也用不了多少时间, 他可能还没上手试过, 想着有一步到位的算法,, 哈哈

出0入0汤圆

发表于 2018-6-1 17:26:35 | 显示全部楼层
hpdell 发表于 2018-6-1 16:41
目前对这个 红黑树 没有写过,估计 不能写对,能否提供一下相关的代码参考一下啊 ??

因为每个 id 号对 ...

有一种链表叫跳跃链表 你可以看一下  只是内存需要会表普通链表多一些

出0入0汤圆

 楼主| 发表于 2018-6-1 17:27:30 | 显示全部楼层
redroof 发表于 2018-6-1 17:10
Linux源码中有一份正确的,C++的STL里面也有一份正确的(std::set就是)。
我手上可没有。我只会直接用ST ...

我这个是 单片机啊,

出300入477汤圆

发表于 2018-6-1 17:38:04 | 显示全部楼层
hpdell 发表于 2018-6-1 17:27
我这个是 单片机啊,

所以我建议你用简单的排序列表啊。每次增加一个的时候就找到正确的位置插入(移动他后面所有的节点)
这样查找还是可以排序查找的。
插入慢就慢点,你的数据又不多,没必要用高射炮打蚊子。


出0入0汤圆

发表于 2018-6-1 18:23:13 来自手机 | 显示全部楼层
就静态分配150个元素就行了,也不用排序了,就这么点数据,循环一次不过花几十us

出0入0汤圆

发表于 2018-6-1 19:02:53 | 显示全部楼层
类似redis、memcache的超时机制。
一般最小堆定时器,处理几十万量级。
150个嘛,性能要求不高,C++用std:map或者C语言自己建个hash map,简单的。

出0入0汤圆

 楼主| 发表于 2018-7-2 10:19:23 | 显示全部楼层
luobote55 发表于 2018-6-1 19:02
类似redis、memcache的超时机制。
一般最小堆定时器,处理几十万量级。
150个嘛,性能要求不高,C++用std: ...

使用 单片机啊,不过现在貌似已经搞定了,没有排序,感觉也没有必要

只需要查找出之前是否接收过,再配合判断超时时间是否到了就可以了

目前效果貌似还可以

出0入0汤圆

 楼主| 发表于 2018-7-2 10:20:03 | 显示全部楼层
nanfang2000 发表于 2018-6-1 18:23
就静态分配150个元素就行了,也不用排序了,就这么点数据,循环一次不过花几十us ...

使用 单片机啊,主频72-120Mhz 不过现在貌似已经搞定了,没有排序,感觉也没有必要

只需要查找出之前是否接收过,再配合判断超时时间是否到了就可以了

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

本版积分规则

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

GMT+8, 2024-4-20 02:28

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

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