搜索
bottom↓
回复: 20

怎么快速统计数组中某个数出现的个数

[复制链接]

出0入0汤圆

发表于 2017-7-21 06:55:33 | 显示全部楼层 |阅读模式
8位的单片机,要对一堆ad采集过来的数组进行处理,统计某个数字出现的次数。请问各位大神,有没有好的快速统计的算法,但又不能占用太多MCU时间。谢谢诶

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出10入113汤圆

发表于 2017-7-21 07:00:41 | 显示全部楼层
==                                   

出10入23汤圆

发表于 2017-7-21 07:18:10 | 显示全部楼层
经典方法:
  1. int data1_cnt = 0, data2_cnt = 0, data3_cnt = 0;
  2. for ( ; ; ) {
  3.         if (adc == data1) {
  4.                 data1_cnt++;
  5.                 continue;
  6.         }
  7.         if (adc == data2) {
  8.                 data2_cnt++;
  9.                 continue;
  10.         }
  11.         if (adc == data3) {
  12.                 data3_cnt++;
  13.                 continue;
  14.         }
  15. }
复制代码


特殊方法:
  1. int cnt[4096] = {0};
  2. for ( ; ; ) {
  3.         cnt[adc]++;
  4. }
复制代码

出0入0汤圆

 楼主| 发表于 2017-7-21 07:32:12 | 显示全部楼层

厉害+++++++++++++++++++++++++++ 谢谢

出0入0汤圆

 楼主| 发表于 2017-7-21 07:33:53 | 显示全部楼层

虽然一点用处参考价值都没有!但还是谢谢您的快速回复!!!!!

出0入0汤圆

发表于 2017-7-21 09:19:14 | 显示全部楼层
retome 发表于 2017-7-21 07:33
虽然一点用处参考价值都没有!但还是谢谢您的快速回复!!!!!

楼上给出的桶排序很经典啊,
再怎么快  O(n) 的复杂度是必须的。

出0入0汤圆

发表于 2017-7-21 10:35:00 | 显示全部楼层

受教了,第二种方法用空间换时间,很好,除了RAM占用较大,没其他毛病

出0入0汤圆

发表于 2017-7-21 11:27:14 来自手机 | 显示全部楼层
这是统计能谱的唯一办法。当然,如果你只想记录某个范围内的能谱的话,那就可以加判断以减少ram消耗。

出10入23汤圆

发表于 2017-7-21 11:35:46 来自手机 | 显示全部楼层
zlogon 发表于 2017-7-21 10:35
受教了,第二种方法用空间换时间,很好,除了RAM占用较大,没其他毛病

第一种当有多个if的时候,第二种的优势就出来了

出10入23汤圆

发表于 2017-7-21 11:37:25 来自手机 | 显示全部楼层
retome 发表于 2017-7-21 07:33
虽然一点用处参考价值都没有!但还是谢谢您的快速回复!!!!!

你确定一点参考价值都没有?
你该反思一下你提问的思路

出0入0汤圆

发表于 2017-7-21 13:34:26 | 显示全部楼层
这个是做做什么用途的

出0入0汤圆

发表于 2017-7-21 14:19:02 | 显示全部楼层
感觉3L给的第二种方法很好啊,空间换时间也就是这样了O(n)是避不开的啊。
或者换一个思路,不等采集完一个数组,而是一组就统计一次,不过实际也就是把时间摊到每次;
再或者采用FPGA之类的可以并行处理的,分层统计,然后结果叠加?

出0入0汤圆

发表于 2017-7-21 18:21:15 来自手机 | 显示全部楼层
zouzhichao 发表于 2017-7-21 07:18
经典方法:



请收下我的膝盖

出0入8汤圆

发表于 2017-7-21 18:45:57 | 显示全部楼层

特殊方法没看懂 愿闻其详

出0入0汤圆

发表于 2017-7-21 19:06:12 来自手机 | 显示全部楼层
rube 发表于 2017-7-21 18:45
特殊方法没看懂 愿闻其详

每个AD值对应数组里的一个位置,那个位置表示的是这个值出现的次数,空间换时间

出0入21汤圆

发表于 2017-7-21 20:00:40 | 显示全部楼层
特殊方法,实在高

出0入20汤圆

发表于 2017-7-21 21:12:41 | 显示全部楼层
其实第二种方法非常实用的,谁敢把12bit的AD当12bit用的?很多时候根本不需要那么高分辨率,8bit分辨率只要256个字节就行了,相当实用的方法。

就是有溢出风险,后面要跟一个归零的处理~

出0入8汤圆

发表于 2017-7-21 21:22:17 | 显示全部楼层
jiangkehong 发表于 2017-7-21 19:06
每个AD值对应数组里的一个位置,那个位置表示的是这个值出现的次数,空间换时间 ...

明白了,谢谢

出0入8汤圆

发表于 2017-7-21 22:10:57 | 显示全部楼层
图像的直方图统计就是那样

出0入0汤圆

发表于 2017-7-21 23:11:28 来自手机 | 显示全部楼层
排列组合

出0入0汤圆

 楼主| 发表于 2017-7-23 04:44:51 | 显示全部楼层
zouzhichao 发表于 2017-7-21 11:35
第一种当有多个if的时候,第二种的优势就出来了

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

本版积分规则

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

GMT+8, 2024-4-26 16:58

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

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