首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >低效的存储桶排序?

低效的存储桶排序?
EN

Stack Overflow用户
提问于 2015-11-09 09:54:29
回答 2查看 92关注 0票数 0

我正在尝试使用桶排序算法对字符串进行排序。这个任务说运行时间应该是0.05秒,但我的运行时间超过9秒。为什么我的运行时间这么长,我怎么才能让它更快。它在文件中有大约90000个名字。我是否正确地进行了存储桶排序?

代码语言:javascript
复制
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;
      }
    }
EN

回答 2

Stack Overflow用户

发布于 2015-11-09 10:03:11

您的代码很可能很慢,因为它所做的事情在Java语言中可能非常低效:String值是不可变的,因此每次连接都会创建一个完整的新字符串。

您应该使用支持存储桶有效追加的数据类型。出现在脑海中的两个选项是StringBuilderLinkedList<String>。(当我最后一次每天使用Java时,后者可能会更好,现在可能仍然如此。)

票数 0
EN

Stack Overflow用户

发布于 2015-11-09 10:21:48

正如其他人所说,由于字符串连接,这是低效的。

一个很好的经验法则:

当你在一个循环中发现自己连接的字符串时,最好使用一个 StringBuilder**.**

请参阅:When to use StringBuilder in Java

这段代码应该会提供您所期望的性能:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33601351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档