Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找给定单词中字符的重复次数_Java_Performance_Algorithm_Hashmap - Fatal编程技术网

Java 查找给定单词中字符的重复次数

Java 查找给定单词中字符的重复次数,java,performance,algorithm,hashmap,Java,Performance,Algorithm,Hashmap,所以我在开发一种算法来计算给定单词中每个字符的重复次数。我使用的是HashMap,我将每个唯一字符添加到HashMap中作为键,值是重复次数。我想知道我的解决方案的运行时间是多少,是否有更有效的方法来解决这个问题 代码如下: public static void getCount(String name){ public HashMap<String, Integer> names = new HashMap<String, Integer>() ;

所以我在开发一种算法来计算给定单词中每个字符的重复次数。我使用的是
HashMap
,我将每个唯一字符添加到
HashMap
中作为键,值是重复次数。我想知道我的解决方案的运行时间是多少,是否有更有效的方法来解决这个问题

代码如下:

public static void getCount(String name){
        public HashMap<String, Integer> names = new HashMap<String, Integer>() ;
        for(int i =0; i<name.length(); i++){

            if(names.containsKey(name.substring(i, i+1))){
                names.put(name.substring(i, i+1), names.get(name.substring(i, i+1)) +1);
            }
            else{
                names.put(name.substring(i, i+1), 1);
            }
        }

        Set<String> a = names.keySet();
        Iterator i = a.iterator();

        while(i.hasNext()){
            String t = (String) i.next();
            System.out.println(t + " Ocurred " + names.get(t) + " times");
        }
    }
publicstaticvoidgetcount(字符串名){
public HashMap name=new HashMap();

对于(int i=0;i将初始时间存储到变量,如下所示:

long start = System.currentTimeMillis();
然后在结束时,当您完成时,打印出当前时间减去开始时间:

System.out.println((System.currentTimeMillis() - start) + "ms taken");
查看执行此操作所需的时间。据我所知,这是最有效的方法,但可能还有另一个好方法。此外,对每个字符使用char而不是字符串(因为char/character是字符的最佳类,字符串是一系列字符的最佳类),然后执行
name.charAt(I)
而不是
name.substring(i,i+1)
并将hashmap更改为hashmap

从算法角度来看,您的解决方案是O(n),这已经是最佳的(至少您必须至少检查整个字符串中的每个字符一次,即O(n))

但是,有两种方法可以加快它的速度,即减少固定的开销,例如

  • 使用
    HashMap
    。字符将比长度为1的字符串更有效
  • 使用
    charAt(i)
    而不是
    substring(i,i+1)
    。这样可以避免创建一个新字符串,这将对您有很大帮助。这可能是您所能做的最大改进
  • 如果字符串要长(例如数千个字符或更多),考虑使用<代码> INT[]/COS>数组来计算单个字符而不是哈希表,其中字符的ASCII值用作数组中的索引。如果字符串短,这不是一个好主意。

该算法的时间复杂度为
O(n)
,但我会更改实现的某些部分,即:

  • 使用单个
    get()
    而不是
    containsKey()
    +
    get()
  • 使用
    charAt()
    而不是
    substring()
    ,这将创建一个新的
    String
    对象
  • 使用
    映射
    而不是
    映射
    ,因为您只关心单个字符,而不关心整个
    字符串
换言之:

public static void getCount(String name) {
    Map<Character, Integer> names = new HashMap<Character, Integer>();
    for(int i = 0; i < name.length(); i++) {
        char c = name.charAt(i);
        Integer count = names.get(c);
        if (count == null) {
            count = 0;
        }
        names.put(c, count + 1);
    }
    Set<Character> a = names.keySet();
    for (Character t : a) {
        System.out.println(t + " Ocurred " + names.get(t) + " times");
    }
}
publicstaticvoidgetcount(字符串名){
映射名称=新的HashMap();
对于(int i=0;i
String s=“好”

//收集不同的唯一字符
ArrayList temp=新的ArrayList();
对于(int i=0;i
这是家庭作业吗?我认为Java有一种计算字符的方法吗?不,这不是家庭作业。我在看一些面试问题时遇到了这个问题。它应该不区分大小写吗?a和a应该被视为相同或不同的字符吗?在运行时,我的意思是如果它是n,nlogn,n^2等等,那么它不是实际的运行时间。@RoddyoffrozenPeas修复了,忘记了它被解析为空(HTML标签)@AlexColeman 1-你打败了我,2.澄清是一个讨厌的词,我不应该在这里使用:P@RaghavShankar啊,好吧,我想它应该是n,但不完全确定,所以不要引用我的话,你怎么说它是O(n)?在循环中我有HashMap.put()、HashMap.containsKey()和HashMap.get()。我猜get()和containsKey()函数的运行时都是O(n),所以当循环重复n次时,程序的运行时不是O(n^2)?@raghashankar您真的不应该使用2个调用(参见Joao的帖子)get、put和containsKey在HashMap上都是O(1)(这是HashMap得到如此广泛使用的主要原因之一!)因此,将这n次组合起来仍然是O(n)。你确定它是O(1)吗?我假设它是O(n)是的,非常确定它是O(1)!(假设记账是摊销的,并且HashMap保持在合理的容量,这在Java实现中通常是正确的)-乍一看,我以为他已经多次使用get,但意识到他没有,所以放弃了整个优化,但没有考虑容器问题。即使我只使用一次get(),get()的运行时不是O(n)吗?因此如果是这样,那么如果循环重复n次,它的运行时将是O(n^2)@RaghavShankar:不,
get()
是常数时间
O(1)
,因为您使用的是
HashMap
。哦,好的。有什么书或网站可以让我在java库中找到不同函数的运行时吗?比如get()和add()用于LinkedList和ArrayList的函数以及与java库中内置数据结构相关联的其他函数并不专门用于java API中的方法。但是java集合往往实现非常著名的算法,这些算法可以在一本好的算法书籍中找到,如《算法简介》(Cormen et al.)类的一些javadoc还提供其操作的运行时
    //collect different unique characters 

    ArrayList<String> temp=new ArrayList<>();
    for (int i = 0; i < s.length(); i++) {
        char c=s.charAt(i);
        if(!temp.contains(""+c))
        {
            temp.add(""+s.charAt(i));

        }

    }

    System.out.println(temp);
    //get count of each occurrence in the string
    for (int i = 0; i < temp.size(); i++) {
        int count=0;
        for (int j = 0; j < s.length(); j++) {

            if(temp.get(i).equals(s.charAt(j)+"")){

                count++;
            }
        }
        System.out.println("Occurance of "+ temp.get(i) + " is "+ count+ " times" );
    }*/