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

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

 /* -----------------------------------------------------------------
* Sort pixels by intensity
* -------------------------------------------------------------- */ {
vl_uint buckets [ VL_MSER_PIX_MAXVAL ] ; /* clear buckets */
memset (buckets, , sizeof(vl_uint) * VL_MSER_PIX_MAXVAL ) ; /* compute bucket size (how many pixels for each intensity
value) */
for(i = ; i < (int) nel ; ++i) {
vl_mser_pix v = im [i] ;
++ buckets [v] ;
} /* cumulatively add bucket sizes */
for(i = ; i < VL_MSER_PIX_MAXVAL ; ++i) {
buckets [i] += buckets [i-] ;
} /* empty buckets computing pixel ordering */
for(i = nel ; i >= ; ) {
vl_mser_pix v = im [ --i ] ;
vl_uint j = -- buckets [v] ;
perm [j] = i ;
}
}

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

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

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

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

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

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

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

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

【vlfeat】O(n)排序算法——计数排序的更多相关文章

  1. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  2. python实现线性排序算法-计数排序

    计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到 ...

  3. 排序算法-计数排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className CountSort * @date 201 ...

  4. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)

    计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

  5. JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  6. 十大经典排序算法+sort排序

    本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...

  7. 桶排序和计数排序的理解实现和比较(Java)

    比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.比较排序的优势是 ...

  8. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  9. 排序算法--希尔排序(Shell Sort)_C#程序实现

    排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...

随机推荐

  1. <select multiple="multiple"> 数据回显

    var names = yunying_name.split(","); for (var i = 0; i < names.length; i++) { names[i] ...

  2. vue 防止xss攻击

    1.在终端引入xss,命令: npm install xss --save 2.在vue的页面进行引入 import xss from 'xss' 测试 <p v-html="test ...

  3. Java Web 之HttpServletRequest对象初识

    通过request对象获得请求行 获得客户端请求方式:String getMethod(); 获得请求的资源: String getRequestURL(); String getQueryStrin ...

  4. Autoit3域用户的登陆统计

    #include <ACN_NET.au3> If @OSArch="X86" Then $fileURL=@CommonFilesDir & "\S ...

  5. C#高级编程笔记(11至16章)异步/托管/反射/异常

    11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...

  6. SpringBoot---Favicon配置

    1.概述 1.1.SpringBoot提供了一个默认的Favicon,每次访问都能看到: 2.关闭Favicon 在application.yml中设置关闭Favicon,默认开启: spring.m ...

  7. java list集合元素根据某些字段排序

    一.jdk1.6的环境下 新建ComparatorSort类,并实现Comparator接口,重写compare方法 降序排序:o1的元素>o2的元素,并返回-1:o1的元素小于o2的元素,并返 ...

  8. Vue $ref 的用法

    <div id="app"> <cpn $ref="item"></cpn> <cpn></cpn> ...

  9. Python常用内置函数整理(lambda,reduce,zip,filter,map)

    匿名函数lambda lambda argument1,argument2,...argumentN :expression using arguments 1.lambda是一个表达式,而不是一个语 ...

  10. 【Linux】批量结束某一脚本的进程

    ps -ef | grep **.sh |grep -v grep | awk '{print $2}' | xargs kill -9