habe ich versucht, ein paar Lösungen Sets mit und machte jeden laufen 10 Millionen mal testen Sie Ihr Beispiel Array verwenden:
private static String[] input = {"tea", "ate", "eat", "apple", "java", "vaja", "cut", "utc"};
Erstens i die verwendete Methode nennen diese 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));
}
Ich habe dann Algorithmen basierend auf einem HashSet von Zeichen verwendet. Ich füge jedes Zeichen jedes Wortes zum HashSet hinzu, und sollte das HashSet nicht die Länge der Initialwörter sein, würde es bedeuten, dass es sich nicht um Anagramme handelt.
Meine Algorithmen und deren Laufzeiten:
Algorithmus 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();
}
Dies hat die Laufzeit:
Total time: 6914
Average time: 6.914E-4
Algorithmus 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();
}
hat die Laufzeit von:
Total time: 8752
Average time: 8.752E-4
Algorithmus 3
Für diesen Algorithmus, entschied ich mich durch das Set zu schicken, also einmal für jeden Zyklus, ich es nur schaffen und es nach jedem löschen Prüfung.
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();
}
hat die Laufzeit von:
Total time: 8251
Average time: 8.251E-4
Algorithmus 4
Dieser Algorithmus ist nicht mein, gehört es zu Pratik Upacharya
die auch die Frage beantwortet, für mich, um zu vergleichen :
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;
}
Hat t er Laufzeit:
Total time: 5707
Average time: 5.707E-4
Natürlich ist diese Laufzeiten für jeden Testlauf unterscheiden, und um einen ordnungsgemäße Prüfung zu tun, ein größerer Beispielsatz benötigt wird, und vielleicht mehr Iterationen davon.
* Herausgegeben, wie ich einen Fehler in meinen ersten Verfahren hergestellt, ist Pratik Upacharya's
Algorithmus scheint eine sehr einfache Implementierung die schnellere
Statt der Umwandlung des 'char []' zurück zu 'String' und dann' Sie direkt vergleichen zu tun 'charAt() könnten Zeichen in den Arrays. – QBrute
Das ist verwirrend. Willst du nur Anagramme oder irgendeine Permutation? Die Möglichkeiten, nach dem einen oder dem anderen zu suchen, sind sehr unterschiedlich. – fge
Ich bin mir ziemlich sicher, dass die zweite Lösung nicht funktioniert. Es wird wahr für 'ac' und 'bb' zurückgegeben –