Java 低效桶式分拣?
我正在尝试使用bucket排序算法对字符串进行排序。任务说运行时间应该在0.05秒左右,但我的运行时间超过了9秒。为什么我的要花这么长时间,我怎样才能让它更快。文件中大约有90000个名字。我是否正确地进行桶排序Java 低效桶式分拣?,java,bucket-sort,Java,Bucket Sort,我正在尝试使用bucket排序算法对字符串进行排序。任务说运行时间应该在0.05秒左右,但我的运行时间超过了9秒。为什么我的要花这么长时间,我怎样才能让它更快。文件中大约有90000个名字。我是否正确地进行桶排序 public static void bucketSortByLength() { String[] bucket = new String[14]; String[] insideBucket; int index = 0; for(i
public static void bucketSortByLength() {
String[] bucket = new String[14];
String[] insideBucket;
int index = 0;
for(int i = 0; i <= 13; i++)
bucket[i] = "";
for(int i = 0; i < numNames; i++)
bucket[names[i].length()] += names[i] + " ";
for(int i = 0; i <= 13; i++){
insideBucket = bucket[i].split("\\s+");
for(String s : insideBucket)
names[index++] = s;
}
}
公共静态无效bucketSortByLength(){
字符串[]桶=新字符串[14];
字符串[]在包内;
int指数=0;
对于(int i=0;i您的代码可能很慢,因为它在Java中执行的某些操作可能非常低效:String
值是不可变的,因此每次串联都会创建一个全新的字符串
您应该使用支持有效附加的数据类型作为存储桶。我想到的两个选项是StringBuilder
和LinkedList
(当我上次每天使用Java时,后者会更好,现在可能仍然是。)正如其他人所说,由于字符串连接,这是低效的
好的经验法则:
每当您在循环中发现自连接字符串时,最好使用StringBuilder
见:
此代码应提供您期望的性能:
public static void bucketSortByLength() {
StringBuilder[] bucket = new StringBuilder[14];
int index = 0;
for(int i = 0; i <= 13; i++)
bucket[i] = new StringBuilder();
for(int i = 0; i < numNames; i++)
bucket[names[i].length()].append(names[i]).append(' ');
for(int i = 0; i <= 13; i++){
String[] insideBucket = bucket[i].toString().split("\\s+");
for(String s : insideBucket)
names[index++] = s;
}
}
公共静态无效bucketSortByLength(){
StringBuilder[]bucket=新StringBuilder[14];
int指数=0;
对于(int i=0;i重复串联会降低性能。使用StringBuilder
。此外,根据任务的不同,所需的结果可能不是14个串联字符串,而是一个String[][]
(或者更好,ArrayList
)。在这种情况下,我不能使用StringBuilder(对我可以/不能使用的内容的限制),但这是一个很好的建议。考虑到每个bucket只存储一组字符串,而bucket id只是它的索引,我不明白如何实现字符串[][],您能详细说明一下吗?您的bucket是一个字符串(“abc”
),而不是一组字符串。使用字符串[]
,它实际上可能是一组字符串({“a”、“B”、“C”}
)。除非您对“排序”的定义与我的不同,否则此代码似乎不会对字符串进行排序。您是否应该只按长度排序,而不考虑将它们按字母顺序(按字典顺序)排序顺序?如果是这样,请编辑您的问题并澄清。如果您应该将字符串按顺序排列,那么您的方法是完全错误的。此外,如果对您可以或不能使用的内容有任何限制,请在问题中指定这些限制。成功了!完成了0.04!谢谢大家!