【问题标题】:which of these two implementation is faster and why , to check the strings anagram这两个实现中哪一个更快,为什么,检查字符串字谜
【发布时间】:2014-08-19 22:37:06
【问题描述】:

第一个使用 Arrays.sort

public static void main(String[] args) {
        String s="schoolmaster";
        String s1="theclassroom";

        char a[]=s.toCharArray();
        Arrays.sort(a);
        char a1[]=s1.toCharArray();
        Arrays.sort(a1);
        System.out.println(Arrays.equals(a, a1));


    }

这个使用 hashmap

public static void main(String[] args) {
        String s="murphee";
        String s1="purhmee";

        System.out.println(new Anagram().checkAnagram(s, s1));


    }

    boolean checkAnagram(String s,String s1)
    {
        if(s.length()!=s1.length())
            return false;

        Map<Character,Integer> hs= new HashMap<Character,Integer>();
        char c[]=s.toCharArray();
        for(char cs:c)
        {
            if(hs.containsKey(cs))
            {
                hs.put(cs,hs.get(cs)+1);

            }
            else
                hs.put(cs,0);
        }
        char c1[]=s1.toCharArray();
        for(char cs:c1)
        {
            if(hs.containsKey(cs))
            {
                if(hs.get(cs)!=0)
                hs.put(cs,hs.get(cs)-1);
                else
                hs.remove(cs);
            }
        }
        if(hs.size()==0)
            return true;
        else
            return false;



    }

hashmap的实现是多次调用put和get,不是比Arrays慢...

请帮助我了解复杂性是如何工作的,以及是否有其他更好的方法来查找字谜

【问题讨论】:

    标签: java time-complexity anagram


    【解决方案1】:

    数组实现是 O(n * log n)(如果不是最差的话),因为数组正在排序。
    另一方面,哈希映射的实现是 O(n),因为对哈希映射的每次插入/更改都是 O(1),并且您为每个字符执行此操作 (O(n) * 2 = O(n) )。

    因此,hash map 的实现(理论上)效率更高。 但是请注意,如果您只处理小型数组,情况并非如此。复杂度计算针对的是大输入,而不是小输入。

    【讨论】:

    • 哦,你确定O(1)插入HashMap吗?那是绝对不可能的。正确的复杂度是O(log n),所以最终的复杂度是一样的,但可以肯定的是,对数组进行排序要简单得多,将元素一个接一个地插入HashMap
    • 我确定。查看此以获取更多信息:stackoverflow.com/questions/4553624/hashmap-get-put-complexity。此外,在线检查哈希表的复杂性(这就是 HashMap)。 O(1) 是使用它们的全部原因。你对 O(log n) 是错误的。如果您要投反对票,请提供一些参考资料。这简直是​​在误导他人。
    • 我应该更清楚地解释一下:在 CS 中不可能存在这样的 HashMap,因为这意味着排序算法可以在 O(n) 复杂度中进行评估,并且这一事实被证明是假的。
    • 你又错了,应该认真检查你的 CS 材料。这是来自麻省理工学院的一个关于哈希表的演示文稿(你也不会试图与他们争论,是吗?)。 web.mit.edu/16.070/www/lecture/lecture_18.pdf
    • 没有“破解”,这是哈希表的基本属性。访问操作是 O(1),即 CS 101。另一方面,您提到的双轴快速排序绝对是 O(n * log n),并且是为了减少常规快速排序算法的频率而发明的O(n ^ 2) 在很多情况下。您应该真正审查数据结构的复杂性,请停止通过提供错误信息来误导他人。
    猜你喜欢
    • 2021-06-04
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2019-05-02
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多