美文网首页
键索引计数法

键索引计数法

作者: KeDaiBiaO1 | 来源:发表于2017-10-10 09:26 被阅读0次

键索引计数法 是LSD MSD算法的基础

背景

比如一个班级的学生成绩分为 1,2,3,4 4个等级
这样我们就得到一个键值关系(组号和姓名)

我们希望根据等级排序

想得到的结果就是 一个数组(按照 1等级的学生紧跟2等级的然后是3等级的最后是4等级),也就是每个等级的学生会连续在一起存到数组中

思路

计算每个组别的频率,然后转化为索引(后面的值是前面小键频率的和)
然后就可以知道各个组别的起始索引

注意
  1. 频率统计的时候 count索引对应是 组别+1
  2. 数据分类
    count数组中存的是起始索引
    aux数组中存的是全部的学生数据
    当取到组别的值为x, 则aux[x]的值需要是 x组别 的student对象 然后count中存的对应组别+1的值加1,这样下一个该组别的student就会放入下一个aux[]数组

    public class Student{
        private int group;//组号
        private String name;//名字
        public int getGroup() {
            return group;
        }
        public void setGroup(int group) {
            this.group = group;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Student(int group, String name){
            this.name = name;
            this.group = group;
        }
        public Student(){}
    }
    @Test
    public void test(){
        sort();
    }
    public void sort(){
        Student[] a = new Student[5];
        a[0] = new Student(1, "sun1");
        a[1] = new Student(2, "sun2");
        a[2] = new Student(3, "sun3");
        a[3] = new Student(1, "sun1");
        a[4] = new Student(4, "sun4");
        int N = a.length;
        int R = 5;
        
        Student[] aux = new Student[N];
        int[] count = new int[R + 1];
        //计算频率
        for (int i = 0; i < N; i++) {
            count[a[i].getGroup() + 1]++;

        }
        //频率转索引  前面的小键相加
        for (int r = 0; r < R; r++) {
            count[r + 1] += count[r];
 
        }
        //元素分类  划分按组别(键)
        for (int i = 0; i < N; i++) {
            aux[count[a[i].getGroup()]++] = a[i];
//          aux[count[a[i].getGroup()]] = a[i];
//          count[a[i].getGroup()]++;
        }
        for (int i = 0; i < N; i++) {
            a[i] = aux[i];
        }
    }

相关文章

  • 字符串排序(一)

    键索引计数法键索引计数法是一种适用于整数键的简单排序方法。为了说明这种方法,假设数组a[]中的每个元素都保存了一个...

  • 键索引计数法

    键索引计数法 是LSD MSD算法的基础 背景 比如一个班级的学生成绩分为 1,2,3,4 4个等级这样我们就...

  • 《算法》笔记 13 - 字符串排序

    键索引计数法频率统计将频率转换为索引数据分类回写 低位优先的字符串排序 高位优先的字符串排序 许多重要而熟悉的问题...

  • 字符串排序:键索引计数法

    字符串排序有很多应用,比如车牌的排序,基因编码等。今天介绍一种低位优先的字符串排序算法,在介绍它之前先介绍另一种算...

  • 字符串排序

    键索引排序法 键索引排序法主要用来解决分组排序的问题。例如:一个班级有分为三个组,每个组编号1~3。 需要对以上学...

  • mysql(15)

    主键、外键和索引的区别? 主键,外键和索引的区别如下表: |主键|外键|索引|------|-----|----|...

  • 字符串算法一:排序(键索引计数法、LSD、MSD)

    最近有点空闲时间了,在啃 Sedgwick 的 Algorithm 这本经典算法书,前面的以前就会,最后一张字符串...

  • 程序员的数学-读书笔记

    第1章 0的故事 计数法分为按位计数法和罗马计数法按位计数法常用的有2进制、8进制、10进制、16进制等几种。 理...

  • 各种关键字的区别与使用

    assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释...

  • OC中assign、copy 、retain等关键字的含义

    assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释...

网友评论

      本文标题:键索引计数法

      本文链接:https://www.haomeiwen.com/subject/ikamyxtx.html