我嘗試了一些解決方案使用集,並取得每一個運行1000萬次使用您的示例性陣列來測試:
private static String[] input = {"tea", "ate", "eat", "apple", "java", "vaja", "cut", "utc"};
首先,我使用的方法來調用這些algotirhms:
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
for (int x = 0; x < 10000000; x++) {
Set<String> confirmedAnagrams = new HashSet<>();
for (int i = 0; i < (input.length/2) + 1; i++) {
if (!confirmedAnagrams.contains(input[i])) {
for (int j = i + 1; j < input.length; j++) {
if (isAnagrams1(input[i], input[j])) {
confirmedAnagrams.add(input[i]);
confirmedAnagrams.add(input[j]);
}
}
}
}
output = confirmedAnagrams.toArray(new String[confirmedAnagrams.size()]);
}
long endTime = System.currentTimeMillis();
System.out.println("Total time: " + (endTime - startTime));
System.out.println("Average time: " + ((endTime - startTime)/10000000D));
}
然後我使用基於HashSet字符的算法。我將每個單詞的每個字符添加到HashSet中,並且如果HashSet不是單詞首字母的長度,那將意味着它們不是字形。
我的算法及其運行時間:
算法1:
private static boolean isAnagrams1(String x, String y) {
if (x.length() != y.length()) {
return false;
} else if (x.equals(y)) {
return true;
}
Set<Character> anagramSet = new HashSet<>();
for (int i = 0; i < x.length(); i++) {
anagramSet.add(x.charAt(i));
anagramSet.add(y.charAt(i));
}
return anagramSet.size() != x.length();
}
這樣做的運行時:
Total time: 6914
Average time: 6.914E-4
算法2
private static boolean isAnagrams2(String x, String y) {
if (x.length() != y.length()) {
return false;
} else if (x.equals(y)) {
return true;
}
Set<Character> anagramSet = new HashSet<>();
char[] xAr = x.toCharArray();
char[] yAr = y.toCharArray();
for (int i = 0; i < xAr.length; i++) {
anagramSet.add(xAr[i]);
anagramSet.add(yAr[i]);
}
return anagramSet.size() != x.length();
}
擁有的運行時間:
Total time: 8752
Average time: 8.752E-4
算法3
對於這個算法,我決定通過發送集,所以我只有一次創建它的每一個週期,每個後清除測試。
private static boolean isAnagrams3(Set<Character> anagramSet, String x, String y) {
if (x.length() != y.length()) {
return false;
} else if (x.equals(y)) {
return true;
}
for (int i = 0; i < x.length(); i++) {
anagramSet.add(x.charAt(i));
anagramSet.add(y.charAt(i));
}
return anagramSet.size() != x.length();
}
擁有的運行時間:
Total time: 8251
Average time: 8.251E-4
算法4
這種算法不是我的,它屬於Pratik Upacharya
該回答的問題還有,爲了讓我比較:
private static boolean isAnagrams4(String stringOne, String stringTwo) {
char[] first = stringOne.toLowerCase().toCharArray();
char[] second = stringTwo.toLowerCase().toCharArray();
// if length of strings is not same
if (first.length != second.length) {
return false;
}
int[] counts = new int[26];
for (int i = 0; i < first.length; i++) {
counts[first[i] - 97]++;
counts[second[i] - 97]--;
}
for (int i = 0; i < 26; i++) {
if (counts[i] != 0) {
return false;
}
}
return true;
}
has t他運行時的:
Total time: 5707
Average time: 5.707E-4
當然,這些運行時做每個測試運行不同,爲了做正確的測試,一個更大的示例設置是必要的,也許更多的迭代上。
*編輯,正如我在最初的方法犯了一個錯誤,Pratik Upacharya's
算法似乎是一個更快的
相反的轉換'的char []'回'String',然後做'的charAt()',你可以直接比較數組中的字符。 – QBrute
這是令人困惑的。你只需要anagrams或任何排列?檢查一個或另一個的方法是完全不同的。 – fge
我很確定第二個解決方案不起作用。它將返回真'交流'和'bb' –