Pigeonhole 在Java中最简单的实现是什么?一组数组列表是理想的,但如果想要保持类型安全,Java会使这很困难。可以使用数组数组或数组列表的数组列表,但有点尴尬。我想知道是否有一个关于什么数据结构最好的一般建议。
答案 0 :(得分:2)
首先,如果要实现鸽笼排序的理论计算复杂度,则应使用LinkedList<T>
而不是ArrayList<T>
。许多人忘记ArrayList<T>
中插入的摊销成本是 O(log n) n 中的元素数量清单。
正如您所指出的,创建通用( - 依赖)类型的数组存在问题。但是你可以使用this answer来解决这个问题。
所以说n
是键的数量而f
是计算键的函数(映射到0
和{{1}之间的整数我们要对其进行排序,然后 Java 8 (带函数式编程)中的(内联排序)算法如下所示:
n-1
您可以使用以下命令运行此代码:
public static<T> void pigeonholeSort (T[] tosort, Function<T,Integer> f, int n) {
LinkedList<T>[] holes = (LinkedList<T>[]) new LinkedList[n];
for(int i = 0; i < n; i++) {
holes[i] = new LinkedList<T>();
}
for(T t : tosort) {
holes[f.apply(t)].add(t);
}
for(int i = 0, j = 0; i < n; i++) {
for(T t : holes[i]) {
tosort[j++] = t;
}
}
}
(条件是你只使用以大写罗马字母开头的字符串)。