【vlfeat】O(n)排序算法——计数排序
今天想在网上找一个实现好的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)排序算法——计数排序相关推荐
- 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid
三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...
- 排序算法---计数排序(java版)
计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...
- 排序算法——计数排序详解
在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类排序算法被称为比较排序.对于包含 nnn 个元素的输入序列来说,任何比较排序算法在最坏情况下都要经过至少 O(nlogn)O(n\ log\ ...
- 十大排序算法——计数排序
计数排序 一. 计数排序介绍 二. 计数排序基础版 三. 计数排序改进版 四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个 ...
- 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid
转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...
- 排序算法 —— 计数排序
引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需 ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
最新文章
- 自己动手,打造轻量级VSCode/C#环境代替LinqPad
- Spring Hibernate使用TransactionInterceptor声明式事务配置
- 【项目实战课】基于Pytorch的DCGAN人脸嘴部表情图像生成实战
- EL表达式和标准标签库
- 秘籍分享:如何将负载均衡按量付费实例转换为包年包月实例
- python日志输入 print 常用格式化符号 logging 日志输出
- 高考填报志愿计算机操作技巧,填报高考志愿技巧和方法有哪些
- datetime 索引_超全的数据库建表/SQL/索引规范,适合贴在工位上!
- php处理post序列化,使用jQuery POST和php序列化和提交表单
- Kettle增量同步变动数据
- 《Python程序设计实例教程》课后习题参考答案
- 自动驾驶标志性事件来了,今早你上“车”了吗?
- Linux查询系统上次启动时间last reboot、上线时间uptime
- 静态分析Android程序
- C#对Dictionary的按Value排序
- elementUI之表格排序失效,表格宽度可拖拽变宽变窄
- 游戏开发商如何租用合适稳定的游戏服务器?
- traceroute 安装及使用
- HarmonyOS内存占用,华为HarmonyOS对比EMUI11:内存占用更少 系统更流畅
- 公司搬家的教训,提几个注意事项
热门文章
- 【Qt】Qt5.9编译MySQl5.7驱动
- java阻塞超时_JAVA防线程阻塞(超时控制)
- C语言ODBC方式连接DM数据库
- 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
- PHP页面间参数传递的四种方式
- 设计进步,记一笔,控制层的代码,他不光控制还要校验数据!以前理解错啦
- PX4飞控之导航及任务架构
- POJ-2186 Popular Cows (Tarjan缩点) 文末有测试数据
- 设置iis网页服务器cpu占比,为什么iis的一个线程池占了100%cpu
- (分组交换时延)谢希仁 第七版第一章1-10题详细解答