今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er。

于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段

 1 /* -----------------------------------------------------------------
 2    *                                          Sort pixels by intensity
 3    * -------------------------------------------------------------- */
 4
 5   {
 6     vl_uint buckets [ VL_MSER_PIX_MAXVAL ] ;
 7
 8     /* clear buckets */
 9     memset (buckets, 0, sizeof(vl_uint) * VL_MSER_PIX_MAXVAL ) ;
10
11     /* compute bucket size (how many pixels for each intensity
12        value) */
13     for(i = 0 ; i < (int) nel ; ++i) {
14       vl_mser_pix v = im [i] ;
15       ++ buckets [v] ;
16     }
17
18     /* cumulatively add bucket sizes */
19     for(i = 1 ; i < VL_MSER_PIX_MAXVAL ; ++i) {
20       buckets [i] += buckets [i-1] ;
21     }
22
23     /* empty buckets computing pixel ordering */
24     for(i = nel ; i >= 1 ; ) {
25       vl_mser_pix v = im [ --i ] ;
26       vl_uint j = -- buckets [v] ;
27       perm [j] = i ;
28     }
29   }

我看注释说排序,我觉得这个为啥连排序也要自己造轮子,为啥不直接用个快排啥的,后来仔细看了下代码,才发现不然,复杂度竟然是O(n)。

这段代码的目的原本是为了把一幅图像中的像素灰度值按升序排列,这里巧妙利用像素值取值是在0-255内这个特点,专门开辟了一个256长度的数组,记录每个灰度值的像素的个数,也就是这段:

1 /* compute bucket size (how many pixels for each intensity
2        value) */
3     for(i = 0 ; i < (int) nel ; ++i) {
4       vl_mser_pix v = im [i] ;
5       ++ buckets [v] ;
6     }

之后把这个统计值转换成比改灰度值小的像素的个数:

1     /* cumulatively add bucket sizes */
2     for(i = 1 ; i < VL_MSER_PIX_MAXVAL ; ++i) {
3       buckets [i] += buckets [i-1] ;
4     }

比像素m小的像素有buckets[m]个,那么m就排在buckets[m-1]到buckets[m]之间。每出现一个m,buckets[m]就--,m就排在buckets[m]处。

1     /* empty buckets computing pixel ordering */
2     for(i = nel ; i >= 1 ; ) {
3       vl_mser_pix v = im [ --i ] ;
4       vl_uint j = -- buckets [v] ;
5       perm [j] = i ;
6     }

后来百度发现这个叫做计数排序。这种排序并不需要比较,O(n+k)时间内可以完成。n是数组的个数,k是数组的取值范围。一般来说,这种算法只适合K比较小的情况。

转载于:https://www.cnblogs.com/jugg1024/p/4798731.html

【vlfeat】O(n)排序算法——计数排序相关推荐

  1. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  2. 排序算法---计数排序(java版)

    计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...

  3. 排序算法——计数排序详解

    在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类排序算法被称为比较排序.对于包含 nnn 个元素的输入序列来说,任何比较排序算法在最坏情况下都要经过至少 O(nlogn)O(n\ log\ ...

  4. 十大排序算法——计数排序

    计数排序 一. 计数排序介绍 二. 计数排序基础版 三. 计数排序改进版 四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个 ...

  5. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  6. 排序算法 —— 计数排序

    引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需 ...

  7. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  8. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. 自己动手,打造轻量级VSCode/C#环境代替LinqPad
  2. Spring Hibernate使用TransactionInterceptor声明式事务配置
  3. 【项目实战课】基于Pytorch的DCGAN人脸嘴部表情图像生成实战
  4. EL表达式和标准标签库
  5. 秘籍分享:如何将负载均衡按量付费实例转换为包年包月实例
  6. python日志输入 print 常用格式化符号 logging 日志输出
  7. 高考填报志愿计算机操作技巧,填报高考志愿技巧和方法有哪些
  8. datetime 索引_超全的数据库建表/SQL/索引规范,适合贴在工位上!
  9. php处理post序列化,使用jQuery POST和php序列化和提交表单
  10. Kettle增量同步变动数据
  11. 《Python程序设计实例教程》课后习题参考答案
  12. 自动驾驶标志性事件来了,今早你上“车”了吗?
  13. Linux查询系统上次启动时间last reboot、上线时间uptime
  14. 静态分析Android程序
  15. C#对Dictionary的按Value排序
  16. elementUI之表格排序失效,表格宽度可拖拽变宽变窄
  17. 游戏开发商如何租用合适稳定的游戏服务器?
  18. traceroute 安装及使用
  19. HarmonyOS内存占用,华为HarmonyOS对比EMUI11:内存占用更少 系统更流畅
  20. 公司搬家的教训,提几个注意事项

热门文章

  1. 【Qt】Qt5.9编译MySQl5.7驱动
  2. java阻塞超时_JAVA防线程阻塞(超时控制)
  3. C语言ODBC方式连接DM数据库
  4. 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
  5. PHP页面间参数传递的四种方式
  6. 设计进步,记一笔,控制层的代码,他不光控制还要校验数据!以前理解错啦
  7. PX4飞控之导航及任务架构
  8. POJ-2186 Popular Cows (Tarjan缩点) 文末有测试数据
  9. 设置iis网页服务器cpu占比,为什么iis的一个线程池占了100%cpu
  10. (分组交换时延)谢希仁 第七版第一章1-10题详细解答