搜索重复字符串的复杂性

问题描述:

我有一个任务来查找重复的元素,并写一个方法来返回一个布尔值。搜索重复字符串的复杂性

下面的代码是我所拥有的。

import java.util.ArrayList; 
import java.util.List; 

public class DuplicateEle { 
    public static void main(String args[]) { 
     String[] arr = { "hello", "hi", "hello", "howru" }; 
     DuplicateEle de = new DuplicateEle(); 
     for (int i = 0; i < arr.length; i++) { 
      boolean isDup = de.isDuplicate(arr[i]); 
      System.out.println(arr[i]+" is duplicate :" +isDup); 
     } 
    } 

    List<String> dList = new ArrayList<String>(); 

    private boolean isDuplicate(String str) { 
     boolean isDup = false; 
     if (dList.contains(str)) { 
      isDup = true; 
     } else 
      dList.add(str); 
     return isDup; 
    } 

} 

它按预期工作。 输出:

hello is duplicate :false 
hi is duplicate :false 
hello is duplicate :true 
howru is duplicate :false 

我想找到上述代码的时间复杂性。我正在寻找关于如何工作的时间复杂性的教程,如one

有人可以给我关于上述代码的意见,并帮助我了解时间复杂性如何工作吗?

预先感谢您!

+0

只是使用你给的链接。他们解释了一切。@lexicore爱的链接:D – sheplu

+0

@lexicore:不知道我是否理解这一点。推理如?关于任务更具体? – lr14

+2

@ lr14你向我们投掷任务,你甚至有一个指导如何做到这一点,然后你要求“投入”和“帮助我理解”。如果有人坐下来帮助你阅读该指南并将其应用于你的任务,你期望什么?不会发生。如果您真的尝试应用您所链接的指南中所写的内容,然后在您的问题中写下您的推理,并询问是否有人可以发现错误,那么您可能会得到一些实际帮助。但现在你只要求我们为你做功课。 – lexicore

你让你的代码方式太复杂了,使用HashSet<String>,这将保证唯一性,并返回元素是否已经在集合中。

public class DuplicateEle { 
    public static void main(String args[]) { 
     Set<String> seen = new HashSet<>(); 
     String[] arr = { "hello", "hi", "hello", "howru" }; 

     for (String word : arr) { 
     boolean unique = seen.add(word); 
     System.out.printf("%s is duplicate: %b%n", word, !unique); 
     } 
    } 
} 

使用HashSet是非常有效的,因为它会使用散列int的字符串,找到桶,才需要使用equals做一个完整的“昂贵”等于。

+0

了解。谢谢 !!你还可以发布一些教程来更好地理解时间复杂性吗? – lr14

可以说,n是要检查的元素的数量,m是最长的单词的大小。所以,你通过一系列元素,并检查每个元素是否在dList中。

在开始时,它是空的,所以随着时间的推移,你添加了元素。所以,问题是,方法contains有多快。如果您查看ArrayList的源代码,您会看到它遍历数组并检查每个元素是否为equal,这是通过从结尾开始检查每个字符来完成的(首先检查它们是否大小相同) 。

所以最坏的情况是所有的元素都是相同的大小,它们在第一个元素上是不同的。因此,在第一个元素中,你什么都不做,所以基本操作计为1.在步骤2中,你做1检查,在步骤3,你做2检查等,并在第n步你做n-1检查包含。所以,你必须:

0+1+2+...+n-1 = n(n-1)/2 

现在,最坏的情况下,每一个元素都是相同的大小,他们在第一要素不同,所以你有大小m的另一个循环。这里,m也可以表示字符串(从结尾)开始的不同char的位置的平均字符串大小或统计期望。

因此,它的O(mn^2),但如果我们说m有一些随机性,我们可以说它的Ω(n^2)

但我对你有个好消息。有更快的方法,通过使用HashSet。你只需要一些HashSet的改变DLIST,并把每个元素在里面,你去通过初步名单,所以检查每个元素将在O(1)来完成,这意味着,总体速度会O(n)

+0

感谢您详细解释Arraylist的时间复杂性。如果有的话,你也可以发布一些复杂的教程链接。 – lr14

+0

那么,你应该首先研究一点数学,准确地说,序列和系列。试试这个https://www.codecademy.com/en/courses/big-o/0/1。它应该给你一些实际的经验来理解算法的复杂性。但是,最好是阅读一些关于这个主题的书籍,因为这是复杂的,并应用了大量的数学,在一些网络教程中被覆盖。我推荐这本书:Steve S. Skiena的“算法设计手册”。 –

+0

这很有帮助。将研究它。谢谢 ! – lr14