gpt4 book ai didi

java - 为什么我的 O(NLogN) 查找字谜算法比我的 O(N) 算法运行得更快?

转载 作者:行者123 更新时间:2023-12-01 12:01:04 25 4
gpt4 key购买 nike

我有一个长度相同的单词哈希集。我想找到此哈希集中存在的所有字谜并将它们收集到另一个称为字谜的哈希集中。这是执行此操作的循环:

public HashSet<String> getUniqueAnagramsSlow(HashSet<String> paddedWords, int areAnagramsVersion){
HashSet<String> anagrams = new HashSet<String>();
Object[] paddedWordsArr = paddedWords.toArray();
for(int i = 0; i < paddedWordsArr.length-1; i++){
boolean foundAnagram = false;
String wordOne = (String) paddedWordsArr[i];
if(!anagrams.contains(wordOne))
for(int j = i+1; j < paddedWordsArr.length; j++){
String wordTwo = (String) paddedWordsArr[j];
if(areAnagrams(wordOne, wordTwo, areAnagramsVersion)){
foundAnagram = true;
anagrams.add(wordTwo);
}
}
if(foundAnagram){
anagrams.add(wordOne);
}
}
return anagrams;
}

我编写此代码的目标是了解不同的 areAnagram() 函数如何影响运行时间。我写了两个版本的 areAnagrams()。一种对两个字符串进行排序并比较它们,另一种使用 HashMap 来比较字符频率。它们在这里:

public boolean areAnagramsVersionOne(String first, String second){
char[] arr1 = first.toCharArray();
Arrays.sort(arr1);
String fSorted = new String( arr1 );
char[] arr2 = second.toCharArray();
Arrays.sort(arr2);
String sSorted = new String(arr2);
return fSorted.equals(sSorted);
}
public boolean areAnagramsVersionTwo(String first, String second){
HashMap<String, Integer> wordOne = new HashMap<String,Integer>();
for(int i = 0; i < first.length(); i++){
String letOne = first.substring(i, i+1);
if(wordOne.containsKey(letOne)){
int letOneFreq = wordOne.get(letOne);
wordOne.put(letOne, letOneFreq + 1);
}else{
wordOne.put(letOne, 1);
}
}
for(int i = 0; i < second.length(); i++){
String letTwo = second.substring(i, i+1);
if(!wordOne.containsKey(letTwo))
return false;
int freq = wordOne.get(letTwo);
if(freq == 0)
return false;
wordOne.put(letTwo, freq-1);
}
return true;
}

根据我的理解,areAnagramsVersionOne() 将在 NlogN 时间内运行,而 areAnagramsVersionTwo() 将在 N 时间内运行。然而,当我在原始循环中测试这两个版本的查找字谜词时,版本二明显较慢。这是为什么?

谢谢。

这是我如何测试运行时间的示例:

long startTime = System.currentTimeMillis();
getUniqueAnagramsSlow(words, 2);
long endTime = System.currentTimeMillis();
System.out.println("exec time: " + (endTime - startTime) );

最佳答案

据我所知,仅当 N 值足够大时,O(NlogN) 才保证大于 O(N),因为在较小值时,未以 O() 表示法表示的系数和常数仍然相关。考虑两种算法,其成本为:

算法1成本:100*N:O(N)

算法2成本:10*NlogN: O(NlogN)

O(NlogN) > O(N) => 10*NlogN > 100*N => 10*logN > 100 => logN > 10

因此,在这种情况下,当 N > 2^10 时,算法 2 的成本将高于算法 1。对于较小的值,算法 2 的成本会较低,即使根据 O() 表示法它“效率较低”。

阅读the wikipedia page for O() notation了解更多详情。

关于java - 为什么我的 O(NLogN) 查找字谜算法比我的 O(N) 算法运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com