关于基数排序的Java实现的解释

时间:2016-02-20 03:04:26

标签: java algorithm sorting radix-sort

我正在阅读和学习基数排序的Java实现,如下所示。如果有人能够澄清pointToindexglobalPtr的逻辑含义,那将会很棒。

https://www.hackerrank.com/challenges/string-similarity/editorial

private void radixSort0() {
    globalPtr = 0;
    Arrays.fill(bucketHead, -1);
    Arrays.fill(next, -1);

    for (int i = 0; i < n; i++) {
        int value = nr0[index[i]];
        if (bucketHead[value] == -1) bucketHead[value] = bucketTail[value] = globalPtr;
        else bucketTail[value] = next[bucketTail[value]] = globalPtr;
        pointTo[globalPtr++] = index[i];
    }

    int ptr = 0;
    for (int i = 0; i < M; i++)
        for (int j = bucketHead[i]; j != -1; j = next[j])
            index[ptr++] = pointTo[j];
}

2 个答案:

答案 0 :(得分:2)

radixSort0()不是完整的基数排序。如果您的目标是了解基数排序,请查看其他地方 在两种(不必要的重复)radixSort方法中,int[] next用于建立单链表 - 使用索引而不是引用,而-1而不是null。 (您可以只将next[some_index_depending_on value]设置为index[i] - 没有列表。)int[] pointTo可能更具描述性地命名为value 。将next&value视为链接列表,在具有两个数组成员类型的实例中表示,作为具有成员next&value的实例数组的替代。 globalPtr是尚未在那个/那些数组中分配的最小索引。

(要遵循的代码中明显缺乏评论是由于我缺乏理解为什么任何人都应该尝试使用这个来构建后缀数组,或者代码片段对这个目标的贡献是什么:随意纠正和修改。)
甚至没有考虑测试,Java的处理方式可能是

private void radixSortStep(int[]nr) {
    List<Integer> value[] = new List[M];
    for (int i = 0; i < value.length; i++)
        value[i] = new ArrayList<Integer>(0);

    for (int i: indexes)
        value[nr[i]].add(i);

    int ptr = 0;
    for (int i = 0; i < M; i++)
        for (int val: value[i])
            indexes[ptr++] = val;
}

(有一点关于M(设置为n + 1)和nr1(初始化条目未从等级复制到n,而不是-1)) / p>

答案 1 :(得分:1)

import java.io.*;
import java.util.*;

public class St {
    public static int calculate(String s){
        char[]arr=s.toCharArray();
        int length=arr.length;
        int count=length;
        for(int i=1;i<length;i++){
            int len=length-i;
            int j=0;
            for(;j<len;j++)
                if(arr[j]!=arr[j+i]){
                    break;
                }
            count+=j;
        }
        return count;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner( System.in );
        int n=scanner.nextInt();
        for(int i=0;i<n;i++){
            String s=scanner.next();
            System.out.println(calculate(s));
        }
    }
}

它几乎通过了所有的测试用例,除了最后两个,因为超时希望我的工作有助于编码...